王秀文的博客

MySQL 子查询

发布
分类
MySQL
篇幅
360 字 / 1 分钟
阅读
396

子查询

非关联子查询

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

-- 查找最高身高的球员的身高和名字
SELECT player_name, height FROM player WHERE height = (SELECT max(height) FROM player);

关联子查询

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

eg1:

-- 查找每个球队中大于平均身高的球员有哪些,并显示他们的球员姓名、身高以及所在球队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);

EXISTS子查询

-- 出场过的球员都有哪些,并且显示他们的姓名、球员ID和球队ID
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);
SELECT player_id, team_id, player_name FROM player WHERE NOT EXISTS (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id);

集合比较子查询

IN、ANY、ALL、SOME这些关键字是用于集合比较的,SOME是ANY的别名,当我们使用ANY或ALL的时候,一定要使用比较操作符

关键字 说明
IN 判断是否在集合中
ANY 需要与比较操作符一起使用,与子查询返回的任何值作比较
ALL 需要与比较操作符一起使用,与子查询返回的所有值作比较
SOME ANY 的别名,一般使用ANY

-- 对cc列建立索引
-- 如果表A比表B大,那么IN子查询的效率要比EXIST子查询效率高,因为这时B表中如果对cc列进行了索引,那么IN子查询的效率就会比较高。
-- 如果表A比表B小,那么使用EXISTS子查询效率会更高,因为我们可以使用到A表中对cc列的索引,而不用从B中进行cc列的查询。
SELECT * FROM A WHERE cc IN (SELECT cc FROM B);
SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc);

eg1:

SELECT player_id, team_id, player_name FROM player WHERE player_id in (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id);

子查询作为计算字段

把主查询的结果作为子查询的列

SELECT team_name, (SELECT count(*) FROM player WHERE player.team_id = team.team_id) AS player_num FROM team;