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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

一行Python代码统计词频

问题描述:给定一段文本,统计其中每个单词的出现频率。 技术要点:扩展库jieba的cut()函数,标准库collections中的Counter类。 参考代码:...

2753
来自专栏Python小屋

Python判断两个单词的相似度

本文要点在于算法的设计:如果两个单词中不相同的字母足够少,并且随机选择几个字母在两个单词中具有相同的前后顺序,则认为两个单词是等价的。 目前存在的问题:可能会有...

2806
来自专栏C语言及其他语言

【编程经验】C语言逆向之表达式短路分析及应用

关注我们 大家在学习C语言过程中,可能会见到过一些这样的题,就是表达式短路,表达式短路主要体现在C语言中逻辑运算符&&和||。今天将对表达式短路...

2707
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版3.5节栈布局之-fomit-frame-pointer编译选项

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

442
来自专栏漫漫深度学习路

tensorflow学习笔记(三十五):control flow

tf.cond(pred, fn1, fn2, name=None) 等价于: res = fn1() if pred else fn2() 注意:pred不能...

22810
来自专栏java学习

基本数据类型

基本数据类型 在数据类型中,最常用也是最基础的数据类型,被称作基本数据类型。可以使用这些类型的值来代表一些简单的状态。 Java 语言的基本数据类型总共有以下8...

3478
来自专栏数据结构与算法

2729:Blah数集

2729:Blah数集 查看 提交 统计 提问 总时间限制:3000ms内存限制:65536kB描述大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对...

2644
来自专栏李蔚蓬的专栏

第12周Python学习周记

>>> b = a                                #没有创建新的对象

592
来自专栏GreenLeaves

SQL学习之分组数据Group by

简介:"Group By"根据字面上的意思理解,就是根据"By"后面指定的规则对数据进行分组(分组就是将一个数据集按照"By"指定的规则分成若干个子数据集),然...

1595
来自专栏数据科学学习手札

(数据科学学习手札07)R在数据框操作上方法的总结(初级篇)

上篇我们了解了Python中pandas内封装的关于数据框的常用操作方法,而作为专为数据科学而生的一门语言,R在数据框的操作上则更为丰富精彩,本篇就R处理数据框...

3078

扫描关注云+社区