(1) 什么是关联子查询,什么是非关联子查询 (嵌套查询)
子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询。
如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为关联子查询。
哪个球员的身高最高,最高身高是多少,就可以采用子查询的方式:
-- 非关联子查询示例
select player_name, height FROM player where height = (select max(height) from player);
首先通过select max(height) from player 得到最高身高这个数值,然后再将这个值在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);
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询
(2) EXISTS子查询
想要看出场过的球员都有哪些,并且显示他们的姓名、球员 ID 和球队 ID。在这个统计中,是否出场是通过 player_score 这张表中的球员出场表现来统计的,如果某个球员在 player_score 中有出场记录则代表他出场过,这里就使用到了 EXISTS 子查询,
select player_name, player_id, team_id from player where exists (select player_id from player_score where player.player_id = player_score.player_id);
查询球员不存在于player_score表中的数据
select player_name, player_id, team_id from player where not exists (select player_id from player_score where player.play_id = player_score.player_id);
(3) 集合比较子查询-- 与另一个查询结果集进行比较
主要查询操作符及定义:
IN 判断是否在集合中
ANY 需要与操作符一起使用,与子查询返回的任何值做比较
ALL 需要与操作符一起使用,与子查询返回的所有值做比较
SOME 实际上是ANY的别名,作用相同,一般尝试用ANY
想要看出场过的球员都有哪些,并且显示他们的姓名、球员 ID 和球队 ID。
select player_name, player_id, team_id from player where player_id in (select player_id from player_score where player.player_id = player_score.player_id);
不难看出,IN操作符和EXISTS操作符的查询结果是一致的,那么应该如何选择IN和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)
        实际上在查询过程中,在我们对 cc 列建立索引的情况下,我们还需要判断表 A 和表 B 的大小。在这里例子当中,表 A 指的是 player 表,表 B 指的是 player_score 表。如果表 A 比表 B 大,那么 IN 子查询的效率要比 EXIST 子查询效率高,因为这时 B 表中如果对 cc 列进行了索引,那么 IN 子查询的效率就会比较高。同样,如果表 A 比表 B 小,那么使用 EXISTS 子查询效率会更高,因为我们可以使用到 A 表中对 cc 列的索引,而不用从 B 中进行 cc 列的查询。
ANY 和 ALL 都需要使用比较符,比较符包括了(>)(=)(<)(>=)(<=)和(<>)等。
查询球员表中,比印第安纳步行者(对应的 team_id 为 1002)中任何一个球员身高高的球员的信息,并且输出他们的球员 ID、球员姓名和球员身高
select player_name, player_id, team_id, height from player where height > any (select height from player where team_id = 1002);
查询比印第安纳步行者(对应的 team_id 为 1002)中所有球员身高都高的球员的信息,并且输出球员 ID、球员姓名和球员身高
select team_id, player_id, player_name, height from player where height > all (select height from player where team_id = 1002);
请注意:ANY、ALL 关键字必须与一个比较操作符一起使用。因为如果你不使用比较操作符,就起不到集合比较的作用,那么使用 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;
在 player 表中只有底特律活塞和印第安纳步行者的球员数据,所以它们的 player_num 不为 0,而亚特兰大老鹰的 player_num 等于 0。在查询的时候,我将子查询SELECT count(*) FROM player WHERE player.team_id = team.team_id作为了计算字段,通常我们需要给这个计算字段起一个别名,这里我用的是 player_num,因为子查询的语句比较长,使用别名更容易理解。
查询得到场均得分大于 20 的球员。场均得分从 player_score 表中获取,同时你需要输出球员的 ID、球员姓名以及所在球队的 ID 信息
-- 使用IN
select team_id, player_id, player_name from player where player_id in (select player_id from player_score GROUP BY player_id HAVING(avg(score) > 20));
-- 使用EXISTS
select team_id, player_id, player_name from player where exists (select player_id from player_score GROUP BY player_id HAVING(avg(score) > 20) and player.player_id = player_score.player_id);
select team_id, player_id, player_name from player where exists (select player_id from player_score where player.player_id = player_score.player_id GROUP BY player_id HAVING avg(score) > 20);
-- 使用JOIN
SELECT
t2.player_id,
t2.player_name,
t2.team_id,
t3.v
FROM
player AS t2
JOIN (
SELECT
t1.player_id,
avg( t1.total ) AS v
FROM
(
SELECT
player_id,
sum( score ) AS total
FROM
player_score
WHERE
game_id IN ( SELECT game_id FROM player_score GROUP BY game_id )
GROUP BY
player_id #对球员分组,计算在每场比赛中的总分数
) AS t1
GROUP BY
t1.player_id #对球员分组,计算所参加比赛的平均数
HAVING
v > 20 #场均得分大于20
) AS t3 ON t2.player_id = t3.player_id;
1、我理解的场均得分大于20,第一场得了40分,第二场得了2分,场均为21分满足条件
2、一场比赛中,球员可以出现多次
解析思路,先得出球员在每场比赛中的总分数,然后对球员分组,计算球员在所参加比赛中的平均数

