• 一些数据库练习


    --------------------------------表结构私发----------------------------------

    -- 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数

    1. SELECT ss.*, 语文.s_score, 数学.s_score 
    2. FROM score 语文, score 数学, student ss 
    3. WHERE ss.s_id = 语文.s_id    AND          -- 找同一个学生
    4.             ss.s_id = 数学.s_id AND 
    5.             语文.c_id = '01' AND
    6.             数学.c_id = '02' AND
    7.             语文.s_score > 数学.s_score ;
    1. SELECT ss.*, 语文.s_score as yuwen, 数学.s_score as math
    2. FROM student ss 
    3. LEFT JOIN score 语文 ON ss.s_id = 语文.s_id    AND 语文.c_id = '01' 
    4. LEFT JOIN score 数学 ON ss.s_id = 数学.s_id AND 数学.c_id = '02' 
    5. WHERE 语文.s_score > 数学.s_score ;

    -- 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数

    1. SELECT ss.*, 语文.s_score as yuwen, 数学.s_score as math
    2. FROM student ss 
    3. LEFT JOIN score 语文 ON ss.s_id = 语文.s_id    AND 语文.c_id = '01' 
    4. LEFT JOIN score 数学 ON ss.s_id = 数学.s_id AND 数学.c_id = '02' 
    5. WHERE 语文.s_score < 数学.s_score ;

    -- 3、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

    1. SELECT ss.s_id, ss.s_name, count(score.c_id), SUM(score.s_score)
    2. FROM student ss 
    3. LEFT JOIN score ON ss.s_id = score.s_id  -- 将学生id一样的课程统计
    4. GROUP BY ss.s_id, ss.s_name ;

    -- 4、查询学过"张三"老师授课的同学的信息

    1. SELECT ss.*
    2. FROM student ss
    3. LEFT JOIN score on ss.s_id = score.s_id
    4. LEFT JOIN course on score.c_id = course.c_id
    5. LEFT JOIN teacher on teacher.t_id = course.t_id
    6. where  teacher.t_name = '张三' ;

    -- 1.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
    -- (包括有成绩的和无成绩的)

    1. SELECT ss.s_id, ss.s_name, AVG(score.s_score) as avgscore
    2. FROM student ss
    3. LEFT JOIN score ON ss.s_id = score.s_id
    4. GROUP BY ss.s_id, ss.s_name
    5. HAVING avgscore < 60 OR avgscore IS null ;

    -- 2.查询"李"姓老师的数量

    1. SELECT COUNT(tt.t_name)
    2. FROM teacher tt 
    3. WHERE tt.t_name LIKE '李%' ;

    -- 3.查询没学过"张三"老师授课的同学的信息

    1. SELECT ss.*
    2. FROM student ss
    3. where ss.s_id not in(
    4.     SELECT score.s_id
    5.     FROM score, course, teacher
    6.     where score.c_id = course.c_id AND teacher.t_id = course.t_id
    7.     AND teacher.t_name = '张三' 
    8. ) ;

    -- 4.查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

    1. SELECT ss.*
    2. FROM student ss
    3. INNER JOIN score sc1 ON sc1.s_id = ss.s_id AND sc1.c_id='01'
    4. INNER JOIN score sc2 ON sc2.s_id = ss.s_id AND sc2.c_id='02' ;

    # 1.按平均成绩从高到低显示所有学生的所有课程成绩以及平均成绩

    1. SELECT a.s_name, 语文.s_score as yuwen, 数学.s_score as math, 英语.s_score as english, AVG(s4.s_score) as avgScore
    2. FROM student a
    3. LEFT JOIN score 语文 ON a.s_id = 语文.s_id AND 语文.c_id = '01' 
    4. LEFT JOIN score 数学 ON a.s_id = 数学.s_id AND 数学.c_id = '02' 
    5. LEFT JOIN score 英语 ON a.s_id = 英语.s_id AND 英语.c_id = '03' 
    6. LEFT JOIN score s4 ON a.s_id = s4.s_id
    7. GROUP BY a.s_name
    8. ORDER BY avgScore DESC ;

    # 总成绩2,3名
    -- SELECT a.*, 语文.s_score as yuwen, 数学.s_score as math, 英语.s_score as english, SUM(s4.s_score) as sumScore
    -- FROM student a
    -- LEFT JOIN score 语文 ON a.s_id = 语文.s_id AND 语文.c_id = '01' 
    -- LEFT JOIN score 数学 ON a.s_id = 数学.s_id AND 数学.c_id = '02' 
    -- LEFT JOIN score 英语 ON a.s_id = 英语.s_id AND 英语.c_id = '03' 
    -- LEFT JOIN score s4 ON a.s_id = s4.s_id
    -- GROUP BY a.s_name
    -- ORDER BY sumScore DESC 
    -- LIMIT 1,2    ;

    # 2.查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

    1. (SELECT s.*, sc.c_id as '课程ID', sc.s_score as "成绩"
    2. FROM student s
    3. LEFT JOIN score sc ON s.s_id = sc.s_id 
    4. WHERE sc.c_id='01' ORDER BY sc.s_score desc LIMIT 1,2)
    5. UNION ALL
    6. (SELECT s.*, sc.c_id, sc.s_score 
    7. FROM student s
    8. LEFT JOIN score sc ON s.s_id = sc.s_id 
    9. WHERE sc.c_id='02' ORDER BY sc.s_score desc LIMIT 1,2)
    10. UNION ALL
    11. (SELECT s.*, sc.c_id, sc.s_score 
    12. FROM student s
    13. LEFT JOIN score sc ON s.s_id = sc.s_id 
    14. WHERE sc.c_id='03' ORDER BY sc.s_score desc LIMIT 1,2) ;
    1. #方法二:
    2. -- 先把课程里面的id和名称挑出来
    3. SELECT kc.c_id, kc.c_name, "第二名" as "名次",
    4.     (SELECT s_name from student 
    5.         LEFT JOIN score ON score.s_id = student.s_id
    6.         WHERE score.c_id = kc.c_id ORDER BY score.s_score desc LIMIT 2,1
    7.     ) as 姓名, 
    8.     (SELECT s_score from score 
    9.         where score.c_id = kc.c_id 
    10.         ORDER BY score.s_score DESC LIMIT 2,1
    11.     ) as 成绩,
    12.     "第三名" as "名次",
    13.     (SELECT s_name from student 
    14.         LEFT JOIN score ON score.s_id = student.s_id
    15.         WHERE score.c_id = kc.c_id ORDER BY score.s_score desc LIMIT 3,1
    16.     ) as 姓名,
    17.     (SELECT s_score from score 
    18.         where score.c_id = kc.c_id 
    19.         ORDER BY score.s_score DESC LIMIT 3,1
    20.     ) as 成绩
    21. FROM course kc GROUP BY kc.c_id;

    # 3.查询学生平均成绩及其名次 

    1. set @rankScore:=0
    2. SELECT @rankScore:= @rankScore+1 as '排名',tab.* FROM
    3. (SELECT student.s_id, student.s_name, IFNULL(AVG(score.s_score),0) as avgScore
    4. FROM student 
    5. LEFT JOIN score ON score.s_id = student.s_id
    6. GROUP BY student.s_id 
    7. ORDER BY avgScore desc) tab ;

    # 4.查询各科成绩前三名的记录

    1. (SELECT s.*, sc.c_id as '课程ID', sc.s_score as "成绩"
    2. FROM student s
    3. LEFT JOIN score sc ON s.s_id = sc.s_id 
    4. WHERE sc.c_id='01' ORDER BY sc.s_score desc LIMIT 3)
    5. UNION ALL
    6. (SELECT s.*, sc.c_id, sc.s_score 
    7. FROM student s
    8. LEFT JOIN score sc ON s.s_id = sc.s_id 
    9. WHERE sc.c_id='02' ORDER BY sc.s_score desc LIMIT 3)
    10. UNION ALL
    11. (SELECT s.*, sc.c_id, sc.s_score 
    12. FROM student s
    13. LEFT JOIN score sc ON s.s_id = sc.s_id 
    14. WHERE sc.c_id='03' ORDER BY sc.s_score desc LIMIT 3)

    # 5.查询本月过生日的学生

    1. SELECT s.s_name, s.s_birth
    2. FROM student s
    3. WHERE MONTH(s.s_birth) = MONTH(CURDATE()) ;

    # 6.查询下周过生日的学生

    1. SELECT s.s_name, s.s_birth
    2. FROM student s
    3. WHERE WEEK(s.s_birth) = WEEK(NOW())+1 ;


     

  • 相关阅读:
    技术先驱视角:长城汽车工程师揭秘Hi4技术的无限潜力
    Docker最新超详细教程——Docker创建运行Redis并挂载
    Android 13.0 Launcher3定制之双层改单层(去掉抽屉式三)
    Unity Metaverse(五)、Avatar数字人换装系统的实现方案
    如何玩转盲盒商城小程序玩法
    Postman接口测试之get请求
    C语⾔内存函数
    Zookeeper常见命令
    弹性数据库连接池探活策略调研(三)——DBCP
    C语言_用于ADC数据的均值滤波算法
  • 原文地址:https://blog.csdn.net/m0_70083523/article/details/126908318