• MySQL练习题


    7、查询 既然学过课程1也学过课程2的同学

    SELECT student_id FROM score WHERE course_id=1 or course_id=2 GROUP BY student_id HAVING COUNT(course_id)>1;

    知识点:course_id=1,COUNT(course_id)>1,SQL语句支持比较、数学运算符;(<,>,=,+,-)
    1、course_id=1
    2、WHERE course_id=1 or course_id=2 or和and的区别,如果此处使用会报错,因为没有一行的course_id既=1也=2;
    3、HAVING COUNT(course_id)>1,对GROUP BY分组之后的结果,进行二次筛选必须使用 having;

    4、SQL支持条件运算符:条件1 or 条件2 只要符合 or 两侧的条件都会被查询到(注意); 


    8、查询李平老师所教的所有课程的同学的学号和姓名;

    SELECT * FROM score WHERE course_id in
    (SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE teacher.tname="李平老师")
    GROUP BY student_id HAVING COUNT(course_id)=(SELECT COUNT(cid) FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE teacher.tname="李平老师");

    知识点:
    in()后面可以包含SQL

    思路:
    1、先找出李平老师任课的课程ID
    2、在成绩表找出 学习这些课程ID的同学ID
    (注意:假设李平老师教了2门课,有些同学可能只学了1门)


    9、查询 001课程 比002 课程 低的所有同学;
    SELECT A.sid FROM
    (SELECT * FROM score WHERE course_id=1) as A
    INNER JOIN
    (SELECT * FROM score WHERE course_id=2) AS B
    on A.student_id=B.student_id
    WHERE A.num < B.num;

    思路:
    1、找到所有001课程的成绩,做成临时表;
    2、找到所有002课程的成绩,做成临时表;
    3、要想对比只能连表成一行,再where;

    知识点:
    临时表:保存临时的查询结果;
    表内容连接:INNER JOIN 两有外键关系的表连接,没有NONE数据;
    条件查询:WHERE 条件可以同时选择两列数据相对比,得出行;
    条件查询的结果:对比的是列,查询到的结果是行数据;
    SELECT * FROM student WHERE 列1=1 and 列2=1;(求列1=1和列2=2的行)

    10、查询课程成绩小于 60分的同学的学号和姓名;
    方法1:group BY 分组 去重
    SELECT student_id FROM score WHERE num <60 GROUP BY student_id;
    方法2:ditinct (去重)
    SELECT DISTINCT student_id FROM score WHERE num <60;

    知识点:
    DISTINCT 列: 去重功能

    思路:
    该题比较简单 where查询 分数小于60的行,根据studen_id去重即可;


    11、查询没有学全所有课程的同学的学号和姓名;

    知识点:
    取反运算符: !=
    coun(1):可以查看表中一共总行数

    思路:
    1、查找到所以课程的总数
    2、在成绩表,查找到 课程总数 不等于 总课程数量的同学;
    3、在学生表 in 查询

     

    12、查询 课程和 001号同学所学的课程相同的同学学号和姓名;

    SELECT * FROM score WHERE student_id in
    查询报名课程和001号同学相同的同学,由于这些同学还有可能报名了其他课程,所以要查询 数量是否相等
    (SELECT student_id FROM score WHERE student_id !=1 GROUP BY student_id HAVING COUNT(course_id)=(SELECT COUNT(1) FROM score WHERE student_id=1))
    AND
    继续查询 这些同学的课程是否一致
    course_id in (SELECT course_id FROM score WHERE student_id=1)
    因为 in(1,2,4)是模糊匹配, 报名1,2,3的同学也会被匹配到,所以需要继续 GROUP BY查看数量是否一致?
    GROUP BY student_id HAVING COUNT(student_id)=(SELECT COUNT(1) FROM score WHERE student_id=1);

    知识点:
    1、SQL表查询本质就是查询到一个表,再在此基础上查询;
    2、where可以放在 GROUP BY 前面使用;
    3、in (1,2,3)是做得模糊匹配;
    例如SELECT * FROM score WHERE course_id in (2,3)只要报名课程 1,2,3的同学都会被匹配到,不管有没有报名其他课程;

    查询和001同学,报名课程相等的同学
    SELECT student_id FROM score WHERE student_id !=1 GROUP BY student_id HAVING COUNT(course_id)=3;

    思路

    -- SELECT course_id FROM score WHERE student_id=1 ;
    SELECT COUNT(1) FROM score WHERE student_id=1 阿根选课 1,2,4,课程总数3;
    1、先找到001号同学所学习的全部课程和课程总数量
    2、在成绩表 查看和该同学,报名课程数量 相等 并且 课程相同;
    3、再进一步检查 这类同学所学的课程 是否和 001同学的一致;

    吴佩琪博客:http://www.cnblogs.com/wupeiqi/p/5748496.html

  • 相关阅读:
    大工程(bzoj 3611)
    消耗战(bzoj 2286)
    Computer(hdu 2196)
    文件排版(codevs 1300)
    洛谷 P2015 二叉苹果树
    洛谷 P2014 选课
    洛谷 P1352 没有上司的舞会
    COGS 505. 城市
    洛谷 P1306 斐波那契公约数
    洛谷 P1962 斐波那契数列
  • 原文地址:https://www.cnblogs.com/sss4/p/6985871.html
Copyright © 2020-2023  润新知