• Post author:
  • Post category:mysql
  • Post comments:0评论

一、简介

  子查询指在一个 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。

发表评论

验证码: 23 − = 21