sql >> Database >  >> RDS >> PostgreSQL

Logische verwerkingsvolgorde of SQL-standaard in WHERE-clausule

Het is de regel uit de SQL-standaard (die nogal ingewikkeld is omdat hij ingaat op veel details waar gebruikers van SQL waarschijnlijk niet aan denken).

Er zijn twee principes achter de regel. De eerste is dat de standaard geen volgorde van bewerkingen oplegt, behalve wanneer dit logisch noodzakelijk is (een having clausule moet bijvoorbeeld logisch worden verwerkt na een group by ). Dit is de basis van het idee bij SQL is een beschrijvend taal, waar de resultaten worden beschreven. Elke specifieke database-engine kan zijn eigen uitvoeringspaden bepalen.

Het tweede principe is om dubbelzinnigheid te vermijden. Dit is waar scopingregels binnenkomen, die bepalen wat een SQL-compiler wanneer weet.

Overweeg de volgende uitspraak:

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

De vraag is:welke a doet a+1 verwijzen naar de kolom a in de tabel of de kolom b (die een alias is als a ) in de select . Volgens de norm is dit eenduidig. Kolomaliassen zijn niet bekend in de select clausule waar ze zijn gedefinieerd.

Dit strekt zich uit tot de where clausule ook, die wordt geëvalueerd in dezelfde reikwijdte. Beschouw hetzelfde voorbeeld:

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

Welke a doet de where toestand verwijzen naar? De norm is eenduidig. De where clausule begrijpt geen kolomaliassen in de select . Dit komt omdat de select wordt (logisch) geëvalueerd na de where . Dus, als je zegt:

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

De geretourneerde waarde begint met de eerste a na 100. De opsomming gebeurt niet eerst, waarbij gefilterde rijen volgnummers krijgen die eruit worden gefilterd.




  1. Fout met Maven GAE-plug-in + Google Cloud SQL

  2. kopiëren naar tijdelijke tabel duurt lang

  3. Query-optimalisatie in PostgreSQL. UITLEG Basisprincipes - Deel 2

  4. T-SQL:kolom selecteren op basis van MAX (andere kolom)