數據庫常考知識點

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開頭的產品

 

      LIKEREGEXP的區別:

      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都能找到一個候選碼( 若關係中的某一屬性組的值能惟一地表示一個元組,而其真子集不行,則稱該屬性組爲候選碼)。

       最後舉個例子(網上的):

 

學生表
學號
姓名
教師學生關係編號
系編號
愛好編號
一範式,就是表裏的字段不能在劃分屬性了。
二範式,知足一範式基礎,表裏不存在與學號不要緊的信息
三範式,知足二範式的基礎上,表裏不存在其餘字段的關聯,
BC範式,知足三範式的基礎上,就是學生表裏的每行都不存在重複的信息
第四範式,知足BC範式,就是連愛好這樣字段,也不能出現 」籃球,足球「;要創建一個愛好編號表,插入數據:   insert into table values (,  , , )
相關文章
相關標籤/搜索