2011-10-27 48 views
4

为什么会导致语法错误(MySQL 5)?为什么向MySQL查询添加'*'会导致语法错误?

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

我无法解释为什么。但我知道Oracle做同样的事情。 –

回答

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>

+0

'select *,count(*)...'成功。 –

+0

@马特不是真的如SELECT *,从blegg˚F将工作 –

-2

可能是因为您选择了两次相同的字段。在下面的查询

select name, * from <...> 

*将包括name,所以你明确地指定name第二次。

这不是一个有说服力的论据,因为下面是有效的:

select name, name from <...> 

,所以是以下

select name, users.* from users 

两者将多次选择相同的领域。

更可能它只是MySQL的语法限制。

+1

没有,这不是它:'SELECT COUNT(*),*从blegg'也失败 –

+0

但是,他的第一个,工作,例如做同样的事情(不包括'F'输出两次)。 –

+0

这是不是一个伟大的答案,但它是一个评论太长/复杂。如果/有人提供更具体的解释,会愉快地删除。 – meagar

1

select *, f from blegg 

将正常工作。

可能不合格*具有显示为在选择所述第一表达式?

相关问题