为什么会导致语法错误(MySQL 5)?
mysql> select f, blegg.* from blegg limit 1;
+------+------+------+------+
| f | f | g | h |
+------+------+------+------+
| 17 | 17 | 2 | 17 |
+------+------+------+------+
1 row in set (0.00 sec)
mysql> select f, * from blegg limit 1; -- * is unqualified
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 blegg limit 1' at line 1
我查看了手册,但没有找到任何结果。为什么select <field>, * ...
在select <field>, <table>.* ...
和select * ...
以及select *, <field> ...
成功的地方失败?
答案 0 :(得分:7)
MySQL手册在SELECT
syntax:
可以使用仅包含单个非限定
*
的选择列表 用于选择所有表中所有列的简写:SELECT * FROM t1 INNER JOIN t2 ...
tbl_name.*
可以用作 合格的速记来选择命名表中的所有列:SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...
使用不合格的
*
与选择列表中的其他项目可能会产生一个解析错误。至 避免此问题,请使用合格的tbl_name.*
参考SELECT AVG(score), t1.* FROM t1 ...
文档似乎表明*
本身仅在特殊情况下有效,因为它是选择列表中的唯一内容。但是,它只表示使用不合格的*
与其他项可能会产生解析错误。
除了MySQL之外,SQL-92 standard(旧的,但可链接的)说得很多:
7.9 <query specification> Format <query specification> ::= SELECT [ <set quantifier> ] <select list> <table expression> <select list> ::= <asterisk> | <select sublist> [ { <comma> <select sublist> }... ] <select sublist> ::= <derived column> | <qualifier> <period> <asterisk> <derived column> ::= <value expression> [ <as clause> ] <as clause> ::= [ AS ] <column name>
<select list>
可以<asterisk>
本身或是“普通”选择列表。
答案 1 :(得分:1)
但是
select *, f from blegg
会正常工作。
可能一个不合格的*必须作为select中的第一个表达式出现?
答案 2 :(得分:-2)
可能是因为您选择了两次相同的字段。在以下查询中
select name, * from <...>
*
将包含name
,因此您第二次明确指定name
。
这不是一个令人信服的论据,因为以下内容是有效的:
select name, name from <...>
以下是
select name, users.* from users
两者都会多次选择相同的字段。
更可能只是MySQL的语法限制。