阅读 184

数据库关联子查询和非关联子查询

数据库关联子查询和非关联子查询

非关联子查询:数据库嵌套查询中内层查询是完全独立于外层查询的。
执行顺序:
先执行内层查询
得到内层查询的结果后带入外层,再执行外层查询
select * from tableA where tableA.column = (select tableB.column from tableB )
1
关联子查询:数据库嵌套查询中内层查询和外层查询不相互独立,内层查询也依赖于外层查询。
执行顺序:

先从外层查询中查询中一条记录
再将查询到的记录放到内层查询中符合条件的记录,再放到外层中查询
重复以上步骤
例如:
select * from tableA where tableA.cloumn < (select column from tableB where tableA.id = tableB.id))
1
所以是:先查询到到一条tableA的记录;
进入内层查询,根据tableA.id在tableB中找到满足tableB.id与之相等的记录,如果找到符合A表那条记录的column值<B表该条记录的column值,则A表那条记录满足条件,则查询输出一条记录。
找到外层查询的下一条记录,重复以上步骤,直到A表记录查询完毕。
由此可见:关联子查询的查询时交叉进行的。

 

子查询虽然是一种嵌套查询的形式,不过我们依然可以依据子查询是否执行多次,从而将子查询划分为关联子查询和非关联子查询。

子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询。

同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为关联子查询。

 

非关联子查询可以写成join表关联的模式

 

想要查找每个球队中大于平均身高的球员有哪些,并显示他们的球员姓名、身高以及所在球队ID。

 

非关联子查询的写法为:

首先我们需要统计球队的平均身高,即SELECT avg(height) FROM player AS b WHERE a.team_id = b.team_id,然后筛选身高大于这个数值的球员姓名、身高和球队ID

SELECT player_name, height, team_id FROM player AS a WHERE height > (SELECT avg(height) FROM player AS b WHERE a.team_id = b.team_id)

 

join表关联的写法为:

select c.player_name,c.height,c.team_id from (select a.player_id,a.team_id,a.player_name,a.height,b.heih from player a left join (select team_id,avg(height) as heih from player group by team_id) b on a.team_id=b.team_id) c where c.height>c.heih 


————————————————
版权声明:本文为CSDN博主「、留白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43323867/article/details/107499968


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