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;