反引号和撇号之间有什么区别?

13

以下两个查询为什么结果差别很大?

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)

我在谷歌上找了一些 backticks 和撇号(也称作单引号)之间区别的解释,但是我没有找到任何关于为什么它们在像上面那样的列名中被解释成不同方式的迹象。

难道后者查询中的单引号字符串实际上并没有被解释成列名,而只是一个任意的字符串字面量,其中可以说有“1”吗?如果是这样的话,很难找到任何阐述这种撇号含义的页面。

3个回答

13

'price'(单引号或双引号)是一个字符串。它从不更改,因此计数始终为1。

`price`(反引号)指的是列price。因此可能不止一个。

内部括号是无关紧要的。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。


6

单引号(')与双引号(")用于表示字符串。在字符串字面值中使用。

重音符号(`)用于标识符的引用

如果标识符与保留字匹配或包含特殊字符,则必须将标识符用引号括起来。 引号括起来的标识符还可以指定大小写不敏感字段中的小写(否则可能显示为大写)。

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

请参阅ANSI 引用模式

4

我在那些页面中没有看到任何暗示COUNT(DISTINCT)会在字符串字面量上返回1,这正是让我困惑的地方,但还是谢谢。 - Anders Feder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接