SELECT, JOIN, WHERE, ORDER BY, GROUP BY, HAVING, LIMIT, agregace

Formát: 30 min praktická úloha, 15 min obhajoba + teorie. Praktika je psaní SQL dotazů nad existující databází (typicky exams.sqlite) v DB Browser for SQLite. Otázky pokrývají 4 kategorie: jednoduché SELECTy, JOINy, GROUP BY, HAVING.


Část 1: Teorie

Co je SQL a proč existuje

SQL (Structured Query Language) je standardizovaný deklarativní jazyk pro práci s relačními databázemi. Říkám CO chci, ne jak to najít. Optimalizátor DB plánuje vlastní cestu.

SELECT jmeno FROM student WHERE vek > 18;  -- čitelné jako věta

Deklarativní vs imperativní: V imperativním kódu (JavaScript) bys psal smyčku přes pole, kontroloval podmínku, pushoval výsledky. V SQL prostě řekneš "chci to a to". DBMS si rozhodne, jestli použije index, full table scan, parallel query, atd.

Skupiny SQL příkazů (pro ústní zkoušku)

Skupina Příkazy K čemu
DDL (Data Definition) CREATE, ALTER, DROP, TRUNCATE Struktura DB (tabulky, sloupce)
DML (Data Manipulation) INSERT, UPDATE, DELETE Data v tabulkách
DQL (Data Query) SELECT Výběr dat
DCL (Data Control) GRANT, REVOKE Oprávnění
TCL (Transaction Control) COMMIT, ROLLBACK, SAVEPOINT Transakce

Tahle otázka se týká hlavně DQL (SELECT). Někdy se DQL považuje za podmnožinu DML.


Anatomie SELECT dotazu

Pevné syntaktické pořadí klauzulí, vždy stejné:

SELECT     sloupce                -- 1. co chci zobrazit
FROM       tabulka                -- 2. odkud
JOIN       jina ON podmínka       -- 3. připojení dalších tabulek
WHERE      podmínka               -- 4. filtrace ŘÁDKŮ
GROUP BY   sloupce                -- 5. seskupení
HAVING     podmínka               -- 6. filtrace SKUPIN
ORDER BY   sloupce                -- 7. řazení
LIMIT      n OFFSET m;            -- 8. stránkování

Logické (vykonávací) pořadí je úplně jiné, DB nejdřív zjistí tabulku, pak spojí, pak filtruje, atd:

FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

Důsledek: v WHERE nemůžu použít alias ze SELECT (ten ještě neexistuje), ale v ORDER BY ano.


SELECT + FROM: základ

SELECT * FROM student;                             -- všechny sloupce
SELECT jmeno, prijmeni FROM student;               -- jen vybrané
SELECT jmeno AS J FROM student;                    -- alias sloupce
SELECT DISTINCT trida_id FROM student;             -- bez duplicit
SELECT jmeno, vek + 1 AS pristi_rok FROM student;  -- výpočet

Alias tabulky (užitečné u JOINů):