Pořadí, v jakém se SQL klauzule do dotazu zadávají je všeobecně celkem známé. Pořadí logického SQL zpracování dotazu (logical query processing) je ale jiné než pořadí, v jakém je píšeme do skriptu.
Seznam SQL klauzulí v pořadí, jakém po sobě následují v SQL skriptu
Klauzule se do SQL dotazu píší v tomto pořadí
- SELECT,
- FROM,
- WHERE,
- GROUP BY,
- HAVING,
- ORDER BY
Seznam SQL klauzulí v pořadí, ve kterém se provedou
Logicky je SQL dotaz vyhodnocen v jiném pořadí než se píše ve skriptu
- FROM,
- WHERE,
- GROUP BY,
- HAVING,
- SELECT,
- ORDER BY
Všimněte si například klauzule SELECT. Vidíme, že je vyhodnocena předposlední i přes to, že ve skriptu musí být uvedena jako první. To znamená, že všechny klauzule před ní – FROM (1), WHERE (2), GROUP BY (3), HAVING (4) nevidí to, co se stane v klauzuli SELECT (5), to vidí až klauzule ORDER BY (6). Jaký to má dopad si ukážeme v příkladu.
Logické SQL zpracování dotazu příklad:
Podívejme se na skript, který schválně napíšeme špatně:
SELECT [CustomerKey] AS ID_Zakaznik
,[FirstName] AS Jmeno
,[LastName] AS Prijmeni
,[BirthDate] AS Datum_narozeni
FROM [AdventureWorksDW2012].[dbo].[DimCustomer]
WHERE Datum_narozeni>'1940-01-01'
Výsledkem tohoho dotazu bude chyba – Invalid column name, protože jsme v SELECT (5) definovali alias Datum_narozeni a tento alias poté používáme ve WHERE (2) klauzuli. Ta byla ale už dávno zpracovaná a v době jejího zpracování ještě alias nebyl vytvořen.
Situace ale bude jiná, pokud alias aplikujeme až v ORDER BY. SELECT je totiž zpracován dříve (5) než ORDER BY (6), proto bude alias znát a dotaz proběhne úspěšně.