2015-04-01 94 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

相关问题