這段時間跳槽的人特別多, 程序員們又紛紛加入了年後面試尋求漲工資, 新機會的大軍, 求職就意味着面試. 而對於java程序員來講, 數據庫是面試必問的, 再次總結下數據庫的面試常見問題:html
範式:英文名稱是 Normal Form,它是英國人 E.F.Codd(關係數據庫的老祖宗)在上個世紀70年代提出關係數據庫模型後總結出來的,範式是關係數據庫理論的基礎,也是咱們在設計數據庫結構過程當中所要遵循的規則和指導方法。目前有跡可尋的共有8種範式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。一般所用到的只是前三個範式,即:第一範式(1NF),第二範式(2NF),第三範式(3NF)。下面就簡單介紹下這三個範式。 java
◆ 第一範式(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:非主鍵列是直接依賴於主鍵,仍是直接依賴於非主鍵列。程序員
關於 Oracle 的高水平線面試
high water mark 故名思義爲高水平線 , 通常是相對一個表而言的 , 當一個表有數據不斷的插入時 ,high water mark 值不斷增高 , 對那些全表掃描的 select 查詢是以 high water mark 爲終點的 , 雖然表中可能只有一行記錄 . 它是表的空間曾經擴充到的值 .sql
(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之前同樣。數據庫
參考個人博文: http://www.cnblogs.com/study-everyday/p/6433900.htmloracle
(1). Oracle : rownum優化
SELECT * FROM STUDENT WHERE ROWNUM <= 50; spa
(2). Mysql : limit設計
SELECT a FROM foo WHERE b = 1 LIMIT 100,10;
(3). Sqlserver : top
SELECT TOP 30 * FROM ARTICLE WHERE ID = '1'