作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有查询并且有效
select *, id, from_unixtime(start_timestamp) from log limit 1;
这也很好用:
select * from log limit 1;
为什么将 *
移动到末尾会出错?
select id, from_unixtime(start_timestamp), * from log limit 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from log limit 1' at line 1
最佳答案
原因是他们在 SQL 解析器中实现了一个快捷方式。
SQL-2003 规范显示了 SELECT 的语法规则如下:
<query specification> ::=
SELECT [ <set quantifier> ] <select list> <table expression>
<select list> ::=
<asterisk>
| <select sublist> [ { <comma> <select sublist> }... ]
<select sublist> ::=
<derived column>
| <qualified asterisk>
这表明SELECT *
与以逗号分隔的列或限定星号的列表互斥。如果您使用不合格的 *
那么那一定是整个选择列表。要实现这个语法,他们需要一个 <select list>
规则和 <select sublist>
规则。
但是MySQL的SQL parser Yacc file显示:
query_specification:
SELECT_SYM
select_options
select_item_list
...
select_item_list:
select_item_list ',' select_item
| select_item
| '*'
他们基本上合并了 <select list>
的规则和 <select sublist>
成一个递归规则。所以他们对 select_item_list
的规则允许 SELECT *, <select_item>, <select_item>, ...
而根据 SQL-2003 标准,它不应允许这样做。
由于语法上的这种捷径,他们不允许 *
通配符成为 select_item_list
中的尾随项.
如果 MySQL 现在“修复”这个问题,使其符合标准语法规则,那无疑会破坏成千上万依赖于非标准语法的遗留应用程序。
您可以通过避免 SELECT *, ...
使您的代码符合标准语法句法。仅使用 SELECT * FROM ...
.您也可以合法地使用限定星号,例如 SELECT t1.*, ...
.
关于mysql - 在查询中使用 * 时为 `You have an error in your SQL syntax;`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71128839/
我是一名优秀的程序员,十分优秀!