資料庫面試知識

2021-08-01 08:15:33 字數 2934 閱讀 5930

1. 資料庫的正規化

正規化:英文名稱是 normal form,它是英國人 e.f.codd(關聯式資料庫的老祖宗)在上個世紀70年代提出關聯式資料庫模型後總結出來的,正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。目前有跡可尋的共有8種正規化,依次是:1nf,2nf,3nf,bcnf,4nf,5nf,dknf,6nf。通常所用到的只是前三個正規化,即:第一正規化(1nf),第二正規化(2nf),第三正規化(3nf)。下面就簡單介紹下這三個正規化。 

◆第一正規化(1nf):強調的是列的原子性,即列不能夠再分成其他幾列, 屬性不可分。 

考慮這樣乙個表:【聯絡人】(姓名,性別,**) 

如果在實際場景中,乙個聯絡人有家庭**和公司**,那麼這種表結構設計就沒有達到 1nf。要符合 1nf 我們只需把列(**)拆分,即:【聯絡人】(姓名,性別,家庭**,公司**)。1nf 很好辨別,但是 2nf 和 3nf 就容易搞混淆。 

◆ 第二正規化(2nf):首先是 1nf,另外包含兩部分內容,一是表必須有乙個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。即有主鍵,非主鍵字段依賴主鍵 .

考慮乙個訂單明細表:【orderdetail】(orderid,productid,unitprice,discount,quantity,productname)。 

因為我們知道在乙個訂單中可以訂購多種產品,所以單單乙個 orderid 是不足以成為主鍵的,主鍵應該是(orderid,productid)。顯而易見 discount(折扣),quantity(數量)完全依賴(取決)於主鍵(oderid,productid),而 unitprice,productname 只依賴於 productid。所以 orderdetail 表不符合 2nf。不符合 2nf 的設計容易產生冗餘資料。 

可以把【orderdetail】表拆分為【orderdetail】(orderid,productid,discount,quantity)和【product】(productid,unitprice,productname)來消除原訂單表中unitprice,productname多次重複的情況。 

◆ 第三正規化(3nf):首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 a 依賴於非主鍵列 b,非主鍵列 b 依賴於主鍵的情況。 非主鍵字段不能互相依賴.

考慮乙個訂單表【order】(orderid,orderdate,customerid,customername,customeraddr,customercity)主鍵是(orderid)。 

其中 orderdate,customerid,customername,customeraddr,customercity 等非主鍵列都完全依賴於主鍵(orderid),所以符合 2nf。不過問題是 customername,customeraddr,customercity 直接依賴的是 customerid(非主鍵列),而不是直接依賴於主鍵,它是通過傳遞才依賴於主鍵,所以不符合 3nf。 

通過拆分【order】為【order】(orderid,orderdate,customerid)和【customer】(customerid,customername,customeraddr,customercity)從而達到 3nf。 

第二正規化(2nf)和第三正規化(3nf)的概念很容易混淆,區分它們的關鍵點在於,2nf:非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分;3nf:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。

2. truncate table 與delete 整個表的所有記錄時的區別

關於 oracle 的高水平線

high water mark 故名思義為高水平線 , 一般是相對乙個表而言的 , 當乙個表有資料不斷的插入時 ,high water mark 值不斷增高 , 對那些全表掃瞄的 select 查詢是以 high water mark 為終點的 , 雖然表中可能只有一行記錄 . 它是表的空間曾經擴充到的值 .

(1)、truncate在各種表上無論是大的還是小的都非常快。如果有rollback命令delete將被撤銷,而truncate則不會被撤銷。

(2)、truncate是乙個ddl語言,向其他所有的ddl語言一樣,他將被隱式提交,不能對truncate使用rollback命令。delete是乙個dml語言.

(3)、truncate將重新設定高水平線和所有的索引。在對整個表和索引進行完全瀏覽時,經過truncate操作後的錶比delete操作後的表要快得多。

(4)、truncate不能觸發任何delete觸發器。

(5)、當表被清空後表和表的索引講重新設定成初始大小,而delete則不能。

(6)、不能清空父表。

在oracle裡,使用delete刪除資料以後,資料庫的儲存容量不會減少; 使用delete刪除某個表的資料以後,查詢這張表的速度和刪除之前一樣,不會發生變化。

因為oralce有乙個hwm高水位,它是oracle的乙個表使用空間最高水位線。當插入了資料以後,高水位線就會**,但是如果你採用delete語句刪除資料的話,資料雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除資料以前那麼高的水位。除非使用truncate刪除資料。這條高水位線在日常的增刪操作中只會**,不會**,所以資料庫容量也只會上公升,不會下降。而使用select語句查詢資料時,資料庫會掃瞄高水位線以下的資料塊,因為高水位線沒有變化,所以掃瞄的時間不會減少,所以才會出現使用delete刪除資料以後,查詢的速度還是和delete以前一樣。

3. sql優化方式

參考我的博文:

4. 各種資料庫的分頁sql

(1). oracle : rownum

select * from student where rownum <= 50; 

(2). mysql : limit

select a from foo where b = 1 limit 100,10;

(3). sqlserver : top

select top 30 * from article where id = '1'

資料庫常見面試知識

一。sql語句優化的策略都有哪些 1.建表的時候。應盡量建立主鍵,根據主鍵查詢資料 2.大資料表刪除,用truncate table代替delete。3.合理使用索引,在oltp應用中一張表的索引不要太多。組合索引的列順序盡 量與查詢條件列順序保持一致 對於資料操作頻繁的表,索引需要定期重建,以減少...

資料庫相關面試知識總結

一 myisam和innodb的區別 1 innodb支援事務,myisam不支援事務 2 innodb支援行級鎖,myisam支援表級鎖 3 innodb支援併發控制,而myisam不支援 4 innodb支援外來鍵,而myisam不支援 5 innodb不支援全文索引,myisam支援 二 資料...

面試基礎知識 資料庫

事務是指作為單個邏輯工作單元執行的一系列操作,可以被看作乙個單元的一系列sql語句的集合。要麼完全地執行,要麼完全地不執行。如果不對資料庫進行併發控制,可能會產生 髒讀 非重複讀 幻像讀 丟失修改的異常情況。同一時間,只允許乙個事務請求同一資料,不同的事務之間彼此沒有任何干擾。比如a正在從一張銀行卡...