關於面試總結1-SQL學生表
前言
每次面試必考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
數據表
創建學生數據表
CREATE TABLE students(
stu_id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
stu_name VARCHAR(32) NOT NULL,
stu_age INT NOT NULL
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
插入數據
INSERT INTO students(stu_id, stu_name, stu_age)
VALUES(1001, "張三", 18), (1002, "張四", 19), (1003, "張五", 20),
(1004, "張六", 19), (1005, "張六", 18);
創建成績數據表
CREATE TABLE transcripts(
tscp_no INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
tscp_id INT(4) NOT NULL,
tscp_subject VARCHAR(32) NOT NULL,
tscp_score FLOAT NOT NULL,
foreign key(tscp_id) references students(stu_id)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
插入數據
INSERT INTO transcripts(tscp_no, tscp_id, tscp_subject, tscp_score)
VALUES( 1, 1001, "語文", 85), ( 2, 1001, "數學", 86), ( 3, 1002, "英語", 98),
( 4, 1002, "語文", 94), ( 5, 1002, "數學", 98), ( 6, 1003, "數學", 56),
( 7, 1003, "語文", 69), ( 8, 1003, "英語", 68), ( 9, 1004, "英語", 99),
(10, 1004, "數學", 97), (11, 1005, "數學", 93), (12, 1005, "英語", 45);
01、查詢所有學生的數學成績,顯示學生姓名、科目和分數,由高到低;
語句一
SELECT s.stu_name, t.tscp_subject, t.tscp_score
FROM students s, transcripts t WHERE t.tscp_id = s.stu_id AND t.tscp_subject = "數學"
ORDER BY t.tscp_score DESC;
語句二
SELECT s.stu_name, t.tscp_subject, t.tscp_score FROM transcripts t
INNER JOIN students s ON t.tscp_id = s.stu_id AND t.tscp_subject="數學"
ORDER BY t.tscp_score DESC;
02、統計每個學生的總成績,顯示字段:姓名和總成績;
語句一
SELECT s.stu_name, SUM(t.tscp_score) AS tscp_all_score
FROM students s, transcripts t WHERE s.stu_id = t.tscp_id GROUP BY t.tscp_id;
語句二
SELECT s.stu_name, SUM(t.tscp_score) AS tscp_all_score FROM transcripts t
INNER JOIN students s ON t.tscp_id = s.stu_id GROUP BY t.tscp_id;
03、統計每個學生的總成績(由於學生可能有重復名字),顯示字段:學生ID、姓名和總成績;
SELECT s.stu_id, s.stu_name, SUM(t.tscp_score) AS tscp_all_score FROM transcripts t
INNER JOIN students s ON t.tscp_id = s.stu_id GROUP BY t.tscp_id;
04、列出各門課程成績最好的學生,要求顯示字段: 學號、姓名、科目和成績;
SELECT s.stu_id, s.stu_name, t.tscp_subject, MAX(t.tscp_score) FROM transcripts t
INNER JOIN students s ON t.tscp_id = s.stu_id GROUP BY t.tscp_subject;
05、列出各門課程成績最好的兩位學生,要求顯示字段: 學號、姓名、科目和成績。
SELECT s.stu_id, s.stu_name, t1.tscp_subject, t1.tscp_score FROM transcripts t1
INNER JOIN students s ON t1.tscp_id = s.stu_id
LEFT JOIN transcripts t2 ON t1.tscp_subject = t2.tscp_subject AND t1.tscp_score ⇐ t2.tscp_score
GROUP BY t1.tscp_subject, t1.tscp_score HAVING COUNT(t2.tscp_score) < 3
ORDER BY t1.tscp_subject, t1.tscp_score DESC;
第五題參考博客:http://blog.sina.com.cn/s/blog_53d137da0102wx9t.html
步驟一
SELECT s.stu_id, s.stu_name, t1.tscp_subject, t1.tscp_score FROM transcripts t1
INNER JOIN students s ON t1.tscp_id = s.stu_id
ORDER BY t1.tscp_subject, t1.tscp_score DESC;
步驟二
SELECT s.stu_id, s.stu_name, t1.tscp_subject, t1.tscp_score, t2.tscp_score FROM transcripts t1
INNER JOIN students s ON t1.tscp_id = s.stu_id
LEFT JOIN transcripts t2 ON t1.tscp_subject = t2.tscp_subject AND t1.tscp_score ⇐ t2.tscp_score
ORDER BY t1.tscp_subject, t1.tscp_score DESC;
步驟三
SELECT s.stu_id, s.stu_name, t1.tscp_subject, t1.tscp_score, t2.tscp_score FROM transcripts t1
INNER JOIN students s ON t1.tscp_id = s.stu_id
LEFT JOIN transcripts t2 ON t1.tscp_subject = t2.tscp_subject AND t1.tscp_score ⇐ t2.tscp_score
GROUP BY t1.tscp_subject, t1.tscp_score HAVING COUNT(t2.tscp_score) < 3
ORDER BY t1.tscp_subject, t1.tscp_score DESC;
步驟四
SELECT s.stu_id, s.stu_name, t1.tscp_subject, t1.tscp_score FROM transcripts t1
INNER JOIN students s ON t1.tscp_id = s.stu_id
LEFT JOIN transcripts t2 ON t1.tscp_subject = t2.tscp_subject AND t1.tscp_score ⇐ t2.tscp_score
GROUP BY t1.tscp_subject, t1.tscp_score HAVING COUNT(t2.tscp_score) < 3
ORDER BY t1.tscp_subject, t1.tscp_score DESC;