Cvičení s Neon pomocí SQL
Cvičení s Neon – tvorba tabulek a vkládání dat pomocí SQL
Pokračování: stejné tabulky jako v drawDB a v připravených datech
|
Cíl: V SQL Editoru vytvoříš šest skutečných PostgreSQL tabulek: student, studentska_karta, trida, zak, predmet a zapis. Procvičíš CREATE TABLE, datové typy, PRIMARY KEY, FOREIGN KEY a relace 1 : 1, 1 : N a M : N. |
1. Jak na sebe předchozí práce navazují
|
Krok |
Prostředí |
Co jsi vytvořil / vytvoříš |
|
1 |
drawDB |
návrh tabulek, klíčů a relací |
|
2 |
Excel |
připravené skutečné záznamy se stejnými ID |
|
3 |
Neon + SQL |
skutečné tabulky v PostgreSQL databázi |
|
Důležité: V tomto cvičení nepoužíváme automatické IDENTITY. ID zapisujeme jako INTEGER PRIMARY KEY, protože v připravených datech už máme konkrétní hodnoty ID a později je chceme vložit beze změny. |
2. Jak pracuje CREATE TABLE
SQL příkaz CREATE TABLE vytvoří strukturu tabulky. Neobsahuje ještě data – pouze říká databázi, jak se tabulka jmenuje, jaké má sloupce, datové typy a pravidla.
|
CREATE TABLE nazev_tabulky ( pole1 DATOVY_TYP, pole2 DATOVY_TYP, ... ); |
|
Část |
Význam |
|
CREATE TABLE |
vytvoř novou tabulku |
|
INTEGER |
celé číslo |
|
VARCHAR(60) |
text, nejvýše 60 znaků |
|
DATE |
datum |
|
PRIMARY KEY |
jedinečně určuje každý řádek |
|
FOREIGN KEY |
odkazuje na klíč v jiné tabulce |
|
REFERENCES |
určuje tabulku a sloupec, na který se odkazuje |
3. Pořadí je důležité
Tabulka, na kterou cizí klíč odkazuje, musí už existovat. Proto vytvářej tabulky v tomto pořadí:
|
Pořadí |
Tabulka |
Proč |
|
1 |
student |
nemá cizí klíč |
|
2 |
studentska_karta |
odkazuje na student |
|
3 |
trida |
nemá cizí klíč |
|
4 |
zak |
odkazuje na trida |
|
5 |
predmet |
nemá cizí klíč |
|
6 |
zapis |
odkazuje na zak i predmet |
|
Práce v editoru: Vlož vždy jeden logický blok SQL, spusť jej tlačítkem Run a po úspěchu zkontroluj tabulku v části Tables. Středník ; ukončuje příkaz. |
Úkol 1 a 2 – relace 1 : 1 a 1 : N
Vytvoř tabulky přesně podle předchozích cvičení
Úkol 1 – student a studentska_karta (1 : 1)
|
student.student_id PK |
1 ───── 1 |
studentska_karta.student_id FK |
Nejprve spusť tabulku student. Teprve potom vytvoř studentska_karta.
|
CREATE TABLE student ( student_id INTEGER PRIMARY KEY, jmeno VARCHAR(60), prijmeni VARCHAR(60) );
CREATE TABLE studentska_karta ( karta_id INTEGER PRIMARY KEY, student_id INTEGER UNIQUE, cislo_karty VARCHAR(20), platnost_do DATE, FOREIGN KEY (student_id) REFERENCES student(student_id) ); |
|
Proč UNIQUE? Cizí klíč student_id propojí kartu se studentem. UNIQUE navíc nedovolí, aby byl stejný student_id použit u dvou různých karet. Tím databáze skutečně hlídá vztah 1 : 1. |
Úkol 2 – trida a zak (1 : N)
|
trida.trida_id PK |
1 ───── N |
zak.trida_id FK |
|
CREATE TABLE trida ( trida_id INTEGER PRIMARY KEY, nazev VARCHAR(10), obor VARCHAR(80) );
CREATE TABLE zak ( zak_id INTEGER PRIMARY KEY, jmeno VARCHAR(60), prijmeni VARCHAR(60), email VARCHAR(120), trida_id INTEGER, FOREIGN KEY (trida_id) REFERENCES trida(trida_id) ); |
|
Jak vznikne 1 : N? Hodnota trida.trida_id je v tabulce trida jedinečná, ale stejné trida_id se může objevit u více řádků tabulky zak. Proto může jedna třída obsahovat více žáků. |
Kontrola po úkolech 1 a 2
|
Tabulka |
Pole, které je PK |
Pole, které je FK |
|
student |
student_id |
– |
|
studentska_karta |
karta_id |
student_id → student.student_id |
|
trida |
trida_id |
– |
|
zak |
zak_id |
trida_id → trida.trida_id |
Úkol 3 – relace M : N a kontrola výsledku
Tabulka zapis propojí žáky s předměty
Úkol 3 – predmet a zapis (M : N)
Jeden žák může mít více předmětů a jeden předmět může mít více žáků. Přímou relaci zak ↔ predmet nevytváříme. Použijeme spojovací tabulku zapis.
|
zak.zak_id PK |
1 ───── N |
zapis.zak_id FK |
|
predmet.predmet_id PK |
1 ───── N |
zapis.predmet_id FK |
|
CREATE TABLE predmet ( predmet_id INTEGER PRIMARY KEY, nazev VARCHAR(100) );
CREATE TABLE zapis ( zapis_id INTEGER PRIMARY KEY, zak_id INTEGER, predmet_id INTEGER, skolni_rok VARCHAR(9), datum_zapisu DATE, FOREIGN KEY (zak_id) REFERENCES zak(zak_id), FOREIGN KEY (predmet_id) REFERENCES predmet(predmet_id) ); |
|
Jak vznikne M : N? Jeden zak_id se může v tabulce zapis opakovat u různých předmětů a jeden predmet_id se může opakovat u různých žáků. Každý řádek zapis tedy znamená „tento žák má zapsaný tento předmět“. |
4. Zkontroluj, že vzniklo všech 6 tabulek
V Neonu otevři Tables, nebo spusť tento kontrolní dotaz:
|
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name; |
Ve výsledku musí být: predmet, student, studentska_karta, trida, zak a zapis.
5. Procvičení tvorby tabulek v SQL Editoru
|
Úkol |
Co udělej |
|
1 |
Vytvoř všech 6 tabulek v předepsaném pořadí. |
|
2 |
Po každém CREATE TABLE zkontroluj novou tabulku v Tables. |
|
3 |
U tabulek studentska_karta, zak a zapis najdi cizí klíče a řekni, kam odkazují. |
|
4 |
Vysvětli, proč nelze vytvořit zapis dříve než tabulky zak a predmet. |
|
5 |
Spusť CREATE TABLE student podruhé. Přečti chybovou zprávu a vysvětli, proč vznikla. |
6. Co má být hotové po tvorbě tabulek
|
Tabulky |
Výsledná relace |
|
student + studentska_karta |
1 : 1 |
|
trida + zak |
1 : N |
|
zak + zapis + predmet |
M : N přes zapis |
|
Pokračuj na další straně: Struktura databáze je hotová. Teď do stejných šesti tabulek vložíš skutečné záznamy z předchozího cvičení pomocí příkazu INSERT INTO. |
Než začneš vkládat data
· drawDB = návrh databáze; Excel = připravená data; Neon = skutečná PostgreSQL databáze.
· CREATE TABLE vytváří strukturu, nikoli data.
· PRIMARY KEY určuje záznam, FOREIGN KEY propojuje tabulky.
· Rodičovskou tabulku vytvoř před tabulkou, která na ni odkazuje.
Úkol 4 – vložení dat pomocí INSERT INTO
Do vytvořených tabulek vlož přesně stejná data jako v předchozím cvičení
7. Jak funguje INSERT INTO
CREATE TABLE vytvořil pouze strukturu. Příkaz INSERT INTO přidává do tabulky skutečné řádky (záznamy). V závorkách uvedeš sloupce a za VALUES hodnoty ve stejném pořadí.
|
INSERT INTO nazev_tabulky (sloupec1, sloupec2) VALUES (hodnota1, hodnota2); |
|
Pravidla: text a datum zapisuj do apostrofů '…'. Čísla zapisuj bez apostrofů. Více řádků odděl čárkou a celý příkaz ukonči středníkem. |
8. Vlož data – student a studentska_karta
Nejprve vlož rodičovskou tabulku student. Až potom studentska_karta, protože její student_id je cizí klíč.
|
INSERT INTO student (student_id, jmeno, prijmeni) VALUES (1, 'Adam', 'Novotný'), (2, 'Barbora', 'Svobodová'), (3, 'David', 'Král'), (4, 'Eva', 'Veselá'), (5, 'Filip', 'Procházka'); |
|
INSERT INTO studentska_karta (karta_id, student_id, cislo_karty, platnost_do) VALUES (101, 1, 'STU-2026-001', '2027-09-30'), (102, 2, 'STU-2026-002', '2027-09-30'), (103, 3, 'STU-2026-003', '2027-09-30'), (104, 4, 'STU-2026-004', '2027-09-30'), (105, 5, 'STU-2026-005', '2027-09-30'); |
|
Po spuštění zkontroluj: SELECT * FROM student ORDER BY student_id; a potom SELECT * FROM studentska_karta ORDER BY karta_id; |
9. Vlož data – trida a zak
|
INSERT INTO trida (trida_id, nazev, obor) VALUES (1, '3.A', 'Mechanik elektronických zařízení'), (2, '3.B', 'Informační technologie'), (3, '3.C', 'Elektrotechnika'); |
|
INSERT INTO zak (zak_id, jmeno, prijmeni, email, trida_id) VALUES (1, 'Jan', 'Novák', '[email protected]', 1), (2, 'Petra', 'Malá', '[email protected]', 1), (3, 'Tomáš', 'Veselý', '[email protected]', 2), (4, 'Eva', 'Králová', '[email protected]', 2), (5, 'Adam', 'Dvořák', '[email protected]', 3), (6, 'Lucie', 'Svobodová', '[email protected]', 1); |
|
Všimni si: trida_id se u žáků může opakovat. Například hodnota 1 znamená, že Jan, Petra a Lucie patří do stejné třídy 3.A. |
Úkol 5 – předměty, zápisy a kontrola dat
Dokonči naplnění databáze a ověř, že cizí klíče propojují správné záznamy
10. Vlož data – predmet a zapis
Nejdříve musí existovat předměty. Tabulku zapis vkládej až nakonec, protože odkazuje současně na zak i predmet.
|
INSERT INTO predmet (predmet_id, nazev) VALUES (1, 'Databáze'), (2, 'Počítačové sítě'), (3, 'Programování'), (4, 'Operační systémy'); |
|
INSERT INTO zapis (zapis_id, zak_id, predmet_id, skolni_rok, datum_zapisu) VALUES (1, 1, 1, '2026/2027', '2026-09-01'), (2, 1, 2, '2026/2027', '2026-09-01'), (3, 2, 1, '2026/2027', '2026-09-01'), (4, 2, 4, '2026/2027', '2026-09-01'), (5, 3, 2, '2026/2027', '2026-09-02'), (6, 3, 3, '2026/2027', '2026-09-02'), (7, 4, 1, '2026/2027', '2026-09-02'), (8, 4, 3, '2026/2027', '2026-09-02'), (9, 5, 4, '2026/2027', '2026-09-03'), (10, 6, 1, '2026/2027', '2026-09-03'), (11, 6, 2, '2026/2027', '2026-09-03'); |
|
Jeden řádek v zapis znamená: konkrétní žák má zapsaný konkrétní předmět. Proto se zak_id i predmet_id mohou v různých řádcích opakovat. |
11. Zkontroluj počet vložených záznamů
|
SELECT COUNT(*) AS pocet FROM student; SELECT COUNT(*) AS pocet FROM studentska_karta; SELECT COUNT(*) AS pocet FROM trida; SELECT COUNT(*) AS pocet FROM zak; SELECT COUNT(*) AS pocet FROM predmet; SELECT COUNT(*) AS pocet FROM zapis; |
|
Tabulka |
Správný počet řádků |
|
student |
5 |
|
studentska_karta |
5 |
|
trida |
3 |
|
zak |
6 |
|
predmet |
4 |
|
zapis |
11 |
12. První kontrolní dotazy nad daty
Spusť následující dotazy po jednom. Sleduj, jak SQL vybírá jen požadované řádky.
|
-- Karta Barbory Svobodové má student_id = 2 SELECT * FROM studentska_karta WHERE student_id = 2;
-- Žáci třídy 3.A mají trida_id = 1 SELECT * FROM zak WHERE trida_id = 1;
-- Zjisti trida_id Tomáše Veselého SELECT trida_id FROM zak WHERE jmeno = 'Tomáš' AND prijmeni = 'Veselý'; |
13. Co má být hotové
|
Kontrola |
Výsledek |
|
Struktura |
6 tabulek vytvořených pomocí CREATE TABLE |
|
Data |
34 záznamů celkem ve všech šesti tabulkách |
|
Relace |
1 : 1, 1 : N a M : N fungují přes cizí klíče |
|
SQL |
umíš rozlišit CREATE TABLE, INSERT INTO a SELECT |
|
Důležité: Pokud INSERT selže kvůli cizímu klíči, zkontroluj, zda už existuje řádek s odkazovaným ID. Pokud selže kvůli primárnímu klíči, pravděpodobně vkládáš stejné ID podruhé. |
Zapamatuj si
· CREATE TABLE = vytvoří strukturu tabulky.
· INSERT INTO = vloží skutečné záznamy.
· SELECT = zobrazí data, která chceš z databáze přečíst.
· Cizí klíč dovolí vložit jen takové ID, které existuje v propojené tabulce.