SELECT 语句中的子查询

子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。

使用子查询必须遵循以下几个规则:

  • 子查询必须括在圆括号中,除子查询在 INSERT 语句中。

  • 返回多行数据的子查询只能同多值操作符一起使用,比如 IN,ALL,ANY 操作符。

  • SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。

  • 子查询不能直接用在聚合函数中。

  • BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。

演示数据库

在本教程中,我们将使用 LintCode 样本数据库。

下面是选自 "teachers" 教师表的数据:

下面是 "courses" 课程表的数据:

1 实例

查询 'Western Venom' 老师所教的所有课程信息。

SELECT * FROM courses WHERE teacher_id = (
    SELECT id FROM teachers WHERE name = 'Western Venom'
);

执行输出结果

mysql> SELECT * FROM courses WHERE teacher_id = (
    ->  SELECT id FROM teachers WHERE name = 'Western Venom'
    -> );
+----+-------------------------+----------------+-------------+------------+
| id | name                    | student_count | created_at | teacher_id |
+----+-------------------------+----------------+-------------+------------+
|  2 | System Design           |            135 | 2020-07-18  |          3 |
|  3 | Django                  |             78 | 2020-02-29  |          3 |
|  6 | Artificial Intelligence |            166 | 2018-05-13  |          3 |
|  7 | Java P6+                |             78 | 2019-01-19  |          3 |
+----+-------------------------+----------------+-------------+------------+
4 rows in set (0.01 sec)

2 总结

通常情况下子查询都与 SELECT 语句一起使用,其基本语法如下所示:

SELECT column_name(s)
FROM   table_name
WHERE  column_name OPERATOR
      ( SELECT column_name(s)
       FROM table_name )

其中

OPERATOR 表示 =、<、>、>=、<=、IN、BETWEEN 等运算符

练习题:SELECT 子查询

查询 'Big Data' 课程对应的老师姓名。

代码输入框:

SELECT name FROM teachers WHERE id = (
    SELECT teacher_id FROM courses WHERE name = 'Big Data'
)

执行输出结果

+-----------------+
| name            |
+-----------------+
| Eastern Heretic |
+-----------------+

Last updated

Was this helpful?