当前位置: 首页 > 面试题库 >

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

唐骏祥
2023-03-14
问题内容

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

(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上定义的语法

那么,为什么有效呢?有参考吗?


问题答案:

这是UNION带有final的替代语法ORDER BY

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

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

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

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

完全与子查询无关。

这没有在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; }
        ;


 类似资料:
  • 我正在尝试更新名为的数据库中名为的表。该表的主键是。 当我运行以下语句时: 我收到一个错误,上面写着“您正在使用安全更新模式,并且您试图更新一个没有使用键列的WHERE的表。” 我在谷歌上搜索了那个错误消息,大多数回复都是“你必须使用子句或关闭安全模式”。但正如您所看到的,我使用的是子句。如果我有子句,为什么会出现错误? MySQL服务器版本5.6。20

  • 问题内容: 它说 您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第4行“ airlines.iaco_code = airport.iaco_code完全外部联接”附近使用 语法对我来说似乎正确。我以前从未做过很多联接,但是我需要一个表中的那些列,这些列被各种ID交叉引用。 问题答案: MySQL中没有。见7.2.12。外连接简化和12.2.8.1。JOIN语

  • 问题内容: 以下语句给出相同的结果(一个使用,另一个使用): 我只能看到在左外部联接的情况下找到“无与伦比”的情况:( 以找出从未有人发送过的礼物) 在这种情况下,它首先使用,然后使用。是否先做匹配,然后做“辅助”过滤?还是有使用vs 的更一般规则?谢谢。 问题答案: 是整个查询的一部分,是每个单独联接的一部分。 只能引用以前使用的表的字段。 如果与左表中的记录没有实际匹配,则从右表中返回一条记录

  • 我的php文件有问题。当提交表单时,有一个名为“在我的PHP文件中未定义索引”的错误 错误:在(PID,PInvoice_no,p_description,unit_price,quantity,total)值('','','','','')中插入SQL语法有错误;请查看与您的MariaDB服务器版本相对应的手册,以了解在第1行“”、“”、“)”附近使用的正确语法 我试了好几次都找不到那个错误。我

  • 问题内容: 所以我在推特上看到了这两个 问题。语法错误怎么回事,但不是吗? 问题答案: 我猜想,如果可能的话,贪婪地将其解析为数字的一部分,使其成为 ,而不是方法调用的一部分。 小数点附近不能有空格,但是在方法调用中,您可以在空格前后添加空格。如果数字后跟一个空格,则该数字的解析将终止,因此无歧义。 让我们看一下不同的情况及其解析方式: