子查询

2019-08-06  本文已影响0人  M_3ece

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整理

上一篇下一篇

猜你喜欢

热点阅读