文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  子查询作为标量操作数

15.2.15.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。对于刚刚显示的子查询,如果 t1 为空,则即使 s2NOT NULL,结果也将是 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,因为 t2 中有一行包含值为 2 的列 s1

前面的查询也可以使用 TABLE 这样写

SELECT (TABLE t2) FROM t1;

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

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

可以使用 SELECT UPPER((TABLE t1)) FROM t2 获得相同的结果。