Jazyk SQL
V minulé lekci jsme data rozdělili do tabulek a propojili je klíči. Teď se jich začneme ptát. Jazyk, kterým se s relační databází mluví, se jmenuje SQL (Structured Query Language).
K čemu je SQL
SQL bylo vyvinuté tak, aby co nejvíce přípomínalo přirozený jazyk (v angličtině). Pomocí SQL popisujeme, co chceme z databáze dostat.
Když napíšeme dotaz níže, je i naprostému laikovi jasné, že chceme vybrat „názvy tenisek levnějších než 2 500 Kč“.
SELECT name FROM products WHERE price < 2500;Stejným jazykem se ovládá většina relačních databází: PostgreSQL, MySQL, SQLite i ostatní databáze zmíněné v minulé lekci. Každá databáze ale může použít mírně odlišný dialekt, kde se pak některé drobnosti mezi databázemi liší.
Je zvykem, že klíčová slova (INSERT, UPDATE, DELETE, apod.) se píšou velkými písmeny a jména tabulek a sloupců malými. často se také jednotlivé části dotazu píšou na samostatné řádky. Databázi je to jedno, ale takto zapsaný dotaz se tak lépe čte. Každý příkaz končí středníkem.
Databáze Sneaker shop
Dotazy budeme zkoušet nad databází e-shopu s teniskami a oblečením. Běží přímo v prohlížeči na stránce Sneaker shop. Otevřete si ji v nové kartě, ať máte výklad i databázi po ruce.
Na levé straně stránky je vidět databázový model (tabulky, sloupce, datové typy).
Ukázková databáze žije jen ve vašem prohlížeči. Obnovení stránky nebo tlačítko Obnovit databázi ji vrátí do výchozího stavu, takže nic nerozbijete natrvalo. To se nám bude hodit, až si budete zkoušet mazání dat.
Výběr dat
SELECT name, brand, price
FROM products;Za SELECT vyjmenujeme sloupce, za FROM tabulku. Výsledek je zase tabulka, tentokrát jen se třemi sloupci. Když chceme všechny sloupce, napíšeme místo jejich výčtu hvězdičku: SELECT * FROM products;.
Filtrování
SELECT name, price
FROM products
WHERE category = 'tenisky' AND price < 2500;WHERE propustí jen řádky, které splní podmínku. Text píšeme do apostrofů, čísla bez nich. Porovnávat můžeme přes =, <> (nerovná se), <, >, <= a >= a podmínky skládat přes AND a OR.
Na hledání části textu je LIKE, kde procento znamená libovolný text: WHERE name LIKE 'Mikina%' najde všechno, co začíná slovem Mikina.
Jeden zákazník nemá vyplněné město. Jak ho najdeme?
-- ⚠️ chyba, nevrátí nic
SELECT name FROM customers WHERE city = NULL;
-- ✅ správně
SELECT name FROM customers WHERE city IS NULL;NULL představuje prázdnou hodnotu a v SQL se většinou používá ve významu „nevyplněno“ nebo „nevíme“. Na hodnotu NULL je nejde ptát pomocí tradičních operátorů = nebo <>, ale má vlastní zápis IS NULL a IS NOT NULL.
Řazení
SELECT name, brand, price
FROM products
ORDER BY price DESC
LIMIT 3;ORDER BY řadí podle sloupce, DESC sestupně a ASC (výchozí) vzestupně. Řadit jde i podle víc sloupců: ORDER BY brand, price DESC seřadí podle značky a v rámci značky od nejdražšího. Pokud neuvedeme směr řazení, ale nepíšeme jenom ORDER BY price, bude se řadit vzestupně.
LIMIT vrátí jen prvních x řádků, v našem příkladu tři nejdražší produkty.
Z minulé lekce víme, že pořadí řádků v tabulce nic neznamená. Bez ORDER BY nám databáze vrátí řádky, jak se jí to zrovna hodí.
Části dotazu mají pevné pořadí: SELECT, FROM, WHERE, ORDER BY a nakonec LIMIT. Když napíšeme WHERE až za ORDER BY, databáze dotaz odmítne a v hlášce jmenuje místo, kde se zarazila:
near "WHERE": syntax errorKolik různých značek obchod prodává? SELECT brand FROM products vypíše značku u každého produktu, takže se opakují. Zjistěte si, co s výsledkem udělá klíčové slovo DISTINCT.
Zkuste nejprve:
SELECT brand FROM productsA potom:
SELECT DISTINCT brand FROM products