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.

Bonus: Tabulky

Tahle kapitola je navíc pro ty, kdo mají hotová cvičení a chtějí jít dál. Zbytek lekce ji nepotřebuje.

Zatím jsme pracovali s tabulkami, které v databázi už byly. Strukturu databáze mění poslední skupina příkazů SQL: CREATE TABLE tabulku zakládá, ALTER TABLE upravuje a DROP TABLE maže. Všechno si můžete vyzkoušet v databázi Sneaker shop. Přehled tabulek vlevo se po každém příkazu překreslí, takže změnu uvidíte hned.

Vytvoření / CREATE TABLE

Obchod chce u produktů sbírat recenze. Založíme pro ně novou tabulku:

sql
CREATE TABLE reviews (
  id INTEGER PRIMARY KEY,
  product_id INTEGER NOT NULL REFERENCES products (id),
  rating INTEGER NOT NULL CHECK (rating BETWEEN 1 AND 5),
  comment TEXT,
  created_at TEXT NOT NULL
);

Za názvem tabulky jsou v závorce vyjmenované sloupce, oddělené čárkou. Každý sloupec má jméno, datový typ a případně omezení. PRIMARY KEY, NOT NULL i cizí klíč přes REFERENCES známe z minulé lekce. Nové je CHECK: podmínka, kterou musí splnit každá zapsaná hodnota, tady hodnocení od jedné do pěti hvězdiček. Sloupec comment žádné omezení nemá, recenze tedy může být i bez textu.

Do nové tabulky zapisujeme stejně jako do ostatních:

sql
INSERT INTO reviews (product_id, rating, comment, created_at)
VALUES (1, 5, 'Sedí jako ulité.', '2026-10-25');

Co se stane, když recenzi přiřadíme produktu, který neexistuje? A co hodnocení šest hvězdiček?

sql
INSERT INTO reviews (product_id, rating, created_at)
VALUES (999, 4, '2026-10-26');
-- výsledek ???

INSERT INTO reviews (product_id, rating, created_at)
VALUES (1, 6, '2026-10-26');
-- výsledek ???

Výsledky schválně neprozradíme, zkuste si je. Přehled datových typů a omezení najdete v nápovědě v nástroji.

Úprava / ALTER TABLE

Zákazníkům chceme ukládat i telefon. Do existující tabulky přidáme sloupec:

sql
ALTER TABLE customers ADD COLUMN phone TEXT;

Zákazníci, kteří už v tabulce jsou, mají v novém sloupci NULL. Proto nejde jen tak přidat sloupec s NOT NULL, databáze by neměla co zapsat do stávajících řádků:

Cannot add a NOT NULL column with default value NULL

Pomůže výchozí hodnota přes DEFAULT, kterou databáze doplní všem stávajícím řádkům:

sql
ALTER TABLE products ADD COLUMN active INTEGER NOT NULL DEFAULT 1;

Sloupec jde také přejmenovat nebo smazat a stejně tak jde přejmenovat celá tabulka:

sql
ALTER TABLE customers RENAME COLUMN phone TO phone_number;
ALTER TABLE customers DROP COLUMN phone_number;
ALTER TABLE reviews RENAME TO product_reviews;

Změnit typ existujícího sloupce SQLite neumí. Jiné databáze na to mají vlastní příkaz, v SQLite se musí založit nová tabulka a data se do ní přenesou.

Smazání / DROP TABLE

sql
DROP TABLE product_reviews;

DROP TABLE smaže tabulku i se všemi daty. Stejně jako u DELETE bez WHERE se databáze nezeptá, jestli to tak myslíme.

Zkusme teď smazat tabulku zákazníků:

sql
DROP TABLE customers;
-- výsledek ???

Proč to dopadlo právě takhle, odvodíte z kapitoly o změně dat. Smazanou tabulku i všechny ostatní změny vrátí tlačítko Obnovit databázi.