MySQL的SQL语句 - 数据操作语句(13)- 子查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的SQL语句 - 数据操作语句(13)- 子查询相关的知识,希望对你有一定的参考价值。

子查询作为标量操作数

在最简单的形式中,子查询是返回单个值的标量子查询。标量子查询是一个简单的操作数,几乎可以在单个列值或文本合法的任何地方使用它,并且可以期望它具有所有操作数都具有的特性:数据类型、长度、可以指定为 NULL 等等。例如:

1. CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL);
2. INSERT INTO t1 VALUES(100, ‘abcde‘);
3. SELECT (SELECT s2 FROM t1);

此 SELECT 中的子查询返回单个值 (‘abcde‘),该值的数据类型为 CHAR,长度为5,字符集和排序规则使用创建表时有效的默认值,并指示列中的值可以为 NULL。标量子查询的值是否可以是空并非继承自所选择的值,因为如果子查询结果为空,则结果为 NULL。对于刚刚显示的子查询,如果 t1 为空,则结果将为 NULL,即使 s2 是 NOT NULL。

在一些上下文中不能使用标量子查询。如果语句只允许字面量,则不能使用子查询。例如,LIMIT 需要字面量整型参数,而 LOAD DATA 需要字面量字符串文件名。不能使用子查询来提供这些值。

当在下面的部分中看到包含相当简单的结构 (SELECT column1 FROM t1) 的示例时,想象一下自己的代码包含了更加多样化和复杂的结构。

假设我们创建了两个表:

1. CREATE TABLE t1 (s1 INT);
2. INSERT INTO t1 VALUES (1);
3. CREATE TABLE t2 (s1 INT);
4. INSERT INTO t2 VALUES (2);

然后执行 SELECT 语句:

1. SELECT (SELECT s1 FROM t2) FROM t1;

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

mysql 8.0.19 及更高版本中,前面的查询也可以这样写,使用 TABLE:

1. SELECT (TABLE t2) FROM t1;

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

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

在 MySQL 8.0.19 和更高版本中,使用 SELECT UPPER((TABLE t1)) FROM t2 语句可以得到相同的结果。

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/scalar-subqueries.html

以上是关于MySQL的SQL语句 - 数据操作语句(13)- 子查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的SQL语句 - 数据操作语句(13)- 子查询(11)

MySQL的SQL语句 - 数据操作语句(13)- 子查询

MySQL的SQL语句 - 数据操作语句(13)- 子查询

MySQL的SQL语句 - 数据操作语句(13)- 子查询

MySQL的SQL语句 - 数据操作语句(13)- 子查询

MySQL的SQL语句 - 数据操作语句(13)- 子查询