暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的SQL语句 - 数据操作语句(12)- SELECT 语句(5)

数据库杂货铺 2021-04-12
300
带圆括号的查询表达式
 
    parenthesized_query_expression:
    ( query_expression [order_by_clause] [limit_clause] )
    [order_by_clause]
    [limit_clause]
    [into_clause]


    query_expression:
    query_block [UNION query_block [UNION query_block ...]]
    [order_by_clause]
    [limit_clause]
    [into_clause]


    query_block:
    SELECT ... (see Section 13.2.10, “SELECT Statement”)


    order_by_clause:
    ORDER BY as for SELECT (see Section 13.2.10, “SELECT Statement”)


    limit_clause:
    LIMIT as for SELECT (see Section 13.2.10, “SELECT Statement”)


    into_clause:
    INTO as for SELECT (see Section 13.2.10, “SELECT Statement”)
     
    MySQL 8.0.22 及更高版本支持带圆括号的查询表达式。最简单的形式,带圆括号的查询表达式只包含一个 SELECT 子句,而不包含以下可选子句:
     
      (SELECT 1);
      (SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'mysql');
       
      带圆括号的查询表达式还可以包含由多个 SELECT 语句组成的 UNION 语句,并以任意可选子句结尾:
       
        mysql> (SELECT 1 AS result UNION SELECT 2);
        +--------+
        | result |
        +--------+
        | 1 |
        | 2 |
        +--------+
        mysql> (SELECT 1 AS result UNION SELECT 2) LIMIT 1;
        +--------+
        | result |
        +--------+
        | 1 |
        +--------+
        mysql> (SELECT 1 AS result UNION SELECT 2) LIMIT 1 OFFSET 1;
        +--------+
        | result |
        +--------+
        | 2 |
        +--------+
        mysql> (SELECT 1 AS result UNION SELECT 2)
        ORDER BY result DESC LIMIT 1;
        +--------+
        | result |
        +--------+
        | 2 |
        +--------+
        mysql> (SELECT 1 AS result UNION SELECT 2)
        ORDER BY result DESC LIMIT 1 OFFSET 1;
        +--------+
        | result |
        +--------+
        | 1 |
        +--------+
        mysql> (SELECT 1 AS result UNION SELECT 3 UNION SELECT 2)
        ORDER BY result LIMIT 1 OFFSET 1 INTO @var;
        mysql> SELECT @var;
        +------+
        | @var |
        +------+
        | 2 |
        +------+
         
        带圆括号的查询表达式也用作查询表达式,因此通常由查询块组成的查询表达式也可以由带圆括号的查询表达式组成:
         
          (SELECT * FROM t1 ORDER BY a) UNION (SELECT * FROM t2 ORDER BY b) ORDER BY z;
           
          查询块结尾可能有 ORDER BY 和 LIMIT 子句,它们在外部 UNIONORDER BY LIMIT 之前应用。
           
          如果不将查询块括在括号中,则不能在结尾使用 ORDER BY 或 LIMIT,但圆括号可用采用多种方式:
           
          ● 要对每个查询块强制使用 LIMIT
           
            (SELECT 1 LIMIT 1) UNION (SELECT 2 LIMIT 1);
             
            ● 要对查询块和整个查询表达式实施 LIMIT
             
              (SELECT 1 LIMIT 1) UNION (SELECT 2 LIMIT 1) LIMIT 1;
               
              ● 要对整个查询表达式(不带括号)实施 LIMIT
               
                SELECT 1 UNION SELECT 2 LIMIT 1;
                 
                ● 混合强制:对第一个查询块和整个查询表达式使用 LIMIT
                 
                  (SELECT 1 LIMIT 1) UNION SELECT 2 LIMIT 1;
                   
                  本节中描述的语法受某些限制:
                   
                  如果 ORDER BY 在带圆括号的查询表达式中,并且也应用于外部查询,那么结果是未定义的,并且在将来的 MySQL 版本中可能会发生更改。如果 LIMIT 出现在带圆括号的查询表达式中,并且也应用于外部查询,则也是如此。
                   
                  如果括号内有另一个 INTO 子句,则不允许查询表达式的末尾有 INTO 子句。
                   
                  带圆括号的查询表达式不允许多个层次的 ORDER BY 或 LIMIT 操作。例如:
                   
                    mysql> (SELECT 'a' UNION SELECT 'b' LIMIT 1) LIMIT 2;
                    ERROR 1235 (42000): This version of MySQL doesn't yet support 'parenthesized
                    query expression with more than one external level of ORDER/LIMIT operations'
                     
                     
                     
                     
                    官方文档:
                    https://dev.mysql.com/doc/refman/8.0/en/parenthesized-query-expressions.html
                     

                    文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论