史上最简单的 MySQL 教程(三十一)「子查询(上)」
来源:互联网 发布:怎么样注册淘宝店 编辑:程序博客网 时间:2024/05/01 13:31
子查询
子查询: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");
列子查询
需求:查询所有在读班级(学生表中存在的班级)的学生。
思路:
- 先确定数据源,学生表。
select * from student where c_id in ?;
- 然后确定全部有效的班级 ID。
select id from class;
执行如下 SQL 语句,进行测试:
-- 列子查询select * from student where c_id in (select id from class);
如上图所示,我们完成了列子查询。在列子查询的结果为一行多列时,我们需要使用in
作为条件进行匹配;此外,在 MySQL 中还有三个类似的条件,分别为:all
、some
和any
。
any
等价于in
,表示其中一个;any
等价于smoe
,而any
和some
用于否定时却有些区别;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);
如上图所示,为any
、some
和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);
观察上图,我们会发现any
、some
和all
在用于否定时,其会将null
值排除掉。实际上,在真正的开发中,这三个关键字并不常用。
查询class
表:
查询student
表:
温馨提示:符号[]
括起来的内容,表示可选项;符号+
,则表示连接的意思。
———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————
阅读全文
4 0
- 史上最简单的 MySQL 教程(三十一)「子查询(上)」
- 史上最简单的 MySQL 教程(三十二)「子查询(下)」
- 史上最简单的 MySQL 教程(二十六)「连接查询(上)」
- 史上最简单的 MySQL 教程(二十六)「连接查询(上)」
- 史上最简单的 MySQL 教程(二十三)「数据的高级操作 之 查询(上)」
- 史上最简单的 MySQL 教程(二十三)「数据的高级操作 之 查询(上)」
- 史上最简单的 MySQL 教程(二十七)「连接查询(下)」
- 史上最简单的 MySQL 教程(二十七)「连接查询(下)」
- 史上最简单的 MySQL 教程(三十)「联合查询」
- 史上最简单的 MySQL 教程(二十八)「外键(上)」
- 史上最简单的 MySQL 教程(二十八)「外键(上)」
- 史上最简单的 MySQL 教程(三十三)「视图(上)」
- 史上最简单的 MySQL 教程(三十五)「数据备份与还原(上)」
- 史上最简单的 MySQL 教程(三十八)「事务(上)」
- 史上最简单的 MySQL 教程(三十八)「事务(上)」
- 史上最简单的 MySQL 教程(二十四)「数据的高级操作 之 查询(中)」
- 史上最简单的 MySQL 教程(二十五)「数据的高级操作 之 查询(下)」
- 史上最简单的 MySQL 教程(二十四)「数据的高级操作 之 查询(中)」
- 51nod1264 线段相交
- 性能调优——mysql
- GCD正在运行的线程停不掉?呵呵
- Leetcode 10. Regular Expression Matching
- 解决js浮点运算bug
- 史上最简单的 MySQL 教程(三十一)「子查询(上)」
- 1001. A+B Format (20)
- HDU-4003 Find Metal Mineral 树形dp
- ES6:const let
- 华为云硬盘备份(VBS)服务
- 运算符优先级总结
- B
- Linux下利用phpize安装memcashe的php源码扩展包
- java-web遗传算法最短路径规划