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

Hvordan definerer mysql DISTINCT() i referencedokumentation

For fuldstændighedens skyld svarer jeg på mit eget og linker til en anden spørgsmål af min egen. Det ser ud til, at denne adfærd er en direkte konsekvens af, at SQL-standarden tillader mellemrum mellem funktionen og parentes.

Da det (generelt) er tilladt at sige FUNCTION_NAME (x), så når denne funktion anvendes på en første term af udvalg

SELECT FUNCTION_NAME (x)

så vil parseren have svært ved at fastslå, om dette er en kontekst af et funktionsnavn eller SELECT-modificerende nøgleord.

Så i ovenstående tilfælde er FUNCTION_NAME faktisk FUNCTION_NAME_OR_KEYWORD for parseren.

Men det går længere:da mellemrummet mellem funktionsnavn og parentes ER tilladt, kan parseren faktisk IKKE skelne mellem

SELECT FUNCTION_NAME_OR_KEYWORD (x)

og

SELECT FUNCTION_NAME_OR_KEYWORD(x)

(det skal teste nøgleordene for at se, om de er funktioner), og da (x) vil blive parset til x, følger det, at for FUNCTION_NAME_OR_KEYWORD -> DISTINCT (og alle andre SELECT-modificerende søgeord) er der ingen forskel mellem

SELECT DISTINCT x, y, z, ...

og

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

QED, men uden faste referencer (antagelse af, at standard er ligeglad med mellemrum mellem funktionsnavne og parenteser er, tror jeg, berettiget, men jeg var ikke i stand til at følge BNF grammatik til det punkt, at jeg kunne citere den nøjagtige regel).

BEMÆRK:mysql har et vist antal funktioner, hvor det bekymrer sig om mellemrum mellem funktioner og parenteser, men jeg tror, ​​at disse er undtagelser (derfor server mulighed for at ignorere det)



  1. Bind adresse og MySQL-server

  2. SQL Server 2016 Temporal Table Query Plan Behavior

  3. Effekt af NOLOCK-tip i SELECT-sætninger

  4. Begræns SQL ved summen af ​​rækkens værdi