一、取出各科成绩前三的学生
#取出各科成绩前三的学生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;#方法二#使用加行号的方式查询#加行号的使用规则是:@rowNum:=num#意思是声明一个叫 rowNum 的变量并赋值为num#此处加行号m1的作用就可以体现出来,查询语句中多了一个字段 r ,他可以以数字1,2,3,4,5的形式显示排名select score, stu_name, @m1:=@m1+1 r from stu_score, (select @m1:=0) awhere subject='java'order by score desclimit 3
方法一(不考虑并列)
查询速度快且代码简单
#取出各科成绩前三的学生#1、取出一名学生A某个学科的成绩#2、然后和所有的学生同一个学科的成绩比较#3、当存在该学科的成绩比学生A的成绩大且总人数不大于3,或者该学科成绩没有大于学生A的,则表示学生A的成绩在前三#4、然后根据学科、分数(降序)排序取出SELECT * FROM stu_score ss1WHERE (SELECT COUNT(*)FROM stu_score ss2WHERE ss2.`clazz`=ss1.`clazz` AND ss2.`score` > ss1.`score`) < 3ORDER 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)7 2 小钱 英语 98 (NULL)27 7 小朱 英语 98 (NULL)11 3 小孙 英语 96 (NULL)17 5 小王 语文 90 (NULL)5 2 小钱 语文 88 (NULL)21 6 小陈 语文 87 (NULL)
方法二(考虑并列)
#并列的情况SELECT s1.stu_name, s1.clazz, s1.scoreFROM stu_score s1LEFT JOIN (SELECT DISTINCT clazz, scoreFROM stu_score) s2ON s1.clazz = s2.clazzAND s1.score < s2.scoreGROUP BY s1.stu_name, s1.clazz, s1.scoreHAVING COUNT(1) < 3ORDER BY clazz, score DESC;
最后的查询结果: 小钱-化学,小朱-数学
stu_id stu_name clazz score remark------ -------- ------ ------ --------4 小李 化学 98 (NULL)3 小孙 化学 95 (NULL)7 小朱 化学 95 (NULL)2 小钱 化学 92 (NULL)4 小李 数学 98 (NULL)6 小陈 数学 97 (NULL)2 小钱 数学 88 (NULL)7 小朱 数学 88 (NULL)2 小钱 英语 98 (NULL)7 小朱 英语 98 (NULL)3 小孙 英语 96 (NULL)5 小王 语文 90 (NULL)2 小钱 语文 88 (NULL)6 小陈 语文 87 (NULL)
二、取出各科成绩都不小于85分的学生
#取出各科成绩都不小于85分的学生#如果一个学生所有学科的分数中,最小的都>=85,则表示该学生每科成绩都不小于85SELECT stu_name,MIN(score) FROM stu_scoreGROUP BY stu_name HAVING MIN(score) >=85ORDER BY MIN(score) DESC;
最后的查询结果:
stu_name MIN(score)-------- ------------小钱 88小李 85
