在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 执行得很好。
为什么我认为它应该失败:
- 子查询没有别名
- 整个查询缺少
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/