Přejít na obsah

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.

V tomto kurzu nejsou povoleny komentáře.