相关子查询 与非相关子查询

别妄想泡我
678次浏览
2021年02月11日 16:46
最佳经验
本文由作者推荐

-

2021年2月11日发(作者:拳道)


相关子查询



与非相关子查询



1

< br>:标量子查询


(


相对于多值子查询


)




只有标量子查询返回的是单个 记录或者不返回,就是有效的子查询。



Ex1:


select


OrderId


From


Orders


where


EmployeeId


=



(


select


EmployeeId


From


employees


where


lastName


like


N


'Davolio'


)


< p>


’Davolio’


改为


'D%'



,


这个时候子查询中返回 结果为


2



,


等号右边此时为多值


,


查询失败


.



’=’


改为


in


谓词


.


查询才能通过

< br>.



employees


表中无


lastname=’jason’,


外部查询将返回


null.





2


:非相关子查询(嵌套子查询)




一个


select...From ...Where


查询语句块可以嵌套在另一个


select. ..From...Where


查询块的


Where

< p>




中,称为嵌套查询 。外层查询称为父查询,主查询。内层查询称为子查询,从查询。


子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。子查询中不能有


o rder by


分组语句。



先处理子查询,再处理父查询。



细分如下:



1




简单嵌套查询




查询选修课程号为


'101'


并且成绩高于学生 号为


'9501101'


的所有学生的成绩

.


select * from sclass


where cno='101' and degree>=


(select degree from sclass where sno='9501101'and cno='101')



当子查询跟随在


=



!=



<


< br><=



>


>=


之后,



子查询的返回值只能是一个,



否则应 在外层


where


子句中用



一个


in


限定符


,


即要返回多个值,要用


in


或者

< p>
not in



2





[not] in


的嵌套查询





只要主查询中


列或运算式

< p>
是在(不在)子查询所得结果列表中的话,则主查询的结果为我们要的数据



select sales_id,tot_amt


from sales


where sale _id in(select sale_id from employee where sex='F')


where sno not in(Select distinct sno from sclass)





3





exists


的嵌套查询




子查询的结果至少存在一条数据时,则主查询的结果为我们要 的数据。(


exists


)或自查询的结果找不到


数据时,则主查询的结果为我们要的数据


(not exists)



我们经常查询的两个表有多少重复的记录就用这个




以下范例让你找出滞销的产品,也就是尚未有任何销售记录的 库存产品。此范例主要是查询以库文件中的


每一条产品代码到销售明细表中去查询,如果 查询不到任何一条,表示该产品未曾卖出任何一件。



select * from stock a


where not exists(select * from sale_item b


where _id=_id and _id=_id)


4.


select ... where


列或运算式



比较运算运算【


any|all](


子查询)





只要主查询中


列或运算式与子查询所得结果中任一



any



或全部



all



数据符合比较条件的


< br>则主查询的结果为我们要的数据



select sale_id,tot_amt


from sales


where tot_amt>any(select tot_amt from sales where sale_id='e0013'and 'order_date='


1996/11/10')



选出不同的人金额最高的订单



select * from sales a


where tomat=(select max(totmat) from sales where name=)




3


:相关子查询(多值子查询)



1>


非相关子查询是独立于外部查询的子查询,子查询总共执行一次 ,执行完毕后将值传递给外部查询。



2>

< br>相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。




查询中再查询


,


通常是以一个查询作为条件来供另一个查询使用





:



wor k


表和部门表



< /p>


A:


检索出在部门表中登记的所有部门的职工基本资料

< p>



select * from work where


部门编号


in [not in](select


部门编号


from dbo.




)



B:


检索出在


work


表中每一个部门的最高基本工资的职工资料




select * from work a where


基本工资


=(select max(


基本工资


) from work b


where a.


部门名称


=b.


部门名称


)


< /p>


说明


:


由外查询提供一个部门名称给内查 询


,


内查询利用这个部门名称找到该部门的最

< br>高基本工资


,


然后外查询根据基本工资判断是否等于最高 工资


,


如果是的


,

则显示出来


.



相当于


:select * from work,(select


部门名称


,max(


基本工资


) as


基本工资


from


work group by


部门名称


as t) where wo rk.


基本工资


=t.


基本工资


and work.


部门名称


=t.


部门名称




C:


用嵌套


work


表和嵌 套部门表


,


在嵌套


work

< p>
表中检索出姓名和职工号都在嵌套部门存


在的职工资料



select * from


嵌套


work where


职工号


in (select


职工号


from


嵌套部门


) and




in (select


姓名


from


嵌套部门


) [


察看结果


,


分析原因


]


(错误,因 为这两个


in


不是一对一





:select * from


嵌套


work a,


嵌套部门


b where a.


职工号


=b.


职工号


and a.< /p>


姓名


=b.


姓名


-


-


-


-


-


-


-


-