以下两个查询产生截然不同的结果的原因是什么?
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"?如果是这样的话,很容易找到任何阐述撇号这个含义的页面。
答案 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 | |
+---------+-------------+------+-----+---------+-------+
答案 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 |
+-------+-------+