子查询
SQL的子查询
即嵌套在查询中的查询, 好处是可以让我们进行更复杂的查询, 同时更加容易理解查询的过程.
掌握内容:
1. 子查询可以分为关联子查询和非关联子查询
2. 子查询中有一些关键词, 可以方便我们对子查询的结果进行比较, 比如存在性检测子查询, 即 EXISTS子查询, 以及集合比较子查询, 其中集合比较子查询关键词有IN,SOME, ANY和ALL, 其作用是什么
3.子查询也可以作为主查询的列, 我们如何使用子查询作为计算字段出现在 SELECT 查询中
什么是关联子查询, 什么是非关联子查询
按照子查询执行的次数划分:
非关联子查询: 如果数据结果只执行一次, 且作为主查询的条件进行执行.
关联子查询: 如果子查询需要执行多次, 即采用循环的方式, 先从外部查询开始, 每次传入子查询进行查询,然后再将结果反馈给外部, 这种嵌套的执行方式就称为关联子查询.
例1:
查找每个球队中大于平均身高的球员, 显示球员姓名, 身高以及所在球队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 查询
EXISTS子查询用来判断条件是否满足, 满足为True, 不满足为False
例2:
查找出场过的球员, 并显示姓名,球员ID, 球队ID.
如果某个球员在 player_score 中有出场纪录则代表他出场过, 使用EXISTS查询. EXISTS(SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id) 将它作为筛选条件.
SELECT player_id, team_id, player_name FROM player AS p
WHERE EXISTS (SELECT player_id FROM player_score AS ps WHERE p.player_id = ps.player_id);
集合比较子查询
作用: 与另一个查询结果进行比较, 可以在子查询中使用 IN, ANY, ALL 和 SOME 操作符
例2:
SELECT player_id, team_id, player_name FROM player AS p
WHERE player_id IN (SELECT player_id FROM player_score AS ps WHERE p.player_id = ps.player_id);
IN 和 EXISTS 区别
SELECT * FROM A WHERE cc IN (SELECT cc FROM B) ## IN 内表循环
SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc = A.cc) ## EXISTS 外表循环
实际查询过程中, 在我们对 cc 列建立索引的情况下, 还需要判断表A和表B的大小. 如果表A比表B大, 那么IN子查询的效率要比 EXISTS 子查询效率高.
ANY ALL等操作例
例3:
查询球员表中, 比印第安纳步行者(team_id = 1002)中任何一个球员身高高呃球员们的信息, 并输出它们的球员ID, 球员姓名和球员身高.
首先找出所有印第安纳步行者队中的球员身高 SELECT height FROM player WHERE team_id=1002,然后使用 ANY 子查询
SELECT player_id, player_name, height FROM player
WHERE height > ANY(SELECT height FROM player WHERE team_id = 1002);
强调: ANY, ALL 关键字必须与一个比较操作符一起使用.
将子查询作为计算字段
例4:
查询每个球队的球员数, 对应 team 表. 查询相同的 team_id 在 player 表中所有的球员数量是多少
SELECT team_name, (SELECT count(*) FROM player WHERE player.team_id = team.team_id ) AS player_num FROM team;
SELECT player_id, player_name, team_id FROM player AS p
WHERE player_id IN
(SELECT player_id FROM player_score AS ps GROUP BY ps.player_id HAVING avg(score)>20);
极客: SQL必知必会09整理