-- 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
-- mark一下,"一个表当两个表用"
SELECT a.* ,b.s_score AS 01_score,c.s_score AS 02_score FROM
student a
JOIN score b ON a.s_id=b.s_id AND b.c_id='01'
LEFT JOIN score c ON a.s_id=c.s_id AND c.c_id='02' OR c.c_id = NULL WHERE b.s_score>c.s_score
-- 也可以这样写
SELECT a.*,b.s_score AS 01_score,c.s_score AS 02_score FROM student a,score b,score c
WHERE a.s_id = b.s_id
AND a.s_id = c.s_id
AND b.c_id = '01'
AND c.c_id = '02'
AND b.s_score > c.s_score
-- 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数
SELECT a.* ,b.s_score AS 01_score,c.s_score AS 02_score FROM
student a LEFT JOIN score b ON a.s_id=b.s_id AND b.c_id='01' OR b.c_id=NULL
JOIN score c ON a.s_id=c.s_id AND c.c_id='02' WHERE b.s_score < c.s_score
-- 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
SELECT b.s_id,b.s_name,ROUND(AVG(a.s_score),2) AS avg_score FROM
student b
JOIN score a ON b.s_id = a.s_id
GROUP BY b.s_id,b.s_name HAVING avg_score >=60;
-- 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
-- (包括有成绩的和无成绩的)
SELECT a.s_id 学生编号,ROUND(AVG(a.s_score),2) 平均成绩, b.s_name 学生姓名 FROM score a
LEFT JOIN student b ON a.`s_id` = b.`s_id`
GROUP BY a.s_id ,b.s_name
HAVING AVG(a.s_score) < 60
UNION
SELECT a.s_id 学生编号,0 平均成绩, a.s_name 学生姓名 FROM student a
WHERE a.`s_id` NOT IN (SELECT DISTINCT score.s_id FROM score)
-- 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
SELECT s.s_id 编号, s.s_name 姓名, COUNT(*) 选课数量, SUM(c.s_score) 总成绩
FROM student s LEFT JOIN score c ON s.s_id = c.s_id
GROUP BY s.s_id, s.s_name
-- 6、查询"李"姓老师的数量
SELECT COUNT(*) FROM teacher WHERE t_name LIKE '李%';
SELECT COUNT(1) FROM teacher WHERE t_name LIKE '李%';
SELECT COUNT(t_id) FROM teacher WHERE t_name LIKE '李%';
-- 7、查询学过"张三"老师授课的同学的信息
-- 解法1
SELECT s1.* FROM student s1 LEFT JOIN score s2 ON s1.`s_id` = s2.`s_id`
WHERE s2.`c_id` IN
(SELECT c.`c_id` 课程号 FROM
teacher t LEFT JOIN course c
ON t.`t_id` = c.`t_id`
WHERE t.`t_name` = '张三')
-- 解法2
SELECT a.* FROM student a
LEFT JOIN score b ON a.s_id = b.s_id
WHERE b.c_id IN
(SELECT c_id FROM course WHERE t_id = (SELECT t_id FROM teacher WHERE t_name = '张三'))
-- 8、查询没学过"张三"老师授课的同学的信息
-- 把第7题中的 in 换为 NOT IN 就是第8题的结果了吗?当然不是。
-- 正确思路:首先查询出张三授课的全部课程编码集合A,然后查询出每个学生所选的全部课程编码集合B,查询出B中编码出现在A中的对应的每条记录的学生学号集合,
-- 不在该集合中的学生即为结果
SELECT * FROM
student s
WHERE s.s_id NOT IN(
SELECT a.s_id FROM student a JOIN score b ON a.s_id=b.s_id WHERE b.c_id IN(
SELECT a.c_id FROM course a LEFT JOIN teacher b ON a.t_id = b.t_id WHERE t_name ='张三'));
-- 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
-- 解法1 *** mark一下这种解法
SELECT a.* FROM
student a,score b,score c
WHERE a.s_id = b.s_id AND a.s_id = c.s_id AND b.c_id='01' AND c.c_id='02';
-- 解法2 :查出选课01的学生编号(记为A),查询选课02的并且出现在A中的学生编号,相当于二者取交集(即为应求的学生编号的集合)。
-- 注:mysql没有支持交集的关键字,只好采用in实现取两个查询结果的交集
SELECT s.* FROM student s WHERE s.s_id IN (
SELECT t.s_id FROM score t WHERE t.c_id = '02' AND t.s_id IN (SELECT t.s_id FROM score t WHERE t.c_id = '01'))
-- 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
SELECT s.* FROM student s WHERE s.s_id IN (
SELECT t.s_id FROM score t WHERE t.c_id = '01' AND t.s_id NOT IN (SELECT t.s_id FROM score t WHERE t.c_id = '02'))