子查询

作者: 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整理

相关文章

  • Oracel_子查询

    SQL子查询 子查询语法 子查询 (内查询) 在主查询之前一次执行完成。 子查询的结果被主查询(外查询)使用 。 ...

  • Oracle | 子查询和伪列

    1. 子查询 (1)单行子查询 (2)多行子查询 1)ANY子查询 2)ALL 子查询 2. 伪列...

  • 《SQL必知必会》第 11 课 使用子查询

    目标: 11.1 子查询 11.2 利用子查询进行过滤 11.3 作为计算字段使用子查询 11.1 子查询 查询(...

  • MySQL 子查询

    什么是子查询 为什么要使用子查询 子查询的分类 怎样使用子查询 关联子查询 要使用的数据表 1. 什么是子查询? ...

  • 数据库第七天

    子查询 查询里面还有查询注意: 子查询优先于主查询执行 最好子查询用括号 查询比ALLEN工资高的员工信息 单行子...

  • SQL查询_高级查询

    SQL查询_高级查询 一、子查询 子查询出现的位置一般为条件语句,oracle会先执行子查询,再执行父查询,子查询...

  • 17/12/6 子查询

    17/12/6 子查询 单行子查询 括号内的查询叫做子查询,也叫内部查询,先于主查询的执行。 子查询可以嵌入1.w...

  • MySql(七)子查询与虚表

    一、子查询 子查询在主查询前执行一次 主查询使用子查询的结果 子查询要用括号括起来 将子查询放在比较运算符的右边 ...

  • 数据分析之SQL子查询

    文章阅读路线: SQL子查询概念 独立子查询实例 相关子查询实例 SQL子查询常见玩伴 1.SQL子查询概念 子查...

  • MySql基础-子查询

    一、子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中。 子查询用()括起来 子查询,又叫内部查询,相对...

网友评论

      本文标题:子查询

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