史上最简单的 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 教程 <- 目录 —— ☆☆☆ ————

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

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ImportSource

MySQL 8.0发布了,来看看针对SQL有哪些新功能?

据官方称,此次发布意味着MySQL从此兼顾NoSQL和SQL于一身。NoSQL+SQL=MySQL。

1163
来自专栏AhDung

【SQL】分享表值函数FMakeRows,用于生成行

评论中又有一位【笑东风】兄给出改善建议,在此先感谢他。原理是借助行数较多的一个系统视图sys.all_columns与自身做cross join,以得到大量现成...

813
来自专栏漆洪凯的专栏

MySQL 数据库设计总结

MySQL支持很多种不同的数据类型,并且选择正确的数据类型对于获得高性能至关重要。本文将对MySQL 数据库设计总结,希望与大家共同探讨。

24.8K12
来自专栏Leetcode名企之路

索引使用策略及优化

面试官常常会问你,怎么查看一个sql语句有没有使用索引这种类似的问题,或者问你sql怎么优化,那么如何了解sql怎么执行,执行情况如何呢?这就要用到Mysql的...

1033
来自专栏逸鹏说道

【防护】如何阻止SELECT * 语句

利用思路(仅供参考): 今天在网上看了一篇文章,是用来防止select * 的思路,其实这个可以用于安全防护的,在你出现注入的时候很多都是解猜,很多脚本小子都会...

2805
来自专栏Java大联盟

Java面试手册:数据库 ⑤

962
来自专栏杨建荣的学习笔记

IP地址定位区间的问题分析

以前写过一篇Oracle中关于IP地址定位的问题分析,最后引申出了一系列的问题。当时问题紧急严峻,抓取了10053事件定位源头,想出了一个解决妙法,还自鸣...

2998
来自专栏Java架构

前大众点评资深研发专家对Mysql索引的解析与底层数据结构的解刨1:Mysql索引是什么2:Mysql索引为什么要用B+Tree实现3:Mysql索引如何实现4:InnoDB索引实现5:程序员进阶方法

2044
来自专栏谢庆玲的专栏

MySQL 索引及查询优化总结

本文主要讨论 MySQL 索引原理及常用的 sql 查询优化。

11.6K4
来自专栏PHP在线

关于MySQL应该学习的6件事

关于MySQL应该学习的6件事 来源:PHP100中文网 时间:2015-01-29 17:52:12 阅读数:4282 分享到:1 [导读] M...

3256

扫码关注云+社区