• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 子查询作为标量操作数

    在最简单的形式中,子查询是返回单个值的标量子查询。标量子查询是一个简单的操作数,几乎可以在任何单列值或文字合法的地方使用它,并且可以期望它具有所有操作数都具有的那些特征:数据类型,长度,表示可以是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

    在MySQL 8.0.19和更高版本中,也可以使用TABLE以下形式编写上述查询:

    SELECT (TABLE t2) FROM t1;
    

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

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

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