06 子查询

作者: leacoder | 来源:发表于2019-07-02 23:32 被阅读0次

目录链接:https://www.jianshu.com/p/2c104aaadb03

关联子查询与非关联子查询

关联子查询:子查询的执行与主查询相关,需执行多次

非关联子查询:子查询的执行与主查询执行无关,只需执行一次

想要知道哪个球员的身高最高, 最高身高是多少, 就可以采用子查询的方式:

SELECT player_name, height FROM player WHERE height = (SELECT max(height) FROM player);
球员的身高最高.png

通过 SELECT max(height) FROM player,可以得到最高身高这个数值,通过最高身高2.16在player 这个表中可以查询到谁具有这个身高,属于非关联子查询

如果子查询的执行依赖于外部查询, 通常情况下都是因为子查询中的表用到了外部的表, 并进行了条件关联, 因此每执行一次外部查询, 子查询都要重新计算一次, 这样的子查询就称之为关联子查询。

要查找每个球队中大于平均身高的球员有哪些, 并显示他们的球员姓名、身高以及所在球队 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);
大于平均身高的球员.png

SELECT avg(height) FROM player AS b WHERE a.team_id = b.team_id 子查询依赖于外部查询(a.team_id = b.team_id)

子查询关键字

EXIST 子查询

EXIST 子查询用来判断条件是否满足, 满足的话为True, 不满足为 False。NOT EXIST 就是不存在的意思。

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);
是否出场.png

集合比较子查询

与另一个查询结果集进行比较, 我们可以在子查询中使用IN、 ANY、 ALL和 SOME 操作符

IN 判断是否在集合中
ANY 与比较操作符一起使用,与子查询返回的任何值做比较
ALL 与比较操作符一起使用,与子查询返回的所有值做比较
SOME 实际上是ANY的别名,作用相同,一般常使用ANY
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);
是否出场.png

期查询结果和使用EXISTS结果一样

可抽象两种模式为:

SELECT * FROM A WHERE cc IN (SELECT cc FROM B)

SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)

如果表 A 比表 B 小, 那么IN子查询的效率要比EXIST 子查询效率高, 因为这时 B 表中如果对 cc 列进行了索引, 那么 IN 子查询的效率就会比较高。同样, 如果表 A 比表 B 大, 那么使用EXIST 子查询效率会更高, 因为我们可以使用到 A 表中对 cc列的索引,而不用从 B 中进行 cc 列的查询。

SELECT player_id, player_name, height FROM player WHERE height > ALL (SELECT height FROM player WHERE team_id = 1002);
image.png

将子查询作为计算字段

SELECT team_name, (SELECT count(*) FROM player WHERE player.team_id = team.team_id) AS player_num FROM team;
image.png 子查询.png

参考资料:

注:
练习数据库使用 SQL必知必会专栏(极客时间)中的作者提供的 王者荣耀数据库以及NBA数据库
练习系统 MySQL Server version: 5.7.26-0ubuntu0.16.04.1 (Ubuntu)

极客时间 SQL必知必会学习

SQL必知必会专栏(极客时间)链接:
http://gk.link/a/103Sm

《MySQL必知必会》学习笔记(9-14):

https://www.jianshu.com/p/6db64562d2c6

此篇内容:用正则表达式进行搜索、创建计算字段、使用数据处理函数、汇总数据、分组数据、使用子查询


GitHub链接:
https://github.com/lichangke/LeetCode

知乎个人首页:
https://www.zhihu.com/people/lichangke/

简书个人首页:
https://www.jianshu.com/u/3e95c7555dc7

个人Blog:
https://lichangke.github.io/

欢迎大家来一起交流学习

相关文章

  • 06 子查询

    目录链接:https://www.jianshu.com/p/2c104aaadb03 关联子查询与非关联子查询 ...

  • 06 SQL子查询

    子查询 接下来将统计每天每个渠道的所有事件, 最后一步是在创建的事件列中计算平均值,为此,我们需要在上述查询结果中...

  • 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(七)子查询与虚表

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

网友评论

    本文标题:06 子查询

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