Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie definiert mysql DISTINCT() in der Referenzdokumentation

Der Vollständigkeit halber beantworte ich meine eigene und verlinke auf eine andere Frage von mir selbst. Es scheint, dass dieses Verhalten eine direkte Folge davon ist, dass der SQL-Standard Leerzeichen zwischen der Funktion und der Klammer zulässt.

Da es (allgemein) erlaubt ist, FUNCTION_NAME (x) dann zu sagen, wenn diese Funktion auf einen ersten Begriff von select angewendet wird

SELECT FUNCTION_NAME (x)

dann wird es dem Parser schwerfallen, festzustellen, ob dies ein Kontext eines Funktionsnamens oder eines SELECT-ändernden Schlüsselworts ist.

Im obigen Fall ist also FUNCTION_NAME für den Parser tatsächlich FUNCTION_NAME_OR_KEYWORD.

Aber es geht noch weiter:Da das Leerzeichen zwischen Funktionsname und Klammer erlaubt ist, kann der Parser eigentlich NICHT zwischen

unterscheiden
SELECT FUNCTION_NAME_OR_KEYWORD (x)

und

SELECT FUNCTION_NAME_OR_KEYWORD(x)

(es muss die Schlüsselwörter testen, um zu sehen, ob es sich um Funktionen handelt), und da (x) zu x geparst wird, folgt daraus, dass es für FUNCTION_NAME_OR_KEYWORD -> DISTINCT (und alle anderen SELECT-modifizierenden Schlüsselwörter) keinen Unterschied zwischen gibt

SELECT DISTINCT x, y, z, ...

und

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

QED, aber ohne harte Referenzen (Annahme, dass Standard sich nicht um Leerzeichen zwischen Funktionsnamen und Klammern kümmert, ist meines Erachtens gerechtfertigt, aber ich konnte der BNF-Grammatik nicht so weit folgen, dass ich die genaue Regel zitieren könnte).

HINWEIS:mysql hat eine bestimmte Anzahl von Funktionen, bei denen es um Leerzeichen zwischen Funktionen und Klammern geht, aber ich glaube, dass dies Ausnahmen sind (daher die Serveroption, sie zu ignorieren)