当前位置: 首页 > >

sql查询没有学生选的课程信息||查询选修了所有课程的学生信息

发布时间:

表dbo.Student


列名数据类型
Stu_idvarchar(10)
Stu_namevarchar(10)
Stu_sexvarchar(2)
Birthdatedatetime
Phonevarchar(8)
Addressvarchar(100)

表dbo.Course


列名数据类型
Course_idvarchar(4)
Course_namevarchar(20)
Course_hourint
Introducevarchar(200)

表dbo.StudentCourse


列名数据类型
Stu_idvarchar(10)
Course_idvarchar(4)
Gradedecimal(9, 2)

问题:查询没有学生选的课程信息
解法一:子查询查找表StudentCourse中被选的课程号;父查询表Course中的课程号不包括子查询结果


SELECT DISTINCT Course.Course_id,Course_name
FROM Course
WHERE Course.Course_id NOT IN(SELECT Course_id FROM StudentCourse)

解法二:这个解法将NOT IN换成了NOT EXISTS


SELECT DISTINCT Course.Course_id,Course.Course_name
FROM Course
WHERE NOT EXISTS
(SELECT * FROM StudentCourse WHERE StudentCourse.Course_id=Course.Course_id)

问题:查询选修了所有课程的学生信息。
解法一: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中共有几门课程



友情链接: