Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

15.2.15.1 子查询作为标量操作数

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

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,即使 s2 不为空。

有一些上下文中不能使用标量子查询。如果语句只允许文字值,您不能使用子查询。例如,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 获得。