子查询

128 阅读2分钟

关联子查询和非关联子查询

非关联子查询

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

SQL: SELECT player_name, height FROM player WHERE height = (SELECT max(height) FROM player)

通过SELECT max(height) FROM player可以得到最高身高这个数值,结果为 2.16,然后我们再通过 player 这个表,看谁具有这个身高,再进行输出,这样的子查询就是非关联子查询。

关联子查询

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

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询。

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)

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

EXISTS 子查询

关联子查询通常也会和 EXISTS 一起来使用,EXISTS 子查询用来判断条件是否满足,满足的话为 True,不满足为 False。

集合比较子查询

常用关键字

image.png
SELECT * FROM A WHERE cc IN (SELECT cc FROM B)


SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)

IN表是外边和内表进行hash连接,是先执行子查询。 EXISTS是对外表进行循环,然后在内表进行查询。 因此如果外表数据量大,则用IN,如果外表数据量小,也用EXISTS。 IN有一个缺陷是不能判断NULL,因此如果字段存在NULL值,则会出现返回,因为最好使用NOT EXISTS。 核心是尽量扫描小的数据,将大的数据使用索引。

ANY 和 ALL 都需要使用比较符,比较符包括了(>)(=)(<)(>=)(<=)和(<>)等。

SQL: SELECT player_id, player_name, height FROM player WHERE height > ALL (SELECT height FROM player WHERE team_id = 1002)

此文章为4月Day3学习笔记,内容来源于极客时间《SQL必知必会》