子查询

作者: M_3ece | 来源:发表于2019-08-06 14:59 被阅读0次

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

    相关文章

      网友评论

          本文标题:子查询

          本文链接:https://www.haomeiwen.com/subject/uqpidctx.html