2011-10-27 145 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 

將正常工作。

可能不合格*具有顯示爲在選擇所述第一表達式?

相關問題