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

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

子查询

子查询sub query,查询是在某个查询结果之上进行的,一条select语句内部包含了另外一条select语句。

分类

子查询有两种分类方式,分别为:按按结果分类和位置分类。

按结果分类,即根据子查询得到的数据进行分类(理论上,任何一个查询结果都可以理解为一个二维表),分别为:

  • 标量子查询:子查询得到的结果是一行一列,出现的位置在where之后;
  • 列子查询:子查询得到的结果是一列多行,出现的位置在where之后;
  • 行子查询:子查询得到的结果是多行一列(多行多列),出现的位置在where之后;
  • 表子查询:子查询得到的结果是多行多列,出现的位置在from之后。

按位置分类,即根据子查询(select语句)在外部查询(select语句)中出现的位置进行分类,分别为:

  • from子查询:子查询出现在from之后;
  • where子查询:子查询出现在where条件之中;
  • exists子查询:子查询出现在exists里面。

标量子查询

需求:现知道班级名称为PM3.1,想要获取该班的全部学生。

思路

  • 先确定数据源,学生表。
  • select * from student where c_id = ?;
  • 然后获取班级 ID,可以通过(班级表)班级名称来确定。
  • select id from class where grade = "PM3.1";

执行如下 SQL 语句,进行测试:

-- 标量子查询
select * from student where c_id = (select id from class where grade = "PM3.1");
biaol

列子查询

需求:查询所有在读班级(学生表中存在的班级)的学生。

思路

  • 先确定数据源,学生表。
  • select * from student where c_id in ?;
  • 然后确定全部有效的班级 ID。
  • select id from class;

执行如下 SQL 语句,进行测试:

-- 列子查询
select * from student where c_id in (select id from class);
column

如上图所示,我们完成了列子查询。在列子查询的结果为一行多列时,我们需要使用in作为条件进行匹配;此外,在 MySQL 中还有三个类似的条件,分别为:allsomeany

  • any等价于in,表示其中一个;
  • any等价于smoe,而anysome用于否定时却有些区别;
  • all表示等于全部。

值得注意的是,在我们使用上面三个关键字中任何一个的时候,都需要搭配=使用,例如:

-- 列子查询
select * from student where c_id = any (select id from class);

select * from student where c_id = some (select id from class);

select * from student where c_id = all (select id from class);
ass

如上图所示,为anysomeall的肯定用法,下面我们来测试其否定用法:

-- 列子查询
select * from student where c_id != any (select id from class);

select * from student where c_id != some (select id from class);

select * from student where c_id != all (select id from class);
fouze

观察上图,我们会发现anysomeall在用于否定时,其会将null值排除掉。实际上,在真正的开发中,这三个关键字并不常用。


查询class

class

查询student

studnet

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


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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

MySQL问题集锦

(1)SELECT子句是必选的,其它子句如WHERE子句、GROUP BY子句等是可选的。

802
来自专栏芋道源码1024

数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(五)之更新SQL解析

本文主要基于 Sharding-JDBC 1.5.0 正式版 1. 概述 2. UpdateStatement 3. #parse() 3.1 #skipBet...

3157
来自专栏java一日一条

浅谈SQL语句的执行过程

写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必要了解一下sql语句的执行顺序。可以有时间自己写...

672
来自专栏云计算教程系列

PostgreSQL中的查询简介

数据库是许多网站和应用程序的关键组成部分,是数据在互联网上存储和交换的核心。数据库管理最重要的一个方面是从数据库中检索数据的做法,无论是临时基础还是已编码到应用...

1003
来自专栏Java进阶干货

MySQL命令,一篇文章替你全部搞定

MySQL的基本操作可以包括两个方面:MySQL常用语句如高频率使用的增删改查(CRUD)语句和MySQL高级功能,如存储过程,触发器,事务处理等。而这两个方面...

1872
来自专栏云霄雨霁

数据库视图和索引

1672
来自专栏数据和云

SQL优化:你真的知道国家字符集的性能影响吗?

SYS_OP_C2C 是一个内部函数,功能是将VARCHAR2的数据类型转换成国家字符集的NVARCHAR2类型,内部通过TO_NCHAR函数实现。

1093
来自专栏Jackson0714

【SQL进阶】03.执行计划之旅1 - 初探

3427
来自专栏程序猿

Mysql_基础

一、 简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 表或视图、以及搜索条件等。 例...

3497
来自专栏java思维导图

MySQL 的索引是什么?怎么优化?

索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,...

1123

扫码关注云+社区