SQL Zpracování dotazu – V jakém pořadí SQL Server vyhodnocuje klauzule?

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:

  1. SELECT,
  2. FROM,
  3. WHERE,
  4. GROUP BY,
  5. HAVING,
  6. ORDER BY

Logicky je SQL dotaz vyhodnocen v jiném pořadí:

  1. FROM,
  2. WHERE,
  3. GROUP BY,
  4. HAVING,
  5. SELECT,
  6. 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 totoho dotazu bude chyba, 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.

SQL zpracování dotazu

SQL zpracování dotazu – chybné pořadí klauzulí

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ě.

SQL zpracování dotazu

Příklad správného pořadí s ORDER BY odkazem na alias v SELECT klauzuli

Reagovat na příspěvek