2015-04-01 28 views
7

Co powoduje, że następujące dwa zapytania dają zaskakująco różne wyniki?Co sprawia, że ​​duża różnica między odgałęzieniem a apostrofem?

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) 

Mam googled wokół o wyjaśnienie różnicy między backticks i apostrofów (aka. Apostrofów), ale nie jestem w stanie znaleźć żadnej wskazówki co do dlaczego mieliby być interpretowane w różny sposób dla nazwy kolumny jak w powyższym.

Czy to, że pojedynczy cudzysłów w tym ostatnim zapytaniu faktycznie nie jest interpretowany jako nazwa kolumny, ale tak jak dowolny ciąg literału, o którym można powiedzieć, że jest "1"? Jeśli tak, nie jest łatwo znaleźć jakiekolwiek strony wyjaśniające to znaczenie apostrofu.

Odpowiedz

9

"Cena" (apostrofy lub cytaty) to ciąg znaków. Nigdy się nie zmienia, więc liczba jest zawsze 1.

`cena` (backtics) odnosi się do kolumny price. Może to być więcej niż 1.

Wewnętrzne nawiasy są nieistotne. COUNT(DISTINCT price) jest identyczna z wersją backtic.

  • SELECT COUNT(*) FROM tbl WHERE ... to popularny sposób na pytanie, ile wierszy.
  • SELECT foo, COUNT(*) FROM tbl GROUP BY foo to popularny sposób zapytań o liczbę wierszy dla każdej odrębnej wartości foo.
  • SELECT foo, COUNT(foo) FROM tbl GROUP BY foo jest taki sam jak powyżej, ale nie zlicza wierszy, gdzie foo IS NULL.

SELECT DISTINCT ... GROUP BY ... jest nonsensem. Użyj DISTINCT lub użyj GROUP BY.

5

Prosta apostrof (') służy do string literals (wraz z prostym podwójny cudzysłów (")).

grawis cudzysłów (`) jest dla quoting identifiers.

Identyfikatory muszą być cytowane, jeżeli pasuje słowo zarezerwowane, lub jeśli zawierają znaki specjalne. notowane identyfikatory można również określić małymi literami w przypadku pól niewrażliwe (które w przeciwnym razie mogłyby zostać przedstawione jako wielkie litery).

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

Zobacz także ANSI quote mode .

3

Proszę znaleźć dokumentację MariaDB na temat nazw identyfikatora i napisowych:

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

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

małe cudzysłowy zawsze podawać namens identyfikator. Pojedyncze cytaty zawsze cytują ciągi literowe.

nazwy Identyfikator zastępowane przez ich wartości, literały ciągów znaków nie:

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

widzę nic w tych stronach, które sugerowałyby, że COUNT (DISTINCT) zwróci 1 na sznurku dosłownym, który był co naprawdę wyrzucił mnie, ale dzięki. –