6-SQL子查询的更多相关文章

  1. sql子查询 嵌套SELECT语句

    嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele ...

  2. SQL子查询/嵌套查询

    sql子查询 嵌套SELECT语句 嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为 ...

  3. SQL 子查询,连接查询复习

    use lianxi0720 go --创建部门表 create table bumen ( bcode int primary key,--部门编号 bname ), --部门名称 bceo ), ...

  4. sql子查询

    一.子查询入门: 1.单值子查询: 单值子查询的唯一限制:子查询的返回值必须只有一行记录,而且只能有一列(又被称为标量子查询). 可以使用在select语句的列表.表达式中,以及where语句中等. ...

  5. Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  6. sql子查询在insert、update、delete中的应用

    子查询可以应用在INSERT.UPDATE以及DELETE等语句中,合理的使用子查询将能够简化功能的实现并且极大的提高SQL语句执行的效率 用到的表: CREATE TABLE `t_readerfa ...

  7. SQL 子查询 EXISTS 和 NOT EXISTS

    MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT … FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查 ...

  8. SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE

    1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...

  9. SQL查询优化思维即SQL子查询

    一. 什么叫子查询 定义及分类 子查询又称内部查询,而包含子查询的语句称之外部查询(又称主查询).所有的子查询可以分为两类,即相关子查询和非相关子查询. 非相关子查询是独立于外部查询的子查询,子查询总 ...

  10. PL/SQL 子查询

    一.概述 在一个SQL语句中嵌套另一个SQL语句成为子查询.包括单行子查询,多行子查询,多列子查询. 注意,当在DDL语句中引用子查询时,可以带有Order By子句:但是当在where子句.Set子 ...

随机推荐

  1. element的表单校验自动定位到该位置

    遇到的项目问题是在每个折叠面板里边都有不同的表单,用element上的校验时,若有没填写的表单或不符合表单格式的要求,则自动展开该折叠面板,且页面定位到没校验成功的表单   this.$refs.fo ...

  2. RDIFramework.NET敏捷开发框架 ━ 工作流程组件Web业务平台

    接前两篇: RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍 RDIFramework.NET敏捷开发框架 ━ 工作流程组件WinForm业务平台 1.RDIFramework.NE ...

  3. datatable与实体类之间相互转化的几种方法

    #region DataTable转换成实体类 /// <summary> /// 填充对象列表:用DataSet的第一个表填充实体类 /// </summary> /// & ...

  4. 使用Anaconda3的Docker镜像

    假设本地 Ubuntu 服务器已经安装好了Docker,这里讲述一下如何开始运行Anaconda3的Docker镜像: 1. 搜索镜像 搜索我们想要的anaconda镜像: docker search ...

  5. RMAN DUPLICATE DATABASE with SET NEWNAME failed: RMAN-05501 RMAN-05517 (Doc ID 387093.1)

    RMAN DUPLICATE DATABASE with SET NEWNAME failed: RMAN-05501 RMAN-05517 (Doc ID 387093.1) APPLIES TO: ...

  6. 多个git合并,并保留log历史记录

    面临的需求是:将多个git仓库作为一个单独目录,整合到一个新的git仓库中:并且保留历史记录. 1. 新建一个summary仓库 新建一个summary仓库,用于整合一系列git仓库. git clo ...

  7. 【5】Android Service 与 AIDL

    前言:本系列仅介绍基本大体的使用步骤,而不对每个步骤进行细致的讲解.读者可作为已经对相关内容有所了解后的快速查阅. 一.单应用内Service的使用 Service组件与Activity以IBinde ...

  8. CodeForces - 1251D (贪心+二分)

    题意 https://vjudge.net/problem/CodeForces-1251D 您是一个大型企业的负责人.在您的企业当中共有n位员工为您工作,而且非常有趣的事是这个n是一个奇数(n不能被 ...

  9. java8-08-创建stream流

    为什么用stream                             应用函数式编程  配合Lamdba表达式 更快操作集合类 数组      什么是 stream               ...

  10. Paper | Deep Mutual Learning

    目录 1. 动机详述和方法简介 2. 相关工作 3. 方法 3.1 Formulation 3.2 实现 3.3 弱监督学习 4. 实验 4.1 基本实验 4.2 深入实验 [算法和公式很simple ...