1. 併發控制:數據庫
不管什麼時候,只要有多個查詢須要在同一時刻修改數據,都會產生併發控制問題。在處理併發讀或者寫時,能夠經過實現一個由兩種類型的鎖組成的鎖系統來解決問題。這兩種鎖叫作共享鎖和排他鎖。也叫讀鎖和寫鎖。讀鎖是共享的,寫鎖則是排他的。服務器
鎖粒度: 任什麼時候候,在給定的資源上,鎖定的數據量越少,則系統的併發程度越高,只要相互之間不發生衝突便可。表鎖是MySQL中最基本的鎖策略,而且是開銷最小的策略,它會鎖定整張表。行級鎖能夠最大程度地支持併發處理,同時也帶來了最大的鎖開銷。併發
2. 事務:數據庫設計
事務是一組原子性的SQL查詢,或者說是一個獨立的工做單元。若是數據庫引擎可以成功地對數據庫應用該組查詢的所有語句,那麼就執行該組查詢。若是有任何一條語句由於崩潰或其餘緣由沒法執行,阿麼其餘的語句都不會執行。事務內的語句,要麼所有執行成功,要麼所有執行失敗。函數
事務的ACID特性:atom
原子性(atomicity):一個事務必須被視爲一個不可分割的最小工做單元,整個事務中的全部操做要麼所有提交成功,要麼所有失敗回滾,對於一個事務來講,不可能只執行其中的一部分操做,這就是事務的原子性。spa
一致性(consistency): 數據庫老是從一個一致性的狀態轉換到另一個一致性的狀態。設計
隔離性(isolation):一般來講一個事務所作的修改在最終提交以前,對其餘事務是不可見的。code
持久性(durability): 一旦事務提交,則其所做的修改就會永久保存到數據庫中。排序
3. 隔離級別
READ UNCOMMITTED(未提交讀):事務中的修改,即便沒有提交,對其餘的事務也是可見的。 事務能夠讀取未提交的數據,這個稱爲髒讀。
READ COMMITTED(提交讀): 大多數數據庫系統的默認隔離級別都是READ COMMITTED(可是MySQL不是)。一個事務開始時,只能「看見」已經提交的事務所作的修改。這個級別也叫做不可重複讀。由於兩次執行一樣的查詢,可能會獲得 不同的結果。
REPEATABLE READ:可重複讀 解決了髒讀的問題。該級別保證了在同一個事務中屢次讀取一樣記錄的結果是一致的。可是仍是沒法解決另外一個幻讀的問題。幻讀是指當某個事務在讀取某個範圍內的記錄時,另一個事務又在該範圍內插入了新的記錄,當以前的事務再次讀取該範圍的記錄時,會產生換行。
SERIALIZABLE(可串行化): 是最高的隔離機制,他經過事務串行執行,避免了幻讀的出現。
4. 數據庫的關係完整性
關係完整性的用於保證數據庫中數據的正確性。系統在進行更新、插入或刪除等操做時都要檢查數據的完整性,覈實其約束條件,即關係模型的完整性規則。在關係模型中有四類完整性約束:實體完整性、域完整性、參照完整性和用戶定義的完整性,其中實體完整性和參照完整性約束條件,稱爲關係的兩個不變性。
實體完整性指表中行的完整性。主要用於保證操做的數據(記錄)非空、惟一且不重複。即實體完整性要求每一個關係(表)有且僅有一個主鍵,每個主鍵值必須惟一,並且不容許爲「空」(NULL)或重複。
域完整性(Domain Integrity)是指數據庫表中的列必須知足某種特定的數據類型或約束。其中約束又包括取值範圍、精度等規定。表中的CHECK、FOREIGN KEY 約束和DEFAULT、 NOT NULL定義都屬於域完整性的範疇。
參照完整性(Referential Integrity)屬於表間規則。對於永久關係的相關表,在更新、插入或刪除記錄時,若是隻改其一,就會影響數據的完整性。
用戶定義完整性(User-defined Integrity)是對數據表中字段屬性的約束,用戶定義完整性規則(User-defined integrity)也稱域完整性規則。包括字段的值域、字段的類型和字段的有效規則(如小數位數)等約束,是由肯定關係結構時所定義的字段的屬性決定的。如,百分制成績的取值範圍在0~100之間等。
5. 經常使用的命令:
show status 顯示服務器的信息
show create database / show create table 顯示建立特定數據庫或者表
show grants 顯示授予用用戶
SELECT prod_id, prod_name, prod_price FROM products // 檢索多個列
SELECT * FROM products 檢索全部列
SELECT DISTINCT vend_id FROM products; // 檢索不一樣的行
SELECT prod_name FROM products LIMIT 5
SELECT prod_name FROM products ORDER BY prod_name DESC 對輸出按降序排序
SELECT prod_price FROM products ORERDE BY prod_price DESC LIMIT 1 // order by 和 limit 組合找出一個列中的最小值或最低值
SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003 // 不匹配檢查
SELECT vend_id, prod_name FROM products WHERE prod_price BETWEEN 5 AND 10 // 範圍值檢查
通配符進行過濾使用 LIKE,% 表示任何字符出現任意次
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%' // 找出全部以jet開頭的產品
LIKE 和 REGEXP的區別:
LIKE 匹配整個列, REGEXP 在列值內進行匹配。
SELECT Concat (vend_name, '(', vend_country, ')' ) FROM vendors ORDER BY vend_name; // 將兩個列拼接起來
彙集函數: 運行在行組上,計算和返回單個值的函數。經常使用的有: AVG(), COUNT(), MAX(), MIN(), SUM().
SELECT AVG(prod_price) AS avg_price FROM products. // AVG()只能用來肯定特定數值列的平均值
SELECT vend_id , COUNT(*) AS num_prods FROM products GROUP BY vend_id
WHERE 過濾行,HAVING 過濾分組
SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2
理解數據庫的幾種種鏈接。
鏈接分爲三種:內鏈接、外鏈接、交叉鏈接。
內鏈接: 1. 等值鏈接 概念:在鏈接條件中使用等於號(=)運算符,其查詢結果中列出被鏈接表中的全部列,包括其中的重複列。
2. 在鏈接條件中使用除等於號以外運算符(>、<、<>、>=、<=、!>和!<)
外鏈接: 外鏈接分爲左鏈接(LEFT JOIN)或左外鏈接(LEFT OUTER JOIN)、右鏈接(RIGHT JOIN)或右外鏈接(RIGHT OUTER JOIN)、全鏈接(FULL JOIN)或全外鏈接(FULL OUTER JOIN)。咱們就簡單的叫:左鏈接、右鏈接和全鏈接。
左鏈接:返回左表中的全部行,若是左表中行在右表中沒有匹配行,則結果中右表中的列返回空值。左鏈接顯示左表所有行,和右表與左表相同行。
右鏈接:恰與左鏈接相反,返回右表中的全部行,若是右表中行在左表中沒有匹配行,則結果中左表中的列返回空值。
全鏈接:返回左表和右表中的全部行。當某行在另外一表中沒有匹配行,則另外一表中的列返回空值
交叉鏈接(CROSS JOIN):也稱迪卡爾積:不帶WHERE條件子句,它將會返回被鏈接的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積(例如: T_student和T_class,返回4*4=16條記錄),若是帶where,返回或顯示的是匹配的行數
6. 數據庫的索引問題
彙集索引和非彙集索引的區別:
彙集索引的順序就是數據的物理存儲順序,而非彙集索引的解釋是索引順序與數據的物理排列順序無關。一個表最多隻能有一個彙集索引。
彙集索引對於那些常常要搜索範圍值的列特別有效。使用匯集索引找到第一個值得行後,即可以確保包含後續索引值的行在物理相鄰。
數據庫索引的
7. 數據庫的四大範式
第一範式(1NF):屬性不可拆分 或 無重複的列
這個簡單,就是一個屬性不容許再分紅多個屬性來創建列。事實上,在目前的DBMS中是不可能拆分屬性的,由於他們不容許這麼作。
第二範式(2NF):徹底函數依賴
先講講什麼是部分函數依賴。
部分函數依賴,就是多個屬性決定另外一個屬性,但事實上,這多個屬性是有冗餘的。例如,(學號,班級)->姓名,事實上,只須要學號就能決定姓名,所以班級 是冗餘的,應該去掉。知足第二範式的數據庫設計必須先知足第一範式。所以第二範式的目標就是消除函數依賴關係中左邊存在的冗餘屬性。
第三範式(3NF):消除傳遞依賴
不依賴於其餘非主屬性(消除傳遞依賴)。
知足第三範式的數據庫必須先知足第二範式。
也就是,數據庫中的屬性依賴僅能依賴於主屬性,不存在於其餘非主屬性的關聯。
例如,圖書,圖書室的關係。圖書包括編號、出版商、頁碼等信息,圖書室包括圖書室編號、所存圖書(外鍵)。其中,圖書室的表中不該該存儲任何圖書的具體 信息(例如,出版商。。),而只能經過主鍵圖書編號來得到對應圖書的信息。
BC範式(BCNF):
(1)全部非主屬性對每個碼都是徹底函數依賴;
(2)全部的主屬性對於每個不包含它的碼,也是徹底函數依賴;
(3)沒有任何屬性徹底函數依賴於非碼的任意一個組合。
R屬於3NF,不必定屬於BCNF,若是R屬於BCNF,必定屬於3NF。
第四範式(4NF):
對於每個X->Y,X都能找到一個候選碼( 若關係中的某一屬性組的值能惟一地表示一個元組,而其真子集不行,則稱該屬性組爲候選碼)。
最後舉個例子(網上的):