Documentation Home
MySQL 8.0 参考手册  / 第 13 章 SQL 语句  / 13.2 数据操作语句  / 13.2.11 子查询  /  13.2.11.1 子查询作为标量操作数

13.2.11.1 子查询作为标量操作数

在最简单的形式中,子查询是返回单个值的标量子查询。标量子查询是一个简单的操作数,您几乎可以在任何单个列值或文字合法的地方使用它,并且您可以期望它具有所有操作数都具有的那些特征:数据类型、长度、它可以的指示是NULL,等等。例如:

CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL);
INSERT INTO t1 VALUES(100, 'abcde');
SELECT (SELECT s2 FROM t1);

此子查询SELECT 返回单个值 ( 'abcde'),其数据类型为CHAR,长度为 5,字符集和排序规则等于当时有效的默认值 CREATE TABLE,并指示列中的值可以是 NULL。标量子查询选择的值的可为空性不会被复制,因为如果子查询结果为空,则结果为NULL. 对于刚刚显示的子查询,如果t1were 为空,结果将是NULLeven though s2is NOT NULL

有一些上下文不能使用标量子查询。如果语句只允许文字值,则不能使用子查询。例如,LIMIT需要文字整数参数,并且LOAD DATA需要文字字符串文件名。您不能使用子查询来提供这些值。

当您在以下部分中看到包含相当简单的构造的示例时,请(SELECT column1 FROM t1)想象您自己的代码包含更多样和复杂的构造。

假设我们制作两个表:

CREATE TABLE t1 (s1 INT);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 (s1 INT);
INSERT INTO t2 VALUES (2);

然后执行SELECT

SELECT (SELECT s1 FROM t2) FROM t1;

结果是2因为 in 中有一行 t2包含s1 值为 的列2

在MySQL 8.0.19及之后的版本中,上述查询也可以这样写,使用TABLE

SELECT (TABLE t2) FROM t1;

标量子查询可以是表达式的一部分,但请记住括号,即使子查询是为函数提供参数的操作数。例如:

SELECT UPPER((SELECT s1 FROM t1)) FROM t2;

在 MySQL 8.0.19 及更高版本中使用 可以获得相同的结果 SELECT UPPER((TABLE t1)) FROM t2