SQL语句(十四)子查询

--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
原文地址:https://www.cnblogs.com/douzujun/p/6627103.html