子查询就是嵌套查询
子查询分为关联子查询非关联子查询

1. 两种子查询

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

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

image.png

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

表 a 中的 team_id不同的

#  查询每个球队中大于球队内的平均身高的球员有哪些

# 统计球队的平均身高
SELECT avg(height) FROM player AS b WHERE a.team_id = b.team_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)

image.png

2. EXISTS子查询

EXISTS用于判断条件是否满足

#  出场过的球员有哪些

EXISTS (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id)

SQL:SELECT player_id, team_id, player_name FROM player WHERE EXISTS (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id)

同理,NOT EXISTS就是不存在的信息。

3. 集合比较子查询

image.png