为什么在MySQL查询中添加'*'会导致语法错误?

时间:2011-10-27 20:53:38

标签: mysql sql select

为什么会导致语法错误(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> ...成功的地方失败?

3 个答案:

答案 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的语法限制。