文档首页
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 等等。例如

Press CTRL+C to copy
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) 的示例时,请想象您自己的代码包含更多样化和复杂的结构。

假设我们创建两个表

Press CTRL+C to copy
CREATE TABLE t1 (s1 INT); INSERT INTO t1 VALUES (1); CREATE TABLE t2 (s1 INT); INSERT INTO t2 VALUES (2);

然后执行 SELECT

Press CTRL+C to copy
SELECT (SELECT s1 FROM t2) FROM t1;

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

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

Press CTRL+C to copy
SELECT (TABLE t2) FROM t1;

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

Press CTRL+C to copy
SELECT UPPER((SELECT s1 FROM t1)) FROM t2;

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