嵌套查询(2020-3-25 )

1.查询选修了2号课程的学生的姓名

  • in谓词(从内向外)
    • 典型的不相关子查询
    • 将内层结果作为外层条件
    • 可以用连接谓词and替代(连接查询)
 select Sname
 from student
 where sno in
 (
 select sno
 from sc
 where cno = '2'
 );

2.查询与“刘晨”在同一个系的学生 先确定系名,再查询该系的学生

select *     --sno,sname,sdept /*根据系名确定信息*/
from student
where sdept in 
(select sdept /*确定 刘晨 所在系的系名*/
 from student 
 where sname = '刘晨');

3.找出每个学生超过他选修课程平均成绩的课程号(典型的相关子查询:父查询给子查询提供条件)
比较查询

select sno,cno
from sc s1
where s1.grade> /*找出sno,然后将sno传入子查询进行比较查询,如果符合子查询的条件,就传出cno*/
(select avg(grade)
from sc s2      /*给sc起别名,因为父查询和子查询都是sc*/
where s1.sno = s2.sno);

带有 any 和 all 不相关子查询(可以用max和min代替)
4.查询其他系中比信息系任意一个(其中某一个)学生年龄小的学生姓名和年龄 这个例子属于不相关子查询

select sname,sage
from student
where sage < any  /*也可以将any换成some*/
(
select sage
from student
where sdept = 'IS')
and sdept <> 'IS';/*这是父查询中的条件,此约束保证所选学生不属于信息系*/
--也可以用max,注意大于小于号 any即存在
select sname,sage
from student
where sage<   
--(
select max(sage)
from student
where sdept = 'IS')
and sdept <> 'IS';

5.查询其他系中比计算机科学系所有学生年龄小的学生的姓名和年龄

select sname,sage
from student
where sage<all
(select sage /*选出计算机系所有学生的年龄*/
from student
where sdept='CS')
and sdept<>'CS'; /*父查询中的条件,此约束表示所选的学生不属于计算机系*/
 /*也可以用min,注意大于小于号 但是如果数据中有NULL的话,结果是不一样的,
 上面的查询没有结果(会把null当做最小值,所以没有比它更小的),
 下面的正常显示(会忽略掉NULL所在的元组)*/
--也可以用min,注意大于小于号 all即所有
select sname,sage
from student
where sage<
(select min(sage) /*选出计算机系所有学生的年龄*/
 from student
 where sdept='CS')
and sdept<>'CS';  /*父查询中的条件,此约束表示所选的学生不属于计算机系*/
  • in谓词(从内向外)
    • 典型的不相关子查询
    • 将内层结果作为外层条件
    • 可以用连接谓词and替代(连接查询)
  • 关于null
    • 在聚集函数中会忽略掉所查询的关键词是null的元组
    • 在 any / all 中则不会将null忽略掉
    • null表示最小的,即没有比它更小的,所以在用min和any/all的时候结果会有所不同(前者忽略null元组有结果,后者没有结果)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值