🔎 SQL: SELECT a WHERE

Otázka databázi

O čem to je

Když se ve školní kanceláři zeptáš „Kdo chodí do 2.A?“, sekretářka projde kartotéku a přečte ti jména. Databázi se ptáš stejně, jen přesnou větou v jazyce SQL. Té větě se říká dotaz.

Nejčastější dotaz začíná slovem SELECT (vyber). Používá ho každý web, který ti něco ukazuje: seznam zboží, výsledky hledání, tvoje známky.

Nové pojmy

SQLStructured Query Language, jazyk pro práci s relačními databázemi. Klíčová slova se píšou obvykle velkými písmeny, ale na velikosti nezáleží. Příkaz končí středníkem.SELECT jmeno FROM zaci;
DotazPříkaz, který z databáze něco čte. Výsledkem je opět tabulka.Dotaz na jména žáků 2.A vrátí tabulku se dvěma řádky.
SELECT … FROM …Za SELECT napíšeš sloupce, které chceš vidět, za FROM tabulku. Hvězdička * znamená všechny sloupce.SELECT jmeno, prijmeni FROM zaci;
WHEREPodmínka, která vybere jen některé řádky. Textové hodnoty se píšou do jednoduchých apostrofů.WHERE trida = '2.A'

Ukázková tabulka zaci

idjmenoprijmenitridarok_narozeni
1EvaMalá2.A2009
2PetrNovák2.A2008
3JanaSvobodová3.B2008
4TomášČerný3.B2007
5LucieMalá1.C2010

První dotazy

  • SELECT jmeno, prijmeni
  • FROM zaci
  • WHERE trida = '2.A';

Výsledek: Eva Malá a Petr Novák. SŘBD vezme tabulku zaci (FROM), nechá jen řádky třídy 2.A (WHERE) a ukáže dva sloupce (SELECT).

OperátorVýznamPříklad
=rovná setrida = '3.B'
<> (nebo !=)nerovná setrida <> '1.C'
< > <= >=menší, větší…rok_narozeni >= 2009
AND, OR, NOTa zároveň, nebo, negacetrida = '2.A' AND rok_narozeni = 2008
Napiš dotaz na všechny sloupce žáků narozených před rokem 2009.
SELECT * FROM zaci WHERE rok_narozeni < 2009; Vrátí Petra (2008), Janu (2008) a Tomáše (2007), tedy 3 řádky.
Kolik řádků vrátí SELECT jmeno FROM zaci WHERE trida = '3.B' OR rok_narozeni = 2010;?
Třída 3.B: Jana a Tomáš. Rok 2010: Lucie. U OR stačí jedna podmínka, celkem 3 řádky.
✗SELECT * FROM zaci WHERE trida = 2.A;
✓SELECT * FROM zaci WHERE trida = '2.A';

Text musí být v jednoduchých apostrofech. Bez nich SŘBD nerozumí, co je 2.A, a ohlásí chybu.

Dotaz SELECT sloupce FROM tabulka WHERE podmínka; vybere ze zadané tabulky řádky, které splňují podmínku, a ukáže zvolené sloupce. Text patří do apostrofů, * znamená všechny sloupce.

Chytřejší podmínky

O čem to je

Na e-shopu filtruješ: cena od 500 do 1 000 Kč, značka Nike nebo Adidas, název obsahuje „mikina“. Každý takový filtr se v databázi změní v podmínku za WHERE. SQL na to má pohodlné operátory.

Naučíš se BETWEEN, IN, LIKE, IS NULL, odstranění duplicit a přejmenování sloupců. Pracujeme se stejnou tabulkou žáků.

Nové pojmy

Dotaz SELECTSELECT sloupce FROM tabulka WHERE podmínka; – vybere řádky splňující podmínku a zobrazí dané sloupce.SELECT jmeno FROM zaci WHERE trida = '2.A';
BETWEEN a AND bHodnota leží v rozsahu od a do b včetně obou krajů.rok_narozeni BETWEEN 2008 AND 2009
IN (…)Hodnota je jedna z vyjmenovaných.trida IN ('2.A', '1.C')
LIKE a zástupné znakyPorovnání textu se vzorem. % zastoupí libovolný počet znaků (i žádný), _ právě jeden znak.prijmeni LIKE 'M%' = příjmení začíná na M.
IS NULLTest, jestli hodnota chybí. S NULL nefunguje =, protože NULL není hodnota, ale „neznámo“.WHERE telefon IS NULL
DISTINCT a ASDISTINCT odstraní z výsledku opakující se řádky. AS dá sloupci ve výsledku jiný název (alias).SELECT DISTINCT trida AS skupina FROM zaci;
idjmenoprijmenitridarok_narozeni
1EvaMalá2.A2009
2PetrNovák2.A2008
3JanaSvobodová3.B2008
4TomášČerný3.B2007
5LucieMalá1.C2010
Dotaz (za SELECT jmeno FROM zaci)Výsledek
WHERE rok_narozeni BETWEEN 2008 AND 2009Eva, Petr, Jana
WHERE trida IN ('2.A', '1.C')Eva, Petr, Lucie
WHERE prijmeni LIKE 'M%'Eva, Lucie
WHERE prijmeni LIKE '%ová'Jana
WHERE NOT trida = '2.A'Jana, Tomáš, Lucie

Pořadí vyhodnocení

FROM: SŘBD vezme tabulku.
WHERE: nechá jen řádky, které splňují podmínku.
SELECT: vybere sloupce a spočítá výrazy.
DISTINCT: odstraní opakované řádky výsledku.

Proto nemůžeš ve WHERE použít alias z SELECT: v okamžiku, kdy se vyhodnocuje WHERE, ještě neexistuje.

Co vrátí SELECT DISTINCT trida FROM zaci;?
Sloupec třída má hodnoty 2.A, 2.A, 3.B, 3.B, 1.C. DISTINCT duplicity odstraní: 2.A, 3.B, 1.C, tedy 3 řádky.
Kolik řádků vrátí SELECT * FROM zaci WHERE trida = '2.A' OR trida = '3.B' AND rok_narozeni = 2007;?
AND má přednost před OR. Podmínka je: 2.A, nebo (3.B a zároveň 2007). 2.A: Eva, Petr. 3.B a 2007: Tomáš. Celkem 3. Se závorkami (trida = '2.A' OR trida = '3.B') AND rok_narozeni = 2007 by vyšel jen Tomáš.
✗WHERE telefon = NULL
✓WHERE telefon IS NULL

Porovnání s NULL přes = nikdy nevrátí pravdu, výsledek je „neznámo“. Proto dotaz nevrátí ani jeden řádek.

BETWEEN testuje rozsah včetně krajů, IN výčet, LIKE vzor s % a _, IS NULL chybějící hodnotu. DISTINCT odstraní duplicity, AS přejmenuje sloupec. AND má přednost před OR.