WHERE klauzule slouží k definování omezujících podmínek při dotazování. Ve většině případů nás při dotazování do tabulky nezajímají všechny záznamy, ale pouze určitá jejich podmnožina na základě kritérií. Kritéria definujeme pomocí operátorů.
Pořadí v SQL skriptu
- SELECT
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
Syntaxe WHERE:
SELECT [Sloupec1], [Sloupec2]
FROM Tabulka
WHERE pole <Operator> hodnota
SQL Operátory
Operátorům se budeme věnovat v samostatné kapitole, níže uvedu seznam tzv. porovnávacích operátorů (comparsion) se kterými pracujeme, pokud chceme filtrovat data.
- = [rovná se]
- <> [nerovná se]
- < [je menší než]
- <= [je menší než nebo rovno]
- > [je větší]
- >= [je větší než nebo rovno]
- BETWEEN [je mezi]
- LIKE [jako, podobně]
- IN [více hodnot]
Příklad použítí klauzule WHERE s operátorem BETWEEN a >= <=
Tabulka se kterou budeme pracovat strukturu viz obrázek níže a obsahuje 18484 záznamů:
Pomocí klauzule vyfiltrujeme zákazníky, kteří mají datum narození [BirthDate] mezi 1.1.1920 a 31.12.1921 včetně. Máme 2 možnosti, výsledky budou stejné:
První možností je použití operátoru BETWEEN (krajní datumy se do podmínky počítají)
--Možnost 1
SELECT [CustomerKey]
,[FirstName]
,[LastName]
,[BirthDate]
FROM [AdventureWorksDW2012].[dbo].[DimCustomer]
WHERE BirthDate BETWEEN '1920-01-01' AND '1921-12-31'
druhá možnost je použít operátory <= a >=
--Možnost 2
SELECT [CustomerKey]
,[FirstName]
,[LastName]
,[BirthDate]
FROM [AdventureWorksDW2012].[dbo].[DimCustomer]
WHERE BirthDate >= '1920-01-01' AND BirthDate<= '1921-12-31'
Výsledkem je pouze 5 záznamů zákazníků narozených mezi 1.1.1920 a 31.12.1921
Je prosím nějaké logické vysvětlení, proč nelze v podmínce WHERE používat alias názvu sloupce?
Příklad (funkční):
SELECT cislo FROM (VALUES (10), (20), (30), (40), (50)) as tabulka(cislo) WHERE cislo > 35
Příklad s aliasem sloupce ‘cislo AS c’ a pokusem použít jej v podmínce (nefunkční):
SELECT cislo AS c FROM (VALUES (10), (20), (30), (40), (50)) as tabulka(cislo) WHERE c > 35
Ahoj Lubomíre, díky za výborný dotaz. SQL Server jednotlivé klauzule zpracovává v určitém pořadí. SELECT klauzule se zpracovává jako předposlední. Znamená to, že v momentu, kdy SQL Server vyhodnocuje klauzuli WHERE, tak alias ještě nezná. Téma je už trošku pokročilejší SQL
Jiná situace je kdybys zkusil použít alias v klauzuli ORDER BY která alias znát bude, protože ORDER BY se zpracovává až úplně nakonec za SELECT. Pokusil jsem se to sepsat https://janzednicek.cz/sql-zpracovani-dotazu/.
Není těžké se dovtípit proč se klauzule FROM a WHERE zpracovává úplně na začátku – důvody jsou čistě výkonové => na začátku se SQL Server musí zbavit nepotřebných záznamů (FROM,WHERE) a nad až na záznamy se kterými chceme pracovat dělat SELECT, ORDER BY, GROUP BY agregace, HAVING apod.