史上最简单的 MySQL 教程(三十二)「子查询(下)」
子查询
子查询:sub query
,查询是在某个查询结果之上进行的,一条select
语句内部包含了另外一条select
语句。
行子查询
行子查询,返回的结果可以使一行多列或者多行多列。
需求:查询学生表中,年龄最大且身高最高的学生。
思路:
- 先确定数据源,学生表。
select * from student where age = ? and height = ?;
- 然后确定最大年龄和最大身高。
select max(age), max(height) from student;
执行如下 SQL 语句,进行测试:
-- 列子查询
select * from student where
-- 其中,(age, height) 称之为行元素
(age, height) = (select max(age), max(height) from student);
- 1
- 2
- 3
- 4
表子查询
表子查询,返回的结果是多行多列二维表(将子查询的结果当做二维表来使用),实际上,任何查询返回的结果都可以称之为二维表。
需求:找出每个班身高最高的学生。
思路:
- 先确定数据源,将学生按身高进行降序排序。
select * from student order by height desc;
- 从每个班级选出第一个学生。
select * from student group by c_id;
在这里,我们可能会有些疑问:为什么要将学生表降序排序?为什么从每个班级选出第一个学生就可以?这是因为group by
(分组)只会取表中分组字段的第一条记录,而当我们将学生表按身高降序排序时,(每组)身高最高的学生就会出现在第一位。
执行如下 SQL 语句,进行测试:
-- 表子查询
select * from
-- 关键字 from 后面接表名
(select * from student order by height desc) as student
-- 按 c_id 进行分组
group by c_id;
- 1
- 2
- 3
- 4
- 5
- 6
由上面的 SQL 语句可知,表子查询也是from
子查询,即有select
语句位于from
之后。
exists
子查询
exists
:表示是否存在的意思,因此exists
子查询就是用来判断某些条件是否满足(跨表),exists
是接在where
之后,其返回的结果为1
或0
,满足条件为1
,反之为0
.
需求:在班级存在的前提下,查询所有的学生。
思路:
- 先确定数据源。
select * from student where ?;
- 然后确定条件是否满足。
exists(select * from class);
执行如下 SQL 语句,进行测试:
-- exists 子查询
select * from student where
exists(select * from class);-- 添加限定条件,满足条件
select * from student where
exists(select * from class where id = 3);-- 添加限定条件,不满足条件
select * from student where
exists(select * from class where id = 100);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
至此,我们已经将子查询学习完啦!也许大家还会有些疑惑,那就是到底在什么时候用什么子查询?对于这个问题,我们不用过于纠结,因为这根本就是我们要用什么子查询的问题,而是根据实际需求,我们将查询返回的结果按形式命名的称呼而已。
查询class
表:
查询student
表:
温馨提示:符号[]
括起来的内容,表示可选项;符号+
,则表示连接的意思。
史上最简单的 MySQL 教程(三十二)「子查询(下)」相关推荐
- 史上最简单的 MySQL 教程(十二)「列属性 之 唯一键」
史上最简单的 MySQL 教程(十二)「列属性 之 唯一键」 唯一键 唯一键:每张表往往有多个字段需要具有唯一性,数据不能重复,但是在每张表中,只能有一个主键,因此唯一键就是用来解决表中多个字段需要具 ...
- 史上最简单的 MySQL 教程(十四)「列属性 之 主键」
主键 主键:primary key,表中主要的键,每张表只能有一个字段(复合主键,可以多个字段)使用此属性,用来唯一的约束该字段里面的数据,不能重复. 增加主键 在 SQL 操作中,有 3 种方法可以 ...
- 史上最简单的 MySQL 教程(五)「SQL 基本操作 之 表操作」
温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋Star.Fork,纠错. SQL 基本操作 基本操作:CURD,即增删改查. 根据操作对象的不同 ...
- 史上最简单的 MySQL 教程(六)「SQL 基本操作 之 数据操作」
SQL 基本操作 基本操作:CURD,即增删改查. 根据操作对象的不同,咱们可以将 SQL 的基本操作分为三类,分别为:库操作.表(字段)操作和数据操作. 数据操作 1 新增数据 对于数据的新增操作, ...
- 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)
转:https://blog.csdn.net/forezp/article/details/70217283 在我的第四篇文章断路器(https://blog.csdn.net/forezp/art ...
- 史上最简单的 MySQL 教程(二)「关系型数据库」
关系型数据库 1 定义 关系型数据库,是一种建立在关系模型(数学模型)上的数据库. 至于关系模型,则是一种所谓建立在关系上的模型,其包含三个方面,分别为: 数据结构:数据存储的形式,二维表(行和列): ...
- mysql交叉查询教程_史上最简单的 MySQL 教程(二十六)「连接查询(上)」
连接查询连接查询:将多张表(大于等于 2 张表)按照某个指定的条件进行数据的拼接,其最终结果记录数可能有变化,但字段数一定会增加. 连接查询的意义:在用户查询数据的时候,需要显示的数据来自多张表. 连 ...
- 史上最简单的 MySQL 教程
史上最简单的 MySQL 教程 数据库是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变 ...
- 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心
转自:https://blog.csdn.net/forezp/article/details/81041101 文章 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eu ...
- 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)
转载请标明出处: http://blog.csdn.net/forezp/article/details/81041101 本文出自方志朋的博客 个人博客纯净版:https://www.fangzhi ...
最新文章
- 《敏捷开发绩效管理》扩展阅读(敏捷开发绩效管理,敏捷团队绩效管理)
- mysql binlog 恢复 表_MySQL通过Binlog恢复删除的表
- php header
- 12 种经典亿级流量架构之资源隔离思想与方法论
- ReportViewer教程(15)-矩阵报表-4
- Express+Socket.IO 实现简易聊天室
- 《图谋职场——最经济的图形沟通》 一种能提高职场竞争力的沟通能力
- IV.Indexes(索引)
- 总线式布线、差分走线等布线方法
- 六年级计算机学习,小学六年级计算机学习教案(24页)-原创力文档
- 解决面部毛孔粗大的7个小窍门 - 健康程序员,至尚生活!
- 知行合一ArduPilot | ArduPilot系统框架简述
- Android 快速集成阿里云OSS服务2020
- linux查看串口信息tty*
- 医疗器械分销系统开发|分销商是怎么招募的?
- 斗鱼直播Android开发二面被刷,跳槽薪资翻倍
- 【CYH-02】NOIp考砸后虐题赛:数学:题解
- YOLOv5/v7 更换骨干网络之 SwinTransformer
- 查域名历史建站时间的方法分享(查域名历史 域名建站时间)
- 【SA系列】解决方案架构师专家岗位招聘参考标准