为什么给定的语法在mysql中有效?

zer*_*kms 7 mysql sql

另一个答案中,我发现了一种奇怪的语法:

(SELECT * FROM `articles` 
 WHERE date >= UNIX_TIMESTAMP(DATE(NOW() - INTERVAL 30 DAY))
 ORDER BY `views` DESC 
 LIMIT 20
) ORDER by `views` ASC
Run Code Online (Sandbox Code Playgroud)

这虽然是由mysql执行的.

为什么我认为它应该失败:

  1. 子查询没有别名
  2. 整个查询缺少SELECT条款

我发现运行意外,并没有解释为什么它的工作原理.

它不符合https://dev.mysql.com/doc/refman/5.5/en/select.html上定义的语法

那么,为什么它有效?任何参考?

Eev*_*vee 6

UNION是最终的替代语法ORDER BY.

这是两个选择之间的这种联合看起来像:

(SELECT ...)
UNION
(SELECT ...) ORDER BY ... LIMIT ...
Run Code Online (Sandbox Code Playgroud)

这就是一个选择之间的这种联合看起来像:

(SELECT ...) ORDER BY ... LIMIT ...
Run Code Online (Sandbox Code Playgroud)

根本与子查询无关.

这在MySQL中没有记载,但从语法中可以明显看出:

top_level_select_init:
        SELECT_SYM
        {
            Lex->sql_command= SQLCOM_SELECT;
        }
        select_init2
        | '(' select_paren ')' union_opt
        ;


/* Need select_init2 for subselects. */
union_select_init:
        SELECT_SYM select_init2
        | '(' select_paren ')' union_opt
        ;

...

union_opt:
        /* Empty */ { $$= 0; }
        | union_list { $$= 1; }
        | union_order_or_limit { $$= 1; }
        ;
Run Code Online (Sandbox Code Playgroud)