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

标签 mysql sql

another answer我发现了一个奇怪的语法:

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

虽然 mysql 执行得很好。

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

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

我发现它的运行出乎意料,并且没有解释它为什么有效。

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

那么,为什么它有效?有引用资料吗?

最佳答案

它是带有最终 ORDER BY 的替代 UNION 语法。

这就是两个选择之间的联合的样子:

(SELECT ...)
UNION
(SELECT ...) ORDER BY ... LIMIT ...

这就是一个 select 之间的联合:

(SELECT ...) ORDER BY ... LIMIT ...

与子查询完全无关。

这在 MySQL 中没有记录,但从 the grammar 中可以明显看出:

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; }
        ;

关于mysql - 为什么给定的语法在 mysql 中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22752014/

相关文章:

php - Category>Sub category>Sub sub category>Sub sub subcategory>产品1

sql - MySQL 查询以获取单个项目和最新的关联项目

PHP MYSQL VALUE 变量

mysql - 选择行但优先考虑非 NULL 值

mysql - 如何构造 SQL 查询以查找作为两个特定其他对象的父对象的对象?

MySQL 使用匹配的 header 加载数据文件

mysql - 如何选择 1 :n related records which are minimum 2 per type in MySQL

php - MYSQLI 查询最多匹配字符的ORDER

sql - 连续 N 行的最大总和

asp.net - 搜索具有逗号分隔值的列