反引号和撇号之间的巨大区别是什么?
What makes the big difference between a backtick and an apostrophe?
以下两个查询给出截然不同的结果的原因是什么?
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”?如果是这样,就不容易找到解释撇号这个含义的任何页面。
直单引号 (') 用于 string literals(连同直双引号 ("))。
反引号 (`) 用于 quoting identifiers。
如果标识符匹配保留字或包含特殊字符,则必须用引号引起来。带引号的标识符还可以在不区分大小写的字段中指定小写字母(否则可能显示为大写字母)。
CREATE TABLE MyTable (Field INT);
DESCRIBE MyTable;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| FIELD | INT | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
另见 ANSI quote mode。
'price'(撇号或引号)是一个字符串。它永远不会改变,因此计数始终为 1。
`price`(反向)指的是列 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。
请查找 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 |
+-------+-------+
以下两个查询给出截然不同的结果的原因是什么?
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”?如果是这样,就不容易找到解释撇号这个含义的任何页面。
直单引号 (') 用于 string literals(连同直双引号 ("))。
反引号 (`) 用于 quoting identifiers。
如果标识符匹配保留字或包含特殊字符,则必须用引号引起来。带引号的标识符还可以在不区分大小写的字段中指定小写字母(否则可能显示为大写字母)。
CREATE TABLE MyTable (Field INT);
DESCRIBE MyTable;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| FIELD | INT | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
另见 ANSI quote mode。
'price'(撇号或引号)是一个字符串。它永远不会改变,因此计数始终为 1。
`price`(反向)指的是列 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。
请查找 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 |
+-------+-------+