Lekce 2.2

SQL v praxi

Výběr, filtrování a řazení dat, vkládání, úpravy a mazání záznamů, potom JOINy včetně rozdílu LEFT a RIGHT a agregace – vše nad připravenou databází e-shopu.

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č“.

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

Datový model e-shopu Sneaker shop. Tabulka customers má sloupce id (PK), name, email, city a registered_at. Tabulka orders má id (PK), customer_id (FK), created_at a status. Tabulka order_items má order_id (PK, FK), product_id (PK, FK), quantity a price. Tabulka products má id (PK), name, brand, category, price a stock. Čáry vedou z customers do orders, z orders do order_items a z products do order_items, vždy s 1 u tabulky s primárním klíčem a N u tabulky s cizím klíčem.

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

sql
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í

sql
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?

sql
-- ⚠️ 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í

sql
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 error
Bonus

Kolik 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:

sql
SELECT brand FROM products

A potom:

sql
SELECT DISTINCT brand FROM products