MySQL 9.0 发行说明
在最简单的形式中,子查询是一个标量子查询,它返回单个值。标量子查询是一个简单的操作数,您几乎可以在任何允许使用单个列值或字面量的地方使用它,并且可以预期它具有所有操作数的那些特性:数据类型、长度、指示它可以为 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,即使 s2 为 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,因为 t2 中有一行包含一个名为 s1 的列,该列的值为 2。
前面的查询也可以使用 TABLE 这样写:
SELECT (TABLE t2) FROM t1;标量子查询可以是表达式的一部分,但请记住括号,即使子查询是为函数提供参数的操作数。例如
SELECT UPPER((SELECT s1 FROM t1)) FROM t2;使用 SELECT UPPER((TABLE t1)) FROM t2 可以获得相同的结果。