我想知道为什么MySQL可以通过以下方式在SELECT语句的字段列表中实现'*'的使用...
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扩展标准的原因吗?
答案 0 :(得分:1)
MySQL解析器似乎部分解析并验证查询,然后基本上忽略SELECT *
之后但结果集FROM
之前的任何内容。 SQLFiddle
请注意,select *, id from myTable;
只有一个输出列。 select *, id, id, id, id from myTable;
也是如此。它几乎就像查询引擎获得一个独立的列列表并从那里开始。 MySQL通常似乎做这样的事情;对用户想要的东西做出假设。大多数其他RDBMS将抛出错误,而不是完全按照用户以确定的方式指定。
在任何情况下, no RDBMS严格按照任何ANSI SQL实现SQL。这既困难又太不切实际。