史上最简单的 MySQL 教程(三十二)「子查询(下)」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

子查询

子查询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);
row

表子查询

表子查询,返回的结果是多行多列二维表(将子查询的结果当做二维表来使用),实际上,任何查询返回的结果都可以称之为二维表。

需求:找出每个班身高最高的学生。

思路

  • 先确定数据源,将学生按身高进行降序排序。
  • 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;
table

由上面的 SQL 语句可知,表子查询也是from子查询,即有select语句位于from之后。

exists子查询

exists:表示是否存在的意思,因此exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后,其返回的结果为10,满足条件为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);
exists

至此,我们已经将子查询学习完啦!也许大家还会有些疑惑,那就是到底在什么时候用什么子查询?对于这个问题,我们不用过于纠结,因为这根本就是我们要用什么子查询的问题,而是根据实际需求,我们将查询返回的结果按形式命名的称呼而已。


查询class

class

查询student

student

温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 zhuanlan_guanli@qq.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Coco的专栏

【深入浅出jQuery】源码浅析--整体架构

1023
来自专栏技术博文

php面试题整理

1.禁用COOKIE 后 SEESION 还能用吗? 答:通常服务器端的session是借助于seesion cookie来和客户端交互的。 但如果客户端禁用了...

3548
来自专栏积累沉淀

JavaScript基础1

什么是Javascript? Javascript是一种基于对象和事件驱动的, 与平台无关的 ,具有安全性的 ,弱类型的脚本语言。 为什么要用? 使...

2105
来自专栏Golang语言社区

Golang语言中的流程控制结构和函数详解

流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑。Go中流程控制分三大类:条件判断,循环控制和无条件跳转...

3417
来自专栏岑玉海

SqlServer 索引

什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。为了加快查...

3189
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版7.6节 Map coredump例子

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

442
来自专栏Python数据科学

妈妈再也不用担心我忘记pandas操作了

pandas的操作上千种,但对于数据分析的使用掌握常用的操作就可以应付了,更多的操作可以参考pandas官网。

571
来自专栏偏前端工程师的驿站

(cljs/run-at (JSVM. :browser) "简单类型可不简单啊~")

前言  每逢学习一个新的语言时总要先了解这门语言支持的数据类型,因为数据类型决定这门语言所针对的问题域,像Bash那样内置只支持字符串的脚步明显就是用于文本处理...

1817
来自专栏张俊红

python数据分析笔记——数据加载与整理

Python数据分析——数据加载与整理 总第47篇 ▼ ? (本文框架) 数据加载 导入文本数据 ? 1、导入文本格式数据(CSV)的方法: 方法一:使用pd....

3368
来自专栏冰霜之地

JavaScript 新手的踩坑日记

在1995年5月,Eich 大神在10天内就写出了第一个脚本语言的版本,JavaScript 的第一个代号是 Mocha,Marc Andreesen 起的这个...

572

扫描关注云+社区