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.
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.
| 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.
SELECT dotazuPevné 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 → LIMITDůsledek: v
WHEREnemůžu použít alias zeSELECT(ten ještě neexistuje), ale vORDER BYano.
SELECT + FROM: základSELECT * 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ů):