2015-04-01 144 views
7

以下兩個查詢給出了完全不同的結果的原因是什麼?什麼使反引號和撇號之間有很大區別?

MariaDB [mydatabase]> SELECT COUNT(DISTINCT(`price`)) FROM `products`; --Good 
+--------------------------+ 
| COUNT(DISTINCT(`price`)) | 
+--------------------------+ 
|      2059 | 
+--------------------------+ 
1 row in set (0.01 sec) 

MariaDB [mydatabase]> SELECT COUNT(DISTINCT('price')) FROM `products`; --Bad 
+--------------------------+ 
| COUNT(DISTINCT('price')) | 
+--------------------------+ 
|      1 | 
+--------------------------+ 
1 row in set (0.01 sec) 

我爲反引號和撇號之間的區別的解釋一派左右(亦稱單引號),但我無法找到任何指示,爲什麼他們會被不同的解釋爲列名狀在上面。

是不是後一個查詢中的單引號字符串實際上不會被解釋爲列名稱,而只是一個可以說是「1」的任意字符串字面值?如果是這樣的話,找到任何解釋這個撇號含義的頁面並不容易。

回答

9

「價格」(撇號或引號)是一個字符串。它永遠不會改變,所以計數始終爲1.

價格(backtics)指列price。所以它可能超過1.

內部括號是不相關的。 COUNT(DISTINCT price)與您的退格版本相同。

  • SELECT COUNT(*) FROM tbl WHERE ...是詢問有多少行的常用方法。
  • SELECT foo, COUNT(*) FROM tbl GROUP BY foo是詢問foo每個不同值有多少行的常用方法。
  • SELECT foo, COUNT(foo) FROM tbl GROUP BY foo與上述相同,但不計入行數foo IS NULL

SELECT DISTINCT ... GROUP BY ...是無意義的陳述。使用DISTINCT或使用GROUP BY。

5

直單引號(')用於string literals(連同直雙引號(「))。

反引號引號(')是quoting identifiers

標識必須加引號,如果他們匹配的保留字,或如果它們包含特殊字符。引號標識符還可以在不區分大小寫的字段指定小寫(其否則可能被示出爲大寫)。

CREATE TABLE MyTable (Field INT); 
DESCRIBE MyTable; 
+---------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+---------+-------------+------+-----+---------+-------+ 
| FIELD | INT   | YES |  | NULL |  | 
+---------+-------------+------+-----+---------+-------+ 

參見ANSI quote mode

3

請找MariaDB的文檔有關的標識符名稱和字符串:

https://mariadb.com/kb/en/mariadb/identifier-names/

https://mariadb.com/kb/en/mariadb/string-literals/

反引號總是報價標識符namens。單引號總是引用字符串文字。

標識符名稱得到值替代,字符串不要:

SELECT `price`, 'price' FROM products; 
+-------+-------+ 
|  1 | price | 
|  1 | price | 
|  2 | price | 
|  3 | price | 
|  3 | price | 
+-------+-------+ 
+0

我看到這些網頁沒有任何跡象表明COUNT(DISTINCT)在一個字符串,這是真正全身心將返回1我離開,但無論如何感謝。 – 2015-04-12 21:23:13

相關問題