SQL语句(十四)子查询

本文介绍并演示了SQL子查询的应用技巧,包括使用IN和EXISTS关键字进行子查询的方法,以及如何利用比较运算符来筛选数据。通过具体实例,如查询特定条件下的人数统计或学生成绩等,加深读者对子查询的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

posted @ 2017-03-27 15:48 douzujun 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值