2015-04-01 6 views
7

Qual è il motivo per cui le due query seguenti danno risultati completamente diversi?Che cosa fa la grande differenza tra un apice e un apostrofo?

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) 

Googled intorno per una spiegazione della differenza tra apici inversi e apostrofi (aka. Apici), ma sono in grado di trovare alcuna indicazione sul motivo per cui sarebbero stati interpretati in modo diverso per un nome di colonna come in quanto sopra.

È che la stringa con quotatura singola nell'ultima query non viene in realtà interpretata come un nome di colonna, ma solo come un letterale stringa arbitrario, di cui si può dire che sia "1"? Se è così, non è facile trovare pagine che espongono questo significato dell'apostrofo.

risposta

9

'prezzo' (apostrofi o virgolette) è una stringa. Non cambia mai, quindi il conteggio è sempre 1.

`prezzo` (retroattivi) si riferisce alla colonna price. Quindi potrebbe essere superiore a 1.

Le parentesi interne sono irrilevanti. COUNT(DISTINCT price) è lo stesso della versione del backtic.

  • SELECT COUNT(*) FROM tbl WHERE ... è un modo comune per chiedere quante righe.
  • SELECT foo, COUNT(*) FROM tbl GROUP BY foo è un modo comune per chiedere quante righe per ogni valore distinto di foo.
  • SELECT foo, COUNT(foo) FROM tbl GROUP BY foo è lo stesso di sopra, ma non conteggia le righe dove foo IS NULL.

SELECT DISTINCT ... GROUP BY ... è una dichiarazione senza senso. Utilizzare DISTINCT o utilizzare GROUP BY.

5

Una citazione singola diritta (') viene utilizzato per string literals (insieme a dritto virgolette (")).

Una citazione apice inverso (`) è per quoting identifiers.

identificatori vanno indicati se abbinare una parola riservata, o se contengono caratteri speciali. identificatori tra virgolette possono anche specificare minuscole nei campi case-insensitive (che altrimenti potrebbe essere mostrato in maiuscolo).

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

Vedi anche ANSI quote mode .

3

Si prega di trovare la documentazione di MariaDB sui nomi di identificatore e stringhe letterali:

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

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

apici citare sempre Namens identificatore. Le virgolette singole citano sempre le stringhe letterali.

nomi Identifier vengono sostituiti dal loro valore, stringhe letterali non lo fanno:

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

non vedo nulla in quelle pagine per suggerire che COUNT (DISTINCT) restituirà 1 su una stringa letterale, che era ciò che realmente ha gettato me ne vado, ma grazie comunque. –

Problemi correlati