Sql取出各科分數前三名的學生,Sql各科成績前三的學生
================================
©Copyright 蕃薯耀 2021-06-09
https://www.cnblogs.com/fanshuyao/
一、取出各科成績前三的學生
#取出各科成績前三的學生 CREATE TABLE stu_score( id INT PRIMARY KEY AUTO_INCREMENT, stu_id INT, stu_name VARCHAR(50), clazz VARCHAR(20), score DOUBLE, remark VARCHAR(50) ); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (1, '小趙', '語文', 80); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (1, '小趙', '數學', 85); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (1, '小趙', '英語', 90); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (1, '小趙', '化學', 90); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (2, '小錢', '語文', 88); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (2, '小錢', '數學', 88); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (2, '小錢', '英語', 98); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (2, '小錢', '化學', 92); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (3, '小孫', '語文', 70); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (3, '小孫', '數學', 78); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (3, '小孫', '英語', 96); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (3, '小孫', '化學', 95); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (4, '小李', '語文', 85); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (4, '小李', '數學', 98); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (4, '小李', '英語', 88); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (4, '小李', '化學', 98); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (5, '小王', '語文', 90); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (5, '小王', '數學', 80); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (5, '小王', '英語', 85); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (5, '小王', '化學', 78); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (6, '小陳', '語文', 87); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (6, '小陳', '數學', 97); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (6, '小陳', '英語', 84); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (6, '小陳', '化學', 80); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (7, '小朱', '語文', 80); INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (7, '小朱', '數學', 88);#和小錢88分一樣,並列第三 INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (7, '小朱', '英語', 98);#並列第一 INSERT INTO stu_score(stu_id,stu_name,clazz,score) VALUES (7, '小朱', '化學', 95);#並列批二 SELECT * FROM stu_score ss ORDER BY ss.`clazz`,ss.`score` DESC; #取出各科成績前三的學生 #1、取出一名學生A某個學科的成績 #2、然后和所有的學生同一個學科的成績比較 #3、當存在該學科的成績比學生A的成績大且總人數不大於3,或者該學科成績沒有大於學生A的,則表示學生A的成績在前三 #4、然后根據學科、分數(降序)排序取出 SELECT * FROM stu_score ss1
WHERE (
SELECT COUNT(*) FROM stu_score ss2
WHERE ss2.`clazz`=ss1.`clazz` AND ss2.`score` > ss1.`score`
) < 3
ORDER BY ss1.`clazz`,ss1.`score` DESC;
最后的查詢結果:
id stu_id stu_name clazz score remark ------ ------ -------- ------ ------ -------- 16 4 小李 化學 98 (NULL) 12 3 小孫 化學 95 (NULL) 28 7 小朱 化學 95 (NULL) 14 4 小李 數學 98 (NULL) 22 6 小陳 數學 97 (NULL) 6 2 小錢 數學 88 (NULL) 26 7 小朱 數學 88 (NULL) 7 2 小錢 英語 98 (NULL) 27 7 小朱 英語 98 (NULL) 11 3 小孫 英語 96 (NULL) 17 5 小王 語文 90 (NULL) 5 2 小錢 語文 88 (NULL) 21 6 小陳 語文 87 (NULL)
截圖:
二、取出各科成績都不小於85分的學生
#取出各科成績都不小於85分的學生 #如果一個學生所有學科的分數中,最小的都>=85,則表示該學生每科成績都不小於85 SELECT stu_name,MIN(score) FROM stu_score GROUP BY stu_name HAVING MIN(score) >=85 ORDER BY MIN(score) DESC;
查詢結果:
stu_name MIN(score) -------- ------------ 小錢 88 小李 85
(時間寶貴,分享不易,捐贈回饋,^_^)
================================
©Copyright 蕃薯耀 2021-06-09
https://www.cnblogs.com/fanshuyao/