问题:查询选修了所有课程的学生信息。
表dbo.Student
列名 | 数据类型 |
---|---|
Stu_id | varchar(10) |
Stu_name | varchar(10) |
Stu_sex | varchar(2) |
Birthdate | datetime |
Phone | varchar(8) |
Address | varchar(100) |
表dbo.Course
列名 | 数据类型 |
---|---|
Course_id | varchar(4) |
Course_name | varchar(20) |
Course_hour | int |
Introduce | varchar(200) |
表dbo.StudentCourse
列名 | 数据类型 |
---|---|
Stu_id | varchar(10) |
Course_id | varchar(4) |
Grade | decimal(9, 2) |
解法一:1.要确保可以找到学生的全部信息;2.选修了所有课程等于Course表里课都被选
双重否定NOT EXISTS 表示肯定
SELECT *
FROM Student
WHERE NOT EXISTS -- 没有一个学生能够满足以下条件
(SELECT * FROM Course WHERE NOT EXISTS --条件:没有选过course表里的课
(SELECT * FROM StudentCourse WHERE StudentCourse.Stu_id=Student.Stu_id
AND StudentCourse.Course_id=Course.Course_id))
解法二:若一个学生所选修的课程数与总课程数相同,则这位学生选修了所有课程
SELECT *
FROM Student
WHERE (SELECT COUNT(*) FROM StudentCourse
WHERE Student.Stu_id=StudentCourse.Stu_id)=(SELECT COUNT(*) FROM Course)
解法三:使用group by和having子句
SELECT *
FROM Student
WHERE Stu_id IN(SELECT Stu_id FROM StudentCourse
GROUP BY Stu_id --根据Stu_id分组,统计每个学生选修了几门课程,若等于Course的总数,就是要找的Stu_id
HAVING COUNT(*)=(SELECT COUNT(*) FROM Course)) --统计course中共有几门课程