SQL查询选修了所有课程的学生信息

问题:查询选修了所有课程的学生信息。
表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中共有几门课程
发布了14 篇原创文章 · 获赞 2 · 访问量 624

猜你喜欢

转载自blog.csdn.net/zys_shan/article/details/105604485