# 數據庫基礎
## 數據庫基本操作
### 創建數據庫
> creat DATABASE xxxxxx
### 刪除數據庫
> drop DATABASE xxxxxx
### 選擇數據庫
> use xxxxxx
### 創建表
> CREATE TABLE table_name (column_name column_type);
### 刪除表
> DROP TABLE table_name ;
## 視圖
視圖(子查詢):是從一個或多個表導出的虛擬的表,其內容由查詢定義。具有普通表的結構,但是不實現數據存儲。
對視圖的修改:單表視圖一般用于查詢和修改,會改變基本表的數據,
多表視圖一般用于查詢,不會改變基本表的數據。
> ```
> --創建視圖--
> create or replace view v_student as select * from student;
> --從視圖中檢索數據--
> select * from v_student;
> --刪除視圖--
> drop view v_student;
> ```
>
> 視圖的作用:
>
> > ①簡化了操作,把經常使用的數據定義為視圖。
> >
> > ? 我們在使用查詢時,在很多時候我們要使用聚合函數,同時還要 顯示其它字段的信息,可能還會需要關聯到其它表,這時寫的語句可能會很長,如果這個動作頻繁發生的話,我們可以創建視圖,這以后,我們只需要select * from view就可以啦,這樣很方便。
> >
> > ②安全性,用戶只能查詢和修改能看到的數據。
> >
> > ? 因為視圖是虛擬的,物理上是不存在的,只是存儲了數據的集合,我們可以將基表中重要的字段信息,可以不通過視圖給用戶,視圖是動態的數據的集合,數據是隨著基表的更新而更新。同時,用戶對視圖不可以隨意的更改和刪除,可以保證數據的安全性。
> >
> > ③邏輯上的獨立性,屏蔽了真實表的結構帶來的影響。
> >
> > 視圖可以使應用程序和數據庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之后,程序可以建立在視圖之上,從而程序與數據庫表被視圖分割開來。
>
> 視圖的缺點:
>
> > ①性能差
> > 數據庫必須把視圖查詢轉化成對基本表的查詢,如果這個視圖是由一個復雜的多表查詢所定義,那么,即使是視圖的一個簡單查詢,數據庫也要把它變成一個復雜的結合體,需要花費一定的時間。
> >
> > ②修改限制
> > 當用戶試圖修改視圖的某些信息時,數據庫必須把它轉化為對基本表的某些信息的修改,對于簡單的視圖來說,這是很方便的,但是,對于比較復雜的試圖,可能是不可修改的。
>
> 綜合視圖的優缺點,在定義數據庫對象時,不能不加選擇地來定義視圖,應該權衡視圖的優點和缺點,合理地定義視圖。
## 函數
### Sql內建函數
> Sql中有許多已經定義好,可以直接使用的函數。
>
> 詳見SQL基礎
### 自定義函數
> 語法:
>
> ```
> CREATE FUNCTION F_GONGHAO(@XINGMING NVARCHAR(5))
> RETURNS INT
> AS
> BEGIN
> DECLARE @GONGHAO INT
> SET @GONGHAO =(SELECT Y.工號 FROM[T_員工信息] AS Y WHERE Y.姓名 =@XINGMING )
> RETURN @GONGHAO
> END
> ```
自定義函數分為 標量函數/內聯表值函數/多語句表值函數
> 共同點:
>
> > 創建定義相同
>
> 不同點:
>
> > 標量函數返回的是一個數據類型值,內聯表值函數返回的是一個table,而多語句返回的是一個table的變量
> >
> > 標量函數和多語句函數都是要有begin……end,內聯表值函數就沒有;
> >
> > 標量函數要寫成在dbo,function_name;
## 事務
### 一般來說,事務必須滿足4個條件(ACID):
> - **原子性(**A**tomicity):**一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
> - **一致性(**C**onsistency):**在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
> - **隔離性(**I**solation):**數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
> - **持久性(**D**urability):**事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
### 事務控制
> - BEGIN 或 START TRANSACTION 顯式地開啟一個事務;
> - COMMIT 也可以使用 COMMIT WORK,不過二者是等價的。COMMIT 會提交事務,并使已對數據庫進行的所有修改成為永久性的;
> - ROLLBACK 也可以使用 ROLLBACK WORK,不過二者是等價的。回滾會結束用戶的事務,并撤銷正在進行的所有未提交的修改;
> - SAVEPOINT identifier,SAVEPOINT 允許在事務中創建一個保存點,一個事務中可以有多個 SAVEPOINT;
> - RELEASE SAVEPOINT identifier 刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;
> - ROLLBACK TO identifier 把事務回滾到標記點;
> - SET TRANSACTION 用來設置事務的隔離級別。InnoDB 存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
### 事務處理
> 1、用 BEGIN, ROLLBACK, COMMIT來實現
>
> - **BEGIN** 開始一個事務
> - **SAVEPOINT** 創建一個保存點
> - **ROLLBACK** 事務回滾
> - **COMMIT** 事務確認
>
> 2、直接用 SET 來改變 MySQL 的自動提交模式:
>
> - **SET AUTOCOMMIT=0** 禁止自動提交
>
> - **SET AUTOCOMMIT=1** 開啟自動提交
>
> > *在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句后就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。*