13.2.10.1 子查询为标量操作数
在最简单的形式中,子查询是返回单个值的标量子查询。标量子查询是一个简单的操作数,几乎可以在任何单列值或 Literals 合法的地方使用它,并且可以期望它具有所有操作数都具有的那些 Feature:数据类型,长度,table 示可以是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
为空,则即使s2
是NOT NULL
,结果也将是NULL
。
在某些情况下,无法使用标量子查询。如果语句仅允许使用 Literals 值,则不能使用子查询。例如,LIMIT
需要 Literals 整数参数,而LOAD DATA需要 Literals 字符串文件名。您不能使用子查询来提供这些值。
当您在以下各节中看到包含相当简单的结构(SELECT column1 FROM t1)
的示例时,请想象您自己的代码包含更多不同和复杂的结构。
假设我们制作了两个 table:
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 UPPER((SELECT s1 FROM t1)) FROM t2;