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同学的一致;