SQL WHERE – Zadáváme podmínku u tabulky pomocí SQL

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

  1. SELECT
  2. FROM
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. 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ů:

Dimcustomer-pred-WHERE-klauzuli

Vstupní data

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

Vysledek po omezeni SQL WHERE

Výsledek příkladu po aplikaci klauzule




5/5 - (2 votes)
Rubrika: SQL klauzule Základy SQL

O Ing. Jan Zedníček - Data Engineer & Controlling

Jmenuji se Honza Zedníček a působím jako data engineer freelancer. Během cca 10 let jsem zde shromáždil přes 600 IT case studies, průvodců, návodů a tipů určených zejména odborné veřejnosti, studentům a zájemcům o informace z oblastí Data Engineeringu, korporátních financí a reportingu. Zaměřuji se především na Microsoft technologie (on-prem i cloud) a různé synergické efekty v rámci jejich produktového portfolia pro dataře a finanční profesionály. Věnuji se také dalším platformám a významným hráčům z oblasti open source technologií. 🔥 Pokud vám tento článek pomohl, ocením referenci na vašem webu nebo zmínku v komunitě. A mám pro vás ještě tip: řešíte-li nějaký zapeklitý Excel problém, přihlašte se do naší Excel Facebook skupiny (2.4k+ členů), kde si pomáháme Excel CZ/SK diskuse ».

2 thoughts on “SQL WHERE – Zadáváme podmínku u tabulky pomocí SQL

  1. Lubomír

    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

  2. Honza Zedníček Autor

    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.

Leave a Reply

Your email address will not be published. Required fields are marked *