Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  The Subquery as Scalar Operand

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为空,结果将为NULL,即使s2NOT 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中有一行包含列s1,该值为2

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

SELECT (TABLE t2) FROM t1;

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

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

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