• Sql取出各科分数前三名的学生,Sql各科成绩前三的学生


    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/

    今天越懒,明天要做的事越多。
  • 相关阅读:
    缓存架构设计细节二三事
    数据库软件架构设计些什么
    100亿数据1万属性数据架构设计
    这才是真正的表扩展方案
    啥,又要为表增加一列属性?
    究竟啥才是互联网架构“高可用”
    究竟啥才是互联网架构“高并发”
    Linux用过的命令
    Xshell远程连接工具
    oracle分组取第一条
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/14865884.html
Copyright © 2020-2023  润新知