文章目錄
見面試官前,掏出來看看系列
本系列旨在爲面試者見到面試官之前打發無聊時間之用
緩解面試者見到面試官之前,因爲緊張而頭腦一片空白又想看點知識點來提高安全感之用
數據庫原理
SQL語言
數據查詢語句
- select
- 選擇符合條件的語句
- select * from table where 條件語句
- 選擇符合條件的語句
數據操作語句(DML)
- insert
- 插入一條記錄
- insert into table(字段1 ,字段2)values(值1,值2)
- 插入一條記錄
- update
- 更新語句
- update table set 字段名 = 字段值 where 條件表達式
- 更新語句
- delete
- 刪除記錄(可恢復)
- delete from table where 條件表達式
- 刪除記錄(可恢復)
數據定義語句(DDL)
- 對數據庫用戶用戶、基本表、視圖、索引進行定義和撤銷。
- truncate
- 清空表數據(不可恢復)
- truncate table 表名
- 清空表數據(不可恢復)
- create
- 數據表的建立
- create table tablename(字段1,字段2)
- 數據表的建立
- drop
- 數據表的刪除
- drop table tablename
- 數據表的刪除
數據控制語句(DCL)
- 對數據庫進行統一控制管理,保證數據在多用戶共享的情況下能夠安全。
- grant
- 爲用戶授權系統權限
- Grant <權限> on 表名[(列名)] to 用戶 With grant option
- GRANT <權限> ON <數據對象> FROM <數據庫用戶>
-
- 數據對象可以是表名或列名
- 爲用戶授權系統權限
- 權限表示對錶的操作,如select,update,insert,delete
- revoke
- 收回系統權限
- REVOKE <權限> ON <數據對象> FROM <數據庫用戶名>
- 收回系統權限
內連接&外連接
內連接(自然連接)
- 只顯示符合條件的記錄
- 選取兩個表中所有匹配的數據,捨棄不匹配的數據
- select fieldlist from table1 [inner] join table2 on table1.column = table2.column
外連接
- 除了顯示符合條件的記錄,還顯示錶中的記錄
(例如:使用左外連接,還顯示左表中的記錄) - 左外連接
- LEFT OUTER JOIN
- 右外連接
- RIGHT OUTER JOIN
- 全外連接
- FULL OUTER JOIN
事務
- 事務是數據庫中一個單獨的執行單元(Unit)
- 當前數據庫中更改數據成功時,在事務中更改的數據便會提交。否則,事務就取消或者回滾,更改無效。
事務必須滿足四個屬性:
原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability),即ACID四個屬性
原子性
- 當數據修改時,要麼全執行,要麼全不執行
一致性
- 一個事務執行之前和執行之後,數據庫數據必須保持一致性狀態
- 由於併發操作帶來的數據不一致性包括丟失數據修改、讀“髒”數據、不可重複讀和產生“幽靈”數據
隔離性(獨立性)
- 當兩個或多個事務併發執行時,爲了保證數據的安全性,將一個事務內部的操作與事務的操作隔離起來,對其他食物都是不可見的
- 數據庫四種類型的事務隔離級別
- 不提交的讀
- 提交的讀
- 可重複的讀
- 串行化
- 實現隔離性時解決臨時更新與消除級聯回滾問題的一種方式
持久性
- 事務完成以後,數據庫管理系統(DBMS)保證他對數據庫中的數據的修改時永久性的,當系統或介質發生故障時,該修改也永久保持
- COMMIT語句
- 事務啓動後,對數據庫所作的所喲更改都成爲永久性的了(寫入磁盤)
- ROLLBACK語句
- 事務啓動後,對數據庫的所有更改都會被撤銷(數據庫中的內容返回事務開始之前所處的狀態)
存儲過程
- 一組爲了完成特定功能的SQL 語句集,它存儲在數據庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它
create procedure sp_name @ [參數名] [類型]
as
begin
......
end
調用存儲過程語法:exec sp_name[參數名]
刪除存儲過程語法:drop procedure sp_name
- 存儲過程可以使沒有權限的用戶在控制之下間接的存取數據庫,保證了數據的安全
存儲過程&函數區別和聯繫
- 存儲過程作爲一個獨立的部分來執行,而函數可以作爲查詢語句的一部分調用
- 存儲過程的功能複雜,而函數的功能針對性強
- 存儲過程可以返回多個參數,而函數只能返回一個值或對象
- 函數不能直接操作實體表,只能操作內建表
- 存儲過程在創建時即在服務器上進行了編譯,執行速度比較快
範式
目的:
- 減少數據庫中的冗餘,以增加數據的一致性。
第一範式(1NF)
- 屬性值不能在分裂成更小部分
第二範式(2NF)
- 滿足第1NF的同時,數據庫中的每一個實例或行必須被唯一的區分
第三範式(3NF)
- 滿足2NF的同時,非主鍵字段不能互相依賴
鮑依斯-科得範式(BCNF)
假設倉庫管理關係表爲(倉庫ID, 存儲物品ID, 管理員ID, 數量),滿足一個管理員只在一個倉庫工作;一個倉庫可以存儲多種物品。這個數據庫表中存在如下決定關係:
(倉庫ID, 存儲物品ID) →(管理員ID, 數量)
(管理員ID, 存儲物品ID) → (倉庫ID, 數量)
所以,(倉庫ID, 存儲物品ID)和(管理員ID, 存儲物品ID)都是倉庫管理關係表的的候選關鍵字,表中的唯一非關鍵字段爲數量,它是符合第三範式的。但是,由於存在如下決定關係:
(倉庫ID) → (管理員ID)
(管理員ID) → (倉庫ID)
即存在關鍵字段決定關鍵字段的情況,所以其不符合BCNF範式。把倉庫管理關係表分解爲二個關係表:
倉庫管理:(倉庫ID, 管理員ID)
倉庫:(倉庫ID, 存儲物品ID, 數量)
這樣的數據庫表是符合BCNF範式的。
- 所有非主屬性對每一個碼都是完全函數依賴
- 所有的主屬性對每一個不包含它的碼,也是完全函數依賴
- 沒有任何屬性完全函數依賴於非碼的任何一組屬性
第四範式(4NF)
職工表(職工編號,職工孩子姓名,職工選修課程)
在這個表中同一個職工可能會有多個職工孩子的姓名,同樣,同一個職工也可能會有多個職工選修課程,所以這裏存在着多值事實,不符合第四範式。
將職工表分爲兩個表,使它們只有一個多值事實
職工表一(職工編號,職工孩子姓名)
職工表二(職工編號,職工選修課程)
兩個表都只有一個多值事實,所以符合第四範式
- 把同一表內的多對多關係刪除
觸發器
- 觸發器是一種特殊類型的存儲過程
- 由事件觸發,自動完成SQL語句
- 使用觸發器可以保證數據的有效性和完整性,完成比約束更復雜的數據約束
觸發器&存儲過程的區別
- 觸發器當操作DML語句時隱式的調用,而存儲過程從一個應用或過程中顯示調用
- 在觸發器體內禁止使用COMMIT和ROLLBACK語句
- 觸發器不能接受參數輸入,而存儲過程可以接受參數輸入
DML觸發器
- After觸發器
- 記錄改變之後進行的一種觸發器
- InsteadOf觸發器
- 記錄改變之前,執行觸發器本身定義的操作
DDL觸發器
- 響應數據定義語句事件時執行的存儲過程
事前觸發&事後觸發
- 事前觸發:用於驗證一些條件或進行一些準備工作,獲得之前和新的字段值
- 事後觸發:收尾工作,保證事務的完整性
語句級觸發&行級觸發
- 語句級觸發:在語句執行之前或之後執行
- 行級觸發:在觸發器影響的行觸發一次
視圖
- 從數據的基本表中選取出來的數據組成的邏輯窗口。與基本表不同,它是個虛表
作用
-
可以簡化數據查詢語句
-
可以使用戶能從多角度看待同一數據
-
通過引入視圖可以提高數據的安全性
-
視圖提供了一定程度的邏輯獨立性
-
定義視圖可以將表與表之間的複雜的操作連接和搜索條件對用戶不可見,故增強了數據的安全性,但不能提高查詢的效率
union和union all 的區別
union:
- 對兩個結果集進行並集操作,不包括重複行,同時進行默認規則的排序
union all:
- 對兩個結果集進行並集操作,包括重複行,不進行排序;
union all 要比 union 操作快
日誌文件
-
記錄數據庫,故障發生以及恢復數據的信息
-
每一個數據庫至少包含兩個日誌文件組。每個日誌文件組至少包含兩個日誌文件成員
-
日誌文件組以循環方式進行寫操作
-
每一個日誌文件對應一個物理文件
-
【注意】:如果數據庫中的日誌滿了,就只能執行查詢等讀操作,不能執行更改,備份等寫操作
遊標
- 從包含多條數據記錄的結果集中每次提取一條記錄
- 遊標由結果集和結果集中指向特定記錄的遊標位置組成的
優點
- 在使用遊標的表中,對行提供刪除和更新的功能
- 遊標將面向集合的數據庫管理系統和麪向行的程序設計連接了起來