Než nalije truhlář do formy lepidlo, musí formu postavit: určit rozměry a z jakého materiálu bude. U databáze je to stejné. Než do tabulky uložíš první řádek, musíš ji vytvořit: říct, jaké má sloupce, jakého typu a jaká pravidla musí data splňovat.
Část SQL, která vytváří a mění strukturu databáze, se jmenuje DDL. Dobře nastavená pravidla ušetří spoustu chyb: databáze sama odmítne nesmyslná data.
CREATE (vytvoř), ALTER (změň), DROP (smaž celý objekt).CREATE TABLE zaci (…);INT celé číslo, VARCHAR(50) text do 50 znaků.NOT NULL: hodnota nesmí chybět.PRIMARY KEY) jednoznačně určuje řádek. Cizí klíč (FOREIGN KEY … REFERENCES …) odkazuje na primární klíč jiné tabulky.id_tridy v tabulce žáků odkazuje na tabulku tříd.| Typ | Na co | Příklad |
|---|---|---|
INT | celé číslo | počet kusů |
DECIMAL(8, 2) | přesné desetinné číslo: 8 číslic, z toho 2 za čárkou | cena 123456.78 |
VARCHAR(n) | text proměnné délky, nejvýš n znaků | jméno |
CHAR(n) | text pevné délky n | kód státu „CZ“ |
DATE | datum, zapisuje se '2025-09-01' | datum narození |
BOOLEAN | pravda/nepravda (ne každý SŘBD ho má) | aktivní účet |
| Omezení | Co hlídá |
|---|---|
PRIMARY KEY | jedinečnost a NOT NULL klíče |
NOT NULL | hodnota nesmí chybět |
UNIQUE | hodnota se ve sloupci nesmí opakovat |
DEFAULT x | když hodnotu nezadáš, použije se x |
CHECK (podmínka) | hodnota musí splnit podmínku |
FOREIGN KEY … REFERENCES … | hodnota musí existovat v odkazované tabulce |
CREATE TABLE tridy ( id INT PRIMARY KEY, nazev VARCHAR(10) NOT NULL UNIQUE);CREATE TABLE zaci ( id INT PRIMARY KEY, jmeno VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, rok_narozeni INT CHECK (rok_narozeni > 1990), id_tridy INT NOT NULL, FOREIGN KEY (id_tridy) REFERENCES tridy(id));Tabulku tridy musíš vytvořit dřív. Cizí klíč může odkazovat jen na tabulku, která už existuje.
FLOAT a REAL ukládají čísla přibližně a u peněz by vznikaly zaokrouhlovací chyby.ALTER TABLE zaci ADD telefon VARCHAR(20); přidá sloupec (u existujících řádků bude NULL). DROP TABLE krouzky; smaže tabulku i se všemi daty, bez možnosti vrácení.INT, je to přece číslo.CHAR(5) nebo VARCHAR(6).S PSČ se nepočítá. Navíc čísla ztrácejí úvodní nuly a nepojmou mezeru („110 00“). Totéž platí pro telefonní čísla.
CREATE TABLE, ALTER TABLE, DROP TABLE. Každý sloupec má datový typ. Omezení (PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT, CHECK, FOREIGN KEY) brání uložení nesmyslných dat.Do školy nastoupí nový žák, jiný se přestěhuje a další odejde. Tabulky už existují, mění se jen jejich obsah. Na to slouží tři příkazy: INSERT, UPDATE a DELETE.
Jsou jednoduché, ale nebezpečné. Jedna zapomenutá podmínka a změníš nebo smažeš data celé školy. Proto se naučíš i to, jak se tomu bránit.
NOT NULL, UNIQUE, cizí klíč…) SŘBD kontroluje při každé změně dat.Vložení žáka bez povinného jména SŘBD odmítne.SELECT (čti), INSERT (vlož), UPDATE (změň), DELETE (smaž).INSERT INTO zaci …INSERT INTO … VALUES …Vloží nový řádek. Za jménem tabulky vyjmenuj sloupce, za VALUES hodnoty ve stejném pořadí.INSERT INTO zaci (id, jmeno, id_tridy) VALUES (6, 'Adam', 2);UPDATE … SET … WHERE …Změní hodnoty ve sloupcích u řádků, které splní podmínku WHERE.UPDATE zaci SET id_tridy = 3 WHERE id = 6;DELETE FROM … WHERE …Smaže řádky, které splní podmínku.DELETE FROM zaci WHERE id = 6;| Příkaz | S WHERE id = 6 | Bez WHERE |
|---|---|---|
UPDATE zaci SET id_tridy = 3 | změní třídu jednomu žákovi | přesune do třídy 3 všechny žáky |
DELETE FROM zaci | smaže jednoho žáka | smaže všechny žáky |
SELECT se stejnou podmínkou: SELECT * FROM zaci WHERE id = 6;SELECT * nahraď za UPDATE … SET … nebo DELETE.Když smažeš třídu, na kterou odkazují žáci, porušil bys referenční integritu. U cizího klíče proto určíš, co se má stát:
| Volba u FOREIGN KEY | Co se stane se žáky při smazání jejich třídy |
|---|---|
ON DELETE RESTRICT / NO ACTION | smazání třídy SŘBD odmítne (výchozí chování) |
ON DELETE CASCADE | smažou se i žáci té třídy |
ON DELETE SET NULL | žákům se id_tridy nastaví na NULL |
UPDATE zbozi SET cena = cena * 1.1 WHERE id_kategorie = 4; Nová hodnota se smí počítat ze staré. WHERE omezí změnu jen na kategorii 4.INSERT INTO zaci (id, jmeno, id_tridy) VALUES (7, 'Bára', 1), (8, 'Ondřej', 2); Každá závorka za VALUES je jeden řádek. Sloupce, které nevyjmenuješ, dostanou DEFAULT, nebo NULL.DELETE FROM zaci; smaže tabulku zaci.DELETE FROM zaci; smaže všechny řádky, tabulka zůstane prázdná. Tabulku i se strukturou smaže až DROP TABLE zaci;.DELETE patří do DML (data), DROP do DDL (struktura).
INSERT vkládá řádky, UPDATE … SET je mění, DELETE je maže. Bez WHERE se UPDATE i DELETE týká všech řádků, proto podmínku nejdřív vyzkoušej v SELECT. ON DELETE u cizího klíče určí, co se stane s odkazujícími řádky.