sql >> Databasteknik >  >> RDS >> PostgreSQL

Logical Processing Order eller SQL Standard i WHERE-sats

Det är regeln från SQL-standarden (som är ganska komplicerad eftersom den går in på massor av detaljer som användare av SQL förmodligen inte tänker på).

Det finns två principer bakom regeln. Den första är att standarden inte ålägger en ordning av operationer, förutom när det är logiskt nödvändigt (en ha sats, till exempel, måste logiskt bearbetas efter en grupp efter ). Detta är grunden för uppfattningen att SQL är en beskrivande språk, där resultaten beskrivs. Vilken speciell databasmotor som helst kan bestämma sina egna exekveringsvägar.

Den andra principen är att undvika oklarheter. Det är här scoping-reglerna kommer in, som definierar vad en SQL-kompilator vet när.

Tänk på följande påstående:

select a as b, b as a, a + 1 as d
-----------------------^
from t

Frågan är:vilken a gör a+1 se kolumnen a i tabellen eller kolumnen b (som är alias som a ) i select . Enligt standarden är detta entydigt. Kolumnalias är inte kända i select klausul där de definieras.

Detta sträcker sig till where klausulen, som utvärderas i samma omfattning. Tänk på samma exempel:

select a as b, b as a, a + 1 as d
from t
where a > 100

Vilken a gör var tillstånd hänvisar till? Standarden är entydig. var satsen förstår inte kolumnalias i select . Detta beror på att välj utvärderas (logiskt) efter var . Så när du säger:

select row_number() over (order by a) as seqnum
from t
where a > 100

Det returnerade värdet börjar med det första a efter 100. Uppräkningen sker inte först, med filtrerade rader som får sekvensnummer som filtreras bort.




  1. Hur man får maxvärdet för kolumntyp heltal lagrat som typtext i sqlite-tabellen

  2. World Backup Day:Hur och när ska du säkerhetskopiera din databas?

  3. JDBC :hämta typen av en array från metadata

  4. Sök i alla kolumner i en tabell med ett enda where-villkor med ett enda nyckelord i mysql