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
面試整理
一、對數據庫範式的理解?
二、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 語句來加深印象,逐漸遠離可視化工具。
但願個人總結也對你有幫助。:)