在select语句的项列表中使用'*',例如SELECT * vs. SELECT *,a vs SELECT a,*

时间:2014-12-09 16:37:05

标签: mysql sql

我想知道为什么MySQL可以通过以下方式在SELECT语句的字段列表中实现'*'的使用...

reference说:

  

select_expr术语列表包含指示的选择列表   要检索的列。术语指定列或表达式或可以   使用* -shorthand:

     
      
  • 可以使用仅包含一个不合格* 的的选择列表   用于选择所有表中所有列的简写

         

    SELECT * FROM t1 INNER JOIN t2 ...

  •   
     

...

似乎严格的是'*'只能在字段列表中使用一次,一旦它出现,其他任何东西都不应该存在。它也符合SQL 1999标准(也可能是2011年):

<select list> ::=
<asterisk>
| <select sublist> [ { <comma> <select sublist> }... ]

但是,MySQL语法实现了如下'*'的使用(来自MySQL最新版本的代码片段,sql_yacc.cc):

select_item_list:
          select_item_list ',' select_item
        | select_item
        | '*'
        ;

......而且这种实施更加宽松!例如,允许执行以下查询:

SELECT *, a FROM t

但是,不允许执行以下查询:

SELECT a,* FROM t
SELECT *,* FROM t

有人有一个例子可能是这个MySQL扩展标准的原因吗?

1 个答案:

答案 0 :(得分:1)

MySQL解析器似乎部分解析并验证查询,然后基本上忽略SELECT *之后但结果集FROM之前的任何内容。 SQLFiddle

请注意,select *, id from myTable;只有一个输出列。 select *, id, id, id, id from myTable;也是如此。它几乎就像查询引擎获得一个独立的列列表并从那里开始。 MySQL通常似乎做这样的事情;对用户想要的东西做出假设。大多数其他RDBMS将抛出错误,而不是完全按照用户以确定的方式指定。

在任何情况下, no RDBMS严格按照任何ANSI SQL实现SQL。这既困难又太不切实际。