2017-08-01
最近一個星期面試了四五家公司,面試的崗位是 Java 實習生。發現每家公司的 SQL 知識考察的內容都不盡相同,而且自己的 SQL 知識更是弱項。為此在菜鳥教程上復習了 SQL 知識,也總結了這幾天來的面試題目。
筆試整理
1、給類似如下的表,要求用 SQL 求各班不同性別成績超過80分的平均數:
表:test_avg
| NAME | SCORE | SEX | CLASS |
| A | 66 | 男 | 1 |
| B | 86 | 女 | 2 |
| C | 90 | 男 | 1 |
| D | 82 | 女 | 2 |
考察知識點:
1)AVG() 函數。AVG 函數返回數值列的平均值。NULL 值不包括在計算中。
2)GROUP BY。GROUP BY 語句用於結合聚合函數,根據一個或多個列對結果集進行分組(注意分組與排序的區別)。
SELECT CLASS,SEX,AVG(SCORE) FROM test_avg WHERE SCORE > 80 GROUP BY SEX,CLASS;
2、給類似如下兩張表,查出 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;
3、用 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;
4、如何查詢一份表里最后 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
面試整理
1、對數據庫范式的理解?
- 范式(NF):“符合某一種級別的關系模式的集合,表示一個關系內部各屬性之間的聯系的合理化程度”。很晦澀吧?實際上你可以把它粗略地理解為一張數據表的表結構所符合的某種設計標准的級別。(我的簡單總結:表里屬性間的合理化程度)
- 數據庫范式也分為 1NF,2NF,3NF,BCNF,4NF,5NF。符合高一級范式的設計,必定符合低一級范式。
- 1NF 的定義為:符合 1NF 的關系中的每個屬性都不可再分。(1NF 是所有關系型數據庫的最基本要求)
- 1NF 缺點:數據冗余過大,插入異常,刪除異常,修改異常的問題
- 2NF 在 1NF 的基礎之上,消除了非主屬性對於碼的部分函數依賴。
- 3NF 在 2NF 的基礎之上,消除了非主屬性對於碼的傳遞函數依賴。
2、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
3、MySQL 索引如何實現?有什么不足?
簡單理解,索引就是為了加快查詢速度的。而索引是獨立存儲的內容,因此當數據量很大是,更新表要同時更新索引,造成了更新的速度下降。
這里我參考了兩篇文章,地址如下:
http://fangjian0423.github.io/2017/07/05/mysql-index-summary/#more
https://segmentfault.com/a/1190000003072424
經過幾次面試,知道了自己的 SQL 知識的缺乏,現在總結並惡補了一番,感覺思路清晰了很多。SQL 知識大致是常用函數、增刪查改、約束、數據類型的使用,要想真正記在腦海還是要多實際編寫代碼。可以盡量在命令行窗口編寫 SQL 語句來加深印象,逐漸遠離可視化工具。
希望我的總結也對你有幫助。:)
