sql >> Database teknologi >  >> RDS >> PostgreSQL

Logical Processing Order eller SQL Standard i WHERE-klausul

Det er reglen fra SQL-standarden (som er ret kompliceret, fordi den går ind i mange detaljer, som brugere af SQL sandsynligvis ikke tænker over).

Der er to principper bag reglen. Den første er, at standarden ikke pålægger en rækkefølge af operationer, undtagen når det er logisk nødvendigt (en have klausul, for eksempel, skal logisk behandles efter en gruppe efter ). Dette er grundlaget for begrebet ved SQL er en beskrivende sprog, hvor resultaterne er beskrevet. Enhver bestemt databasemotor kan bestemme sine egne udførelsesstier.

Det andet princip er at undgå tvetydighed. Det er her scoping-reglerne kommer ind, som definerer, hvad en SQL-kompiler ved hvornår.

Overvej følgende udsagn:

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

Spørgsmålet er:hvilken a gør a+1 se kolonnen a i tabellen eller kolonnen b (som er kaldet a ) i vælg . Ifølge standarden er dette entydigt. Kolonnealiasser kendes ikke i select klausul, hvor de er defineret.

Dette strækker sig til where klausul også, som vurderes i samme omfang. Overvej det samme eksempel:

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

Hvilken a gør hvor tilstand henvise til? Standarden er entydig. hvor klausulen forstår ikke kolonnealiaser i select . Dette skyldes, at vælg er (logisk) evalueret efter hvor . Så når du siger:

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

Den returnerede værdi starter med den første a efter 100. Optællingen sker ikke først, hvor filtrerede rækker får sekvensnumre, der filtreres fra.




  1. MySQL Connector og VC2010 header kollision

  2. hvordan man nulstiller Identity-kolonnen i Oracle

  3. Jeg er ikke i stand til at finde ud af, hvilken forkert jeg begik ved at lave denne MYSQL-forespørgsel

  4. Gruppér output af VIS KOLONNER i en kommasepareret liste