Mysql
 sql >> Database >  >> RDS >> Mysql

In che modo mysql definisce DISTINCT() nella documentazione di riferimento

Per completezza, rispondo da solo e mi collego a un altro domanda di mio. Sembra che questo comportamento sia una diretta conseguenza dello standard SQL che consente spazi bianchi tra la funzione e le parentesi.

Poiché è (generalmente) consentito dire FUNCTION_NAME (x), quando questa funzione viene applicata a un primo termine di select

SELECT FUNCTION_NAME (x)

allora il parser avrà difficoltà a stabilire se questo è un contesto di un nome di funzione o una parola chiave di modifica SELECT.

Quindi, nel caso precedente, FUNCTION_NAME è in realtà FUNCTION_NAME_OR_KEYWORD per il parser.

Ma va oltre:poiché lo spazio tra il nome della funzione e la parentesi È consentito, il parser in realtà NON può distinguere tra

SELECT FUNCTION_NAME_OR_KEYWORD (x)

e

SELECT FUNCTION_NAME_OR_KEYWORD(x)

(deve testare le parole chiave per vedere se sono funzioni), e poiché (x) verrà analizzato in x ne consegue che per FUNCTION_NAME_OR_KEYWORD -> DISTINCT (e tutte le altre parole chiave di modifica SELECT) non c'è differenza tra

SELECT DISTINCT x, y, z, ...

e

SELECT DISTINCT(x), y, z, ...

QED, ma senza riferimenti concreti (supponendo che standard non mi interessa lo spazio bianco tra i nomi delle funzioni e le parentesi è, credo, giustificato, ma non sono stato in grado di seguire la grammatica BNF al punto da poter citare la regola esatta).

NOTA:mysql ha un certo numero di funzioni in cui si preoccupa degli spazi bianchi tra le funzioni e le parentesi, ma credo che queste siano eccezioni (quindi l'opzione del server per ignorarlo)