--1. 使用IN关键字
--例1 查询系别人数不足5人的系别中学生的学号、姓名和系别
--系别人数不足5人的系别 ==>选择条件
select Sdept
from Student
Group by Sdept
Having Count(*) < 5
--显示这些系别的学生信息
Select sno, sname, sdept
From Student
WHERE sdept IN (
select Sdept
from Student
Group by Sdept
Having Count(*) < 5
)
--2. 使用EXISTS关键字
--例2 如果“MA"系别有人的成绩大于等于90
--就把全系别的学号,姓名、班级、课程号、成绩显示出来
--查询"MA"系别成绩大于90的学生信息
select *
from Student
INNER JOIN SC ON Student.Sno = SC.Sno
WHERE Student.Sdept = 'MA' and SC.Grade >= 90
--结果有,则显示全班信息
select Sdept, SC.Sno, Sname, Cno, Grade
from Student
INNER JOIN SC ON Student.Sno = SC.Sno
WHERE Student.Sdept = 'MA' and
EXISTS ( --exists 里是一个子查询
select *
from Student
INNER JOIN SC ON Student.Sno = SC.Sno
WHERE Student.Sdept = 'MA' and SC.Grade >= 90
)
--(4)所有课程都被选修的学生学号
select Sno
From Student
Where not EXISTS
(
Select *
From Course
where not Exists
(
Select *
From SC
where Sno = Student.Sno
and Cno = Course.Cno
)
)
--3. 比较运算
--例3 显示航天班成绩在平均成绩以上的人的
--班级、学号、姓名、课程号和成绩
--所有参加考试的人的所有课程的总平均
select AVG(Grade)
from SC
--平均成绩以上的人的信息
select S.Sdept, S.Sno, S.Sname, SC.Cno, SC.Grade
from Student as S
INNER JOIN SC on S.Sno = SC.Sno
WHERE SC.Grade > ANY( -- any, 表示集合里头的任何一个都可以
select AVG(Grade)
from SC
) AND S.Sdept = 'IS'
--例4 查询学生的班级数
--首先, 查询学生来自哪些不同的班级
--该查询的结果,像是统计的数据源
SELECT distinct Sdept
From Student
--然后统计这个的个数
--把这个结果看作类似一个表一样
--写在FROM子句中
Select count(*) as 班级数
FROM (
--查询的是哪些班级
SELECT distinct Sdept
From Student
) AS S