幾道 SQL 筆試題、面試題總結

2017-08-01mysql

最近一個星期面試了四五家公司,面試的崗位是 Java 實習生。發現每家公司的 SQL 知識考察的內容都不盡相同,並且本身的 SQL 知識更是弱項。爲此在菜鳥教程上覆習了 SQL 知識,也總結了這幾天來的面試題目。git


 筆試整理github

一、給相似以下的表,要求用 SQL 求各班不一樣性別成績超過80分的平均數:面試

表:test_avgsql

NAME SCORE SEX CLASS
A 66 1
B 86 2
C 90 1
D 82 2

 

 

 

 

 

考察知識點:數據庫

1)AVG() 函數。AVG 函數返回數值列的平均值。NULL 值不包括在計算中。segmentfault

2)GROUP BY。GROUP BY 語句用於結合聚合函數,根據一個或多個列對結果集進行分組(注意分組與排序的區別)函數

SELECT CLASS,SEX,AVG(SCORE) FROM test_avg WHERE SCORE > 80 GROUP BY SEX,CLASS;

 

二、給相似以下兩張表,查出 employee 中全部名字及其 boss 名字,沒有的賦值爲「未知」:工具

表:employee編碼

id name leader_id
1 aaa null
2 bbb 1
3 ccc 2
4 ddd 1

 

 

 

 

 

 

表:boss

id name
1 A
2 B

 

 

 

考察知識點:

1)IFNULL() 函數。IFNULL(表達式,填充數據) 函數:若查出數據爲 Null,用填充數據填充。

2)左鏈接。例如:table1 LEFT JOIN table2 ON 限制條件時,table1 的數據全查出來。

SELECT employee.`name`,IFNULL(boss.'name','未知') as leader FROM employee LEFT JOIN boss ON employee.leader = boss.id;

 

三、用 SQL 語句建一份表:

以下爲我建的一份表,注意表的引擎、字符集編碼

CREATE TABLE IF NOT EXISTS 'table1' (
    'id' INT UNSIGNED AUTO_INCREMENT,
    'title' VARCHAR(100) NOT NULL,
    'author' VARCHAR(40) NOT NULL,
    'submission_date' DATE,
    PRIMARY KEY ('id')
)ENGINE=InnoDB DEFAULT CHARSET=utf-8;

 

四、如何查詢一份表裏最後 10 條記錄的前 7 條記錄?

思路:在子查詢裏用倒序按 id 查出(由於主鍵 id 確定是按順序的)最後的 10 條記錄,而後用 LIMIT 方法查詢裏面的前 7 條

考察知識點:

1)思惟可否靈活變通,運用倒序查詢最後 10 條記錄。

2)LIMIT 分頁。語法:SELECT * FROM table LIMIT [offset,] rows。其中,offset 爲偏移量,可選,基 0;rows 是查詢的行數。

SELECT name FROM (SELECT name FROM test_avg ORDER BY `name` DESC LIMIT 10) as id ORDER BY name LIMIT 7 

 

 面試整理

一、對數據庫範式的理解?

  • 範式(NF):「符合某一種級別的關係模式的集合,表示一個關係內部各屬性之間的聯繫的合理化程度」。很晦澀吧?實際上你能夠把它粗略地理解爲一張數據表的表結構所符合的某種設計標準的級別。(個人簡單總結:表裏屬性間的合理化程度
  • 數據庫範式也分爲 1NF,2NF,3NF,BCNF,4NF,5NF。符合高一級範式的設計,一定符合低一級範式。
  • 1NF 的定義爲:符合 1NF 的關係中的每一個屬性都不可再分。(1NF 是全部關係型數據庫的最基本要求)
  • 1NF 缺點:數據冗餘過大,插入異常,刪除異常,修改異常的問題
  • 2NF 在 1NF 的基礎之上,消除了非主屬性對於碼的部分函數依賴
  • 3NF 在 2NF 的基礎之上,消除了非主屬性對於碼的傳遞函數依賴

 

二、MySQL 如何進行分頁?有什麼缺點?

MySQL 使用 LIMIT 關鍵字進行分頁操做。說明在上面第 4 點有說明。

缺點:一言以蔽之,就是越日後分頁,LIMIT 語句的偏移量就會越大,速度也會明顯變慢。此時,咱們能夠經過子查詢的方式來提升分頁效率,大體以下:

SELECT * FROM articles WHERE id >= (SELECT id FROM articles  WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10 

 

三、MySQL 索引如何實現?有什麼不足?

簡單理解,索引就是爲了加快查詢速度的。而索引是獨立存儲的內容,所以當數據量很大是,更新表要同時更新索引,形成了更新的速度降低

這裏我參考了兩篇文章,地址以下:

http://fangjian0423.github.io/2017/07/05/mysql-index-summary/#more

http://www.javashuo.com/article/p-auvdsifi-bd.html

 


通過幾回面試,知道了本身的 SQL 知識的缺少,如今總結並惡補了一番,感受思路清晰了不少。SQL 知識大體是經常使用函數、增刪查改、約束、數據類型的使用,要想真正記在腦海仍是要多實際編寫代碼。能夠儘可能在命令行窗口編寫 SQL 語句來加深印象,逐漸遠離可視化工具。

但願個人總結也對你有幫助。:)

相關文章
相關標籤/搜索