什么是反引号和撇号之间的巨大差异?

时间:2015-04-01 23:05:58

标签: mysql sql mariadb

以下两个查询产生截然不同的结果的原因是什么?

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)

我已经用google搜索了反引号和撇号(又称单引号)之间的区别,但是我无法找到任何关于为什么对列名称进行不同解释的说明。上方。

后一个查询中的单引号字符串实际上是不是被解释为列名,而是一个任意的字符串文字,其中可以说是" 1"?如果是这样的话,很容易找到任何阐述撇号这个含义的页面。

3 个答案:

答案 0 :(得分:10)

'price'(撇号或引号)是一个字符串。它永远不会改变,所以计数总是1。

`price`(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。

答案 1 :(得分: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

答案 2 :(得分:3)

请查找MariaDB关于标识符名称和字符串文字的文档:

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

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

反引号始终引用标识符名称。单引号总是引用字符串文字。

标识符名称将被其值替换,字符串文字不会被替换为

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