嵌套查询:相关子查询与非相关子查询
2019-12-30 本文已影响0人
mayiwoaini
转自:https://blog.csdn.net/qq_26937525/article/details/53930498
嵌套查询
一个select…From…Where查询语句块可以嵌套在另一个select…From…Where查询块的Where子句中,称为嵌套查询。
外层查询称为父查询,主查询。内层查询称为子查询,从查询。
子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。
关于子查询注意:
- 子查询中不能有order by分组语句。(因为子查询只是个中间结果,分组等是作用于最后的结果拥有显示)
- 子查询一定要用( )包围
#非相关子查询
简单嵌套查询
查询选修课程号为’101’并且成绩高于学生号为’9501101’的所有学生的成绩。
select * from sclass
where cno='101' and degree>=(select degree from sclass where sno='9501101'and cno='101')
-------------------------------------------------------
当子查询跟随在 =、!=、<、<=、>、>=之后,子查询的返回值只能是一个, 否则应在外层where子句中用一个in限定符,即要返回多个值,要用in或者not in
带[not] in的嵌套查询
只要主查询中列或运算式是在(不在)子查询所得结果列表中的话,则主查询的结果为我们要的数据
select sales_id,tot_amt
from sales
where sale _id in(select sale_id from employee where sex='F')
相关子查询
带exists的嵌套查询
子查询的结果至少存在一条数据时(exists),或子查询的结果找不到数据时(not exists),则主查询的结果为我们要的数据。
以下范例让你找出滞销的产品,也就是尚未有任何销售记录的库存产品。此范例主要是查询以库文件中的每一条产品代码到销售明细表中去查询,如果查询不到任何一条,表示该产品未曾卖出任何一件。
select * from stock a
where not exists(select * from sale_item b where a.prod_id=b.prod_id and a.stup_id=b.stup_id)
非相关子查询和相关子查询区别
- 非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询,并且它是优先于外部查询先执行的,他执行了再执行外部。
- 相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。并且是外部先查询一次,然后再执行一次内部查询!(由于他执行查询的次数多,可见他的效率并不高,可以用存储过程来代替他)