原文链接:https://www.cpweb.top/976 |
---|
一、简介
子查询指在一个 SELECT 查询语句的 WHERE 子句中包含另一个 SELECT 查询语句,或者将一个 SELECT 查询语句嵌入另一个语句中成为其一部分。
在查询语句中,外层 SELECT 查询语句称为主查询,WHERE 子句中的 SELECT 查询语句称为子查询,也称为嵌套查询。嵌套查询一般会涉及两个以上的表,所做的查询有的也可以采用连接查询或者几条查询语句完成。
二、IN 子查询
在 WHERE 子句中,可以使用列表运算符 in 将列表中的子查询的值作为筛选条件。在子查询的 SELECT 投影列中只能指定一个列或者表达式。
语法格式:
列名 [ not ] in (子查询)
例如,从 Education 数据库中查询还没有被学生选择的课程。
mysql> select * from course where cid not in (select cid from sc);
+----+----------+-----------------------------+--------+
| No | Cid | Cname | Credit |
+----+----------+-----------------------------+--------+
| 7 | 16020016 | 数字媒体采集与处理 | 4.0 |
| 8 | 16020017 | 静态网页设计与制作 | 3.0 |
| 9 | 16020018 | web标准设计 | 4.0 |
| 10 | 16020019 | web应用程序设计 | 7.0 |
| 11 | 16020020 | 计算机组网与管理 | 3.5 |
| 12 | 16020021 | 软件测试与实施 | 2.5 |
+----+----------+-----------------------------+--------+
三、比较子查询
当列名的值在关系上满足子查询中的值时,逻辑表达式为真,否则为假。同样在子查询的 SELECT 投影列中只能指定一个列或者表达式。
语法格式:
列名 比较运算符 ALL | ANY| SOME(子查询)
1、ALL 比较子查询
当列名的值在关系上满足子查询中的每一个值时,逻辑表达式为真,否则为假。
语法格式:列名 比较符 ALL(子查询)
例如,从课程表 ‘course’ 中查询出学分最多的课程。
mysql> select * from course where credit>=ALL(select credit from course);
+----+----------+--------------------------+--------+
| No | Cid | Cname | Credit |
+----+----------+--------------------------+--------+
| 4 | 16020013 | 面向过程程序设计 | 10.0 |
+----+----------+--------------------------+--------+
mysql> select * from course where credit=ALL(select max(credit) from course);
+----+----------+--------------------------+--------+
| No | Cid | Cname | Credit |
+----+----------+--------------------------+--------+
| 4 | 16020013 | 面向过程程序设计 | 10.0 |
+----+----------+--------------------------+--------+
2、ANY | SOME 比较子查询
当列名的值在关系上满足子查询中任何一个值时,逻辑表达式为真,否则为假。ANY 和 SOME 用法相同。
语法格式:列名 比较符 ANY | SOME(子查询)
例如下例:
mysql> select * from course where credit>=any(select credit from course);
+----+----------+-----------------------------+--------+
| No | Cid | Cname | Credit |
+----+----------+-----------------------------+--------+
| 1 | 16020010 | 微机组装与维护 | 2.0 |
| 2 | 16020011 | 操作系统安装与使用 | 2.0 |
| 3 | 16020012 | 计算机基础 | 3.5 |
| 4 | 16020013 | 面向过程程序设计 | 10.0 |
| 5 | 16020014 | 数据库开发与维护 | 6.5 |
| 6 | 16020015 | 面向对象程序设计 | 7.5 |
| 7 | 16020016 | 数字媒体采集与处理 | 4.0 |
| 8 | 16020017 | 静态网页设计与制作 | 3.0 |
| 9 | 16020018 | web标准设计 | 4.0 |
| 10 | 16020019 | web应用程序设计 | 7.0 |
| 11 | 16020020 | 计算机组网与管理 | 3.5 |
| 12 | 16020021 | 软件测试与实施 | 2.5 |
+----+----------+-----------------------------+--------+
四、子查询在其他语句中的使用
例如,保存查询结果到新表。
mysql> create table new_student1(select sname,sex from student where sex='男' limit 2);
mysql> select * from new_student1;
+-----------+-----+
| sname | sex |
+-----------+-----+
| 赵成刚 | 男 |
| 郭洪亮 | 男 |
+-----------+-----+
mysql> create table new_student2 as select sname,sex from student where sex='男' limit 2;
mysql> select * from new_student2;
+-----------+-----+
| sname | sex |
+-----------+-----+
| 赵成刚 | 男 |
| 郭洪亮 | 男 |
+-----------+-----+
文章大部分内容来源:《 SQL Server 2008 R2 数据库技术及应用(第3版)》。以上内容基于数据库版本mysql 5.7.28。