前言
每次面試必考SQL,小編這幾年一直吃SQ的虧,考題無非就是萬年不變學生表,看起來雖然簡單,真正寫出來,還是有一定難度。於是決定重新整理下關於SQL的面試題,也可以幫助更多的人過SQL這一關。
作為一個工作3年以上測試人員,不會sql基本上能拿到offer的希望渺茫,雖然平常也會用到數據庫,都是用的簡單的查詢語句。困難一點的就直接找開發了,面試想留個好印象,還是得熟練掌握,能在紙上快速寫出來。
- 1.查詢所有學生的數學成績,顯示學生姓名name, 分數, 由高到低
- 2.統計每個學生的總成績,顯示字段:姓名,總成績
- 3.統計每個學生的總成績(由於學生可能有重復名字),顯示字段:學生id,姓名,總成績
- 4.列出各門課程成績最好的學生, 要求顯示字段: 學號,姓名,科目,成績
- 5.列出各門課程成績最好的2位學生, 要求顯示字段: 學號,姓名, 科目,成績
萬年不變學生表
有2張表,學生表(student)基本信息如下
科目和分數表(grade)
排序order by
1.查詢所有學生的數學成績,顯示學生姓名name, 分數, 由高到低
SELECT a.name, b.score
FROM student a, grade b
WHERE a.id = b.id
AND kemu = '數學'
ORDER BY score
DESC
統計總成績sum
2.統計每個學生的總成績,顯示字段:姓名,總成績
SELECT a.name, sum(b.score) as sum_score
FROM student a, grade b
WHERE a.id = b.id
GROUP BY name
DESC
統計總成績
3.統計每個學生的總成績(由於學生可能有重復名字),顯示字段:學生id,姓名,總成績
SELECT a.id, a.name, c.sum_score
from student a,
(SELECT b.id, sum(b.score) as sum_score
FROM grade b
GROUP BY id
) c
WHERE a.id = c.id
ORDER BY sum_score
DESC
統計單科最好成績
4.列出各門課程成績最好的學生, 要求顯示字段: 學號,姓名,科目,成績
第一步先group by找出單科最好成績,作為第一張表
SELECT b.kemu, MAX(b.score)
FROM grade b
GROUP BY kemu
再結合學生表和分數表,得到單科最好成績
-- 單科最好的成績
SELECT c.id , a.name, c.kemu, c.score
FROM grade c, student a,
(SELECT b.kemu, MAX(b.score) as max_score
FROM grade b
GROUP BY kemu) t
WHERE c.kemu = t.kemu
AND c.score = t.max_score
AND a.id = c.id
總結 group by相關用法
函數 | 作用 | 支持性 |
---|---|---|
sum(列名) | 求和 | |
max(列名) | 最大值 | |
min(列名) | 最小值 | |
avg(列名) | 平均值 | |
first(列名) | 第一條記錄 | 僅Access支持 |
last(列名) | 最后一條記錄 | 僅Access支持 |
count(列名) | 統計記錄數 | 注意和count(*)的區別 |
各門課程成績最好的2位學生
5.列出各門課程成績最好的2位學生, 要求顯示字段: 學號,姓名, 科目,成績
SELECT t1.id, a.name, t1.kemu,t1.score
FROM grade t1, student a
WHERE
(SELECT count(*) FROM grade t2
WHERE t1.kemu=t2.kemu AND t2.score>t1.score
)<2
and a.id = t1.id
ORDER BY t1.kemu,t1.score
DESC
交流QQ群:779429633