doc. RNDr. Csaba Török, CSc.
csaba.torok@upjs.sk
RNDr. Lukáš Miňo, PhD.
lukas.mino@upjs.sk
Študent po absolvovaní predmetu ovláda princípy relačných databáz, je schopný aplikovať štandardné dátové modely, navrhovať relačné databázy a sformulovať filtračné dopyty.
Študent po absolvovaní predmetu ovláda princípy relačných databáz, je schopný aplikovať štandardné dátové modely, navrhovať relačné databázy a sformulovať filtračné dopyty.
Študent po absolvovaní predmetu zvládne použitie náročnejších techník relačných databáz, teoretickú analýzu funkčných závislostí atribútov a je schopný pracovať s nerelačnými databázami.
Čas: Štvrtok 7:05 - 8:35
Miestnosť: SJ2P11 - Jesenná 5, 2. poschodie, poslucháreň
Študijné skupiny: 2AIb(A), 2BASInfb(A), 2BIb(A), 2FIb(A), 2GIb(A), 2CHIb(A), 2Ib(A), 2ISVSb(A), 2MIb(A)
Čas: Pondelok 15:20 - 16:50
Miestnosť: SA1C04 - Park Angelinum 9, 1. poschodie, počítačová učebňa
Študijné skupiny: 2BASInfb(A), 2BIb(A), 2FIb(A), 2GIb(A), 2CHIb(A), 2ISVSb(A), 2MIb(A)
Čas: Streda 15:20 - 16:50
Miestnosť: SA1C04 - Park Angelinum 9, 1. poschodie, počítačová učebňa
Študijné skupiny: 2Ib(A)
Čas: Štvrtok 15:20 - 16:50
Miestnosť: SA1C03 - Park Angelinum 9, 1. poschodie, počítačová učebňa
Študijné skupiny: 2AIb(A)
Čas: Štvrtok 7:05 - 9:20
Miestnosť: SJ2P11 - Jesenná 5, 2. poschodie, poslucháreň
Študijné skupiny: 1MMm(A), 2ADUIb(A), 2EFMm(B), 2MMm(A)
Čas: Utorok 8:00 - 9:30
Miestnosť: SA1C05 - Park Angelinum 9, 1. poschodie, počítačová učebňa
Študijné skupiny: 1MMm(A), 2ADUIb(A), 2EFMm(B), 2MMm(A)
Priebežné previerky: 4 body
Domáce úlohy: 10 bodov
Projekt: 6 bodov
Skúška: 50 bodov
Plagiátorstvo nie je akceptovateľné. U poskytovateľa a samozrejme prijímateľa/plagiátora budú všetky doteraz získané body anulované. Body sa anulujú od momentu zistenia podvodu, nie kedy bol podvod zrealizovaný. Zainteresované osoby môžu sa naďalej zúčastňovať danej výučby a získavať body od daného momentu. O danom incidente budú informovaní všetci kolegovia a daný prehrešok bude posunutý etickej komisii, ktorá môže rozhodnúť aj vylúčením zo štúdia.
Príklad 1:
V 9. týždni výučby sa zistilo, že poskytovateľ poskytol prijímateľovi svoje riešenie 5. sady úloh v čase riešení 5. domáceho zadania.
V danom čase už boli tri priebežné previerky, prebieha 7. sada domácich úloh, bol obhájený projekt a napísaná polsemestrálna previerka.
Doteraz získané body (do riešenia 7. sady úloh vrátane) sa obom aktérom anulujú.
Avšak môžu získať body za poslednú priebežnú previerku, zvyšné sady domácich úloh a koncosemestrálnu previerku.
Maximálny počet bodov, ktoré ešte môžu získať je 1+3+15=19 bodov plus nové body za aktivitu.
Musia ešte obhájiť svoje správanie pred etickou komisiou, ktorá ich môže vylúčiť zo štúdia.
Príklad 2:
V 12. týždni výučby bol u plagiátora objavený ťahák pri písaní poslednej priebežnej previerky. Do konca výučby zostáva posledná sada domácich úloh a koncosemestálna previerka.
Doteraz získané body sa anulujú.
Plagiátor môže získať body za poslednú sadu domácich úloh a koncosemestrálnu previerku.
Maximálny počet bodov, ktoré ešte môže získať je 1+15=16 bodov plus nové body za aktivitu.
Musí ešte obhájiť svoje správanie pred etickou komisiou, ktorá ho môže vylúčiť zo štúdia.
Príklad 3:
Na/po koncosemstrálnej previerke sa zistilo, že poskytovateľ poskytol časť svojho riešenia prijímateľovi.
U poskytovateľa a prijímateľa/plagiátora budú všetky doteraz získané body anulované.
Zainteresované osoby môžu naďalej ísť na skúšku, avšak z cvičení dostávajú automaticky nula bodov.
O danom incidente budú informovaní všetci kolegovia a daný prehrešok bude posunutý etickej komisii, ktorá môže rozhodnúť aj vylúčením zo štúdia.
Príklad 4:
Pred koncosemstrálnou previerkou sa zistilo, že poskytovateľ poskytol časť svojich riešení počas 3. až 5. sady domácich úloh prijímateľovi.
U poskytovateľa a prijímateľa/plagiátora budú všetky doteraz získané body anulované.
Maximálny počet bodov, ktoré ešte môžu získať je 15 bodov za koncosemestrálnu previerku.
O danom incidente budú informovaní všetci kolegovia a daný prehrešok bude posunutý etickej komisii, ktorá môže rozhodnúť aj vylúčením zo štúdia.
Príklad 5:
V poslednom týždni semestra sa zistilo, že poskytovateľ poskytol svoje riešenia domácich úloh počas riešenia 1. sady domácich úloh druhej skupine.
U poskytovateľa a prijímateľov budú všetky doteraz získané body anulované.
Keďže poskytovateľ už absolvoval koncosemestrálnu previerku, z cvičení získava nula bodov.
Keďže prijímatelia ešte nepísali koncosemestrálnu previerku, môžu získať maximálne 15 bodov.
O danom incidente budú informovaní všetci kolegovia a daný prehrešok bude posunutý etickej komisii, ktorá môže rozhodnúť aj vylúčením zo štúdia.
Obhajoba návrhu projektu bude prebiehať 02.11.2023 od 14:00 v SA1C03.
Prebraté zo stránky paz1c.ics.upjs.sk:
Zástupca (-ovia) tímu predstavia databázový a triedový návrh svojho projektu učiteľovi. Ideálne je použitie UML diagramov. Očakáva sa aj zoznam okien s predpokladanou funkcionalitou.
Predstavenie návrhu projektu slúži ako skorá spätná väzba, aby sa predišlo návrhovým chybám, príliš jednoduchým, alebo naopak príliš komplikovaným návrhom,
ktoré by mohli predstavovať riziko vytvorenia slabo ohodnoteného projektu.
Pri predstavovaní návrhu bude prítomný aj cvičiaci predmetu Databázové systémy a za návrh môže udeľovať body pre jeho predmet.
Obhajoba návrhu projektu bude prebiehať na prednáške DBS.
Obhajoba návrhu projektu bude prebiehať pravdepodobne mimo rozvrhu hodín.
Zadanie robia iba tí študenti, ktorí sa NEzúčastnili obhajob návrhov projektov z predmetu PAZ1c alebo na prednáške predmetu DBS (matematici). Riešenie projektu pozostáva z nasledujúcich úloh:
CHAR, VARCHAR, BOOLEAN, INTEGER, DECIMAL, DATE, ...
CREATE DATABASE [IF NOT EXISTS], DROP DATABASE [IF EXISTS]
USE
CREATE TABLE [IF NOT EXISTS], DROP TABLE [IF EXISTS]
INSERT [INTO] ... VALUES
SELECT * FROM table_name
SHOW DATABASES
SHOW TABLES [FROM database_name]
Majiteľ reštaurácie U vlka chce nalákať zákazníkov aj tým, že im bude zverejňovať denné menu na internete. Pomôžte mu splniť nasledujúce zadania.
Navrhnite, vytvorte a naplňte tabuľku podľa nasledujúceho vzoru:
Dátum | Číslo objednávky | Gramáž | Jedlo | Cena | Dostupnosť |
---|---|---|---|---|---|
25.09.2023 | 1 |
150g | Kurací steak plnený syrom a suš. paradajkou, ryža, šalát (1,7) | 6.00€ |
|
25.09.2023 | 2 |
350g | Granatiersky pochod, kyslá uhorka (1) | 5.70€ |
|
26.09.2023 | 1 |
150g | Debrecínsky guľáš, kolienka (1,3) | 5.80€ |
|
26.09.2023 | 2 |
300g | Jablkovo- škoricové pirohy (1,3) | 4.70€ |
|
27.09.2023 | 1 |
150g | Hovädzí maďarský guľáš, domáca knedľa (1,7) | 5.80€ |
|
27.09.2023 | 2 |
Vyprážaný hermelín, listový šalát, hranolky, dresing (1,3,7) |
|
-- Jednoriadkovy komentar
# Jednoriadkovy komentar
/*
Viacriadkovy
komentar
*/
/*
SQL keywords are by default set to case insensitive that means that the keywords are allowed to be used in lower or upper case.
The names of the tables and columns specification are set to case insensitive on the SQL database server,
however, it can be enabled and disabled by configuring the settings in SQL.
*/
# Vytvorenie databazy
CREATE DATABASE restauracia_u_vlka;
-- Pouzitie databazy
USE restauracia_u_vlka;
/* Vytvorenie tabulky */
CREATE TABLE denne_menu
(
datum DATE,
cislo INTEGER, -- INT
gramaz INT, -- INTEGER
jedlo VARCHAR(300),
cena DEC(5,2), -- DECIMAL(5,2)
dostupnost BOOL -- BOOLEAN
);
# Vlozenie zaznamu do tabulky
INSERT INTO denne_menu VALUES ('2023-09-25', 1, 150, 'Kurací steak plnený syrom a suš. paradajkou, ryža, šalát (1,7)', 6, true);
-- Vlozenie viac zaznamov do tabulky
INSERT INTO denne_menu VALUES
("2023-09-25", 2, 350, 'Granatiersky pochod, kyslá uhorka (1)', 5.70, true),
('2023-09-26', 1, 150, "Debrecínsky guľáš, kolienka (1,3)", 5.80, true);
/* Vlozenie zaznamu do tabulky */
INSERT denne_menu VALUES ("2023-09-26", 2, 300, "Jablkovo- škoricové pirohy (1,3)", 4.70, false);
# Vlozenie zaznamu do tabulky
INSERT denne_menu(datum, cislo, gramaz, jedlo, cena, dostupnost)
VALUES ('2023-09-27', 1, 150, 'Hovädzí maďarský guľáš, domáca knedľa (1,7)', 5.80, NULL);
-- Vlozenie zaznamu do tabulky
INSERT denne_menu(datum, cislo, jedlo) VALUES ('2023-09-27', 2, 'Vyprážaný hermelín, listový šalát, hranolky, dresing (1,3,7)');
Vyberte/zobrazte/vypíšte obsah tabuľky.
/* Zobrazenie zaznamov z tabulky */
SELECT * FROM denne_menu;
Upravte skript z 1. zadania tak, aby sa dal použiť viackrát.
# Zmazanie databazy ak existuje
DROP DATABASE IF EXISTS restauracia_u_vlka;
# Vytvorenie databazy ak neexistuje
CREATE DATABASE IF NOT EXISTS restauracia_u_vlka;
-- Pouzitie databazy
USE restauracia_u_vlka;
/* Vytvorenie tabulky ak neexistuje */
CREATE TABLE IF NOT EXISTS denne_menu
(
datum DATE,
cislo INTEGER, -- INT
gramaz INT, -- INTEGER
jedlo VARCHAR(300),
cena DEC(5,2), -- DECIMAL(5,2)
dostupnost BOOL -- BOOLEAN
);
# Vlozenie zaznamu do tabulky
INSERT INTO denne_menu VALUES ('2023-09-25', 1, 150, 'Kurací steak plnený syrom a suš. paradajkou, ryža, šalát (1,7)', 6, true);
-- Vlozenie viac zaznamov do tabulky
INSERT INTO denne_menu VALUES
('2023-09-25', 2, 350, 'Granatiersky pochod, kyslá uhorka (1)', 5.70, true),
('2023-09-26', 1, 150, 'Debrecínsky guľáš, kolienka (1,3)', 5.80, true);
/* Vlozenie zaznamu do tabulky */
INSERT denne_menu VALUES ('2023-09-26', 2, 300, 'Jablkovo- škoricové pirohy (1,3)', 4.70, false);
# Vlozenie zaznamu do tabulky
INSERT denne_menu(datum, cislo, gramaz, jedlo, cena, dostupnost)
VALUES ('2023-09-27', 1, 150, 'Hovädzí maďarský guľáš, domáca knedľa (1,7)', 5.80, NULL);
-- Vlozenie zaznamu do tabulky
INSERT denne_menu(datum, cislo, jedlo) VALUES ('2023-09-27', 2, 'Vyprážaný hermelín, listový šalát, hranolky, dresing (1,3,7)');
Zobrazte zoznam tabuliek.
-- Zobrazenie tabuliek z aktualnej databazy
SHOW TABLES;
-- Zobrazenie tabuliek z konkretnej databazy
SHOW TABLES FROM restauracia_u_vlka;
Skúste zobraziť obsah tabuľky čo najvernejšie podľa 1. zadania. V sĺpci dostupnosť zobrazíme znak x ak je jedlo nedostupné alebo je NULL
, inak zobrazíme reťazec s nulovou veľkosťou.
Dáta sa nemajú meniť, iba správne zobraziť.
SELECT
DISTINCT
AS
ORDER BY
LIMIT
WHERE
IS NULL, IS NOT NULL
AND, OR, NOT, XOR
IN, NOT IN
BETWEEN, NOT BETWEEN
LIKE, NOT LIKE
Dostali ste za úlohu spravovať databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.
LIKE
Dostali ste za úlohu spravovať databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.
NOT REGEXP
REGEXP
REGEXP_INSTR()
REGEXP_LIKE()
REGEXP_REPLACE()
REGEXP_SUBSTR()
RLIKE
CONCAT, REPLACE, UPPER, ...
PI, RAND, SQRT, ...
CURDATE, MONTHNAME, DATEDIFF, ...
CASE, CAST, COALESCE, ...
-- zobrazenie hodnoty systemovej premennej lc_time_names
SELECT @@lc_time_names;
-- en_US
-- sk_SK
-- nastavenie sk_SK
SET lc_time_names = 'sk_SK';
-- sk_SK
-- en_US
Dostali ste za úlohu spravovať databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.
Skúste napísať regulárny výraz, ktorý vyhodnotí, či email bol napísaný v správnom formáte.
# Vrati 1 ak email je v spravnom formate, inak vrati 0.
SELECT 'lukas.mino@upjs.sk' REGEXP '^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';
-- alebo
SELECT 'lukas.mino@upjs.sk' RLIKE '^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';
-- alebo
SELECT REGEXP_LIKE('lukas.mino@upjs.sk', '^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
-- Vrati 0
SELECT 'lukas,mino@upjs.sk' REGEXP '^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';
Skúste na príklade ukázať rozdiel medzi funkciami NOW
a SYSDATE
.
SELECT NOW(); #vrati cas spustenia dopytu
SELECT SYSDATE(); #vrati cas kedy bola zavolana funkcia
-- Pozn.: CURRENT_TIMESTAMP a NOW vratia cas zaciatku vykonavania dopytu. Naproti tomu SYSDATE vrati aktualny cas. Vid. priklady:
-- Cas oboch volani NOW je rovnaky.
SELECT NOW(), SLEEP(2), NOW();
-- Cas druheho volania SYSDATE je posunuty o dve sekundy.
SELECT SYSDATE(), SLEEP(2), SYSDATE();
Zobrazte dnešný deň v týždni po slovensky.
-- Den v tyzdni
-- zobrazenie systemovej premennej lc_time_names
SELECT @@lc_time_names;
-- en_US
-- nastavenie po slovensky
SET lc_time_names = 'sk_SK';
SELECT DAYNAME(CURRENT_DATE()) slov;
-- nastavenie po anglicky
SET lc_time_names = 'en_US';
SELECT DAYNAME(CURRENT_DATE()) ang;
-- alebo
SELECT
CASE WEEKDAY(CURRENT_DATE()) -- 0 = Monday
WHEN 0 THEN 'Pondelok'
WHEN 1 THEN 'Utorok'
WHEN 2 THEN 'Streda'
WHEN 3 THEN 'Stvrtok'
WHEN 4 THEN 'Piatok'
WHEN 5 THEN 'Sobota'
WHEN 6 THEN 'Nedela'
ELSE 'Nezname'
END 'Deň v týždni'
FROM osoba;
-- alebo
SELECT
CASE
WHEN DAYOFWEEK(CURRENT_DATE()) = 1 THEN 'Nedela' -- 1 = Sunday
WHEN DAYOFWEEK(CURRENT_DATE()) = 2 THEN 'Pondelok'
WHEN DAYOFWEEK(CURRENT_DATE()) = 3 THEN 'Utorok'
WHEN DAYOFWEEK(CURRENT_DATE()) = 4 THEN 'Streda'
WHEN DAYOFWEEK(CURRENT_DATE()) = 5 THEN 'Stvrtok'
WHEN DAYOFWEEK(CURRENT_DATE()) = 6 THEN 'Piatok'
WHEN DAYOFWEEK(CURRENT_DATE()) = 7 THEN 'Sobota'
ELSE 'Nezname'
END 'Deň v týždni'
FROM osoba;
CROSS JOIN
[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
MIN, MAX, COUNT, SUM, AVG, ...
-- zobrazenie hodnoty systemovej premennej sql_mode
SELECT @@sql_mode;
-- ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
-- zobrazenie hodnoty systemovej premennej session.sql_mode
SELECT @@session.sql_mode;
-- ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
-- nastavenie ONLY_FULL_GROUP_BY
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY';
-- alebo
SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY';
-- alebo
SET SESSION sql_mode = sys.list_add(@@session.sql_mode, 'ONLY_FULL_GROUP_BY');
-- zrusenie ONLY_FULL_GROUP_BY
SET SESSION sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Po úspešnom absolvovaní predchádzajúcich týždoch Vás presunuli na medicínsky projekt. Dostali ste za úlohu spravovať databázu polikliniky. Importnite si ju a zoznámte sa s jej štruktúrou.
Importnite si databázu množiny a zoznámte sa s jej štruktúrou. Zobrazte výsledky spojenia dvoch tabuliek a a b cez stĺpec x pomocou CROSS JOIN, INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN.
USE mnoziny;
-- CROSS JOIN
SELECT * FROM a CROSS JOIN b;
-- alebo
SELECT * FROM a, b;
-- CROSS JOIN spojením tabuliek cez stĺpec x
SELECT * FROM a CROSS JOIN b WHERE b.x = a.x;
-- alebo
SELECT * FROM a, b WHERE b.x = a.x;
-- NEEFEKTIVNE, radsej pouzit INNER JOIN
-- INNER JOIN
SELECT * FROM a INNER JOIN b ON b.x = a.x;
-- alebo
SELECT * FROM a JOIN b ON b.x = a.x;
-- alebo
SELECT * FROM a JOIN b USING(x);
-- LEFT OUTER JOIN
SELECT * FROM a LEFT OUTER JOIN b ON b.x = a.x;
-- alebo
SELECT * FROM a LEFT JOIN b ON b.x = a.x;
-- alebo
SELECT * FROM a LEFT OUTER JOIN b USING(x);
-- alebo
SELECT * FROM a LEFT JOIN b USING(x);
-- RIGHT OUTER JOIN
SELECT * FROM a RIGHT OUTER JOIN b ON b.x = a.x;
-- alebo
SELECT * FROM a RIGHT JOIN b ON b.x = a.x;
-- alebo
SELECT * FROM a RIGHT OUTER JOIN b USING(x);
-- alebo
SELECT * FROM a RIGHT JOIN b USING(x);
Importnite si databázu množiny a zoznámte sa s jej štruktúrou. Zobrazte výsledky spojenia dvoch tabuliek a a b cez stĺpec x pomocou FULL OUTER JOIN.
USE mnoziny;
-- FULL OUTER JOIN MySQL zatial nepodporuje
SELECT * FROM a FULL OUTER JOIN b WHERE b.x = a.x;
-- Simulacia spojenia cez FULL OUTER JOIN
SELECT * FROM T1 LEFT OUTER JOIN T2 ON b.x = a.x
UNION
SELECT * FROM T1 RIGHT JOIN T2 ON b.x = a.x;
V ďalšich zadaniach budete pracovať s databázou poliklinika.
Zobrazte meno pacienta, ktorý ma najväčší mesačný príjem.
-- Meno pacienta, ktory ma najvacsi mesacny prijem
SELECT
krstne
FROM pacienti
WHERE mesPrijem = (SELECT MAX(mesPrijem) FROM pacienti);
Zobrazte mininimálny, maximálny, počet, sumu a priemerný poplatok pacientov u jednotlivých lekárov.
-- Informacie o poplatkoch pacientov u lekarov
SELECT
idP Pacient,
idL Lekar,
MIN(poplatok) 'Minimálny poplatok',
MAX(poplatok) 'Maximálny poplatok',
COUNT(poplatok) 'Počet poplatkov',
SUM(poplatok) 'Suma poplatkov',
AVG(poplatok) 'Priemer poplatkov',
FROM navstevy
GROUP BY idP, idL
ORDER By idP, idL;
-- alebo
SELECT
idP Pacient,
idL Lekar,
MIN(poplatok) 'Minimálny poplatok',
MAX(poplatok) 'Maximálny poplatok',
COUNT(poplatok) 'Počet poplatkov',
SUM(poplatok) 'Suma poplatkov',
AVG(poplatok) 'Priemer poplatkov',
FROM navstevy
GROUP BY idL, idP
ORDER By idP, idL;
Zobrazte mininimálny, maximálny, počet, sumu a priemerný poplatok pacientov u jednotlivých lekárov. Zobrazte meno pacienta a meno lekára.
-- Informacie o poplatkoch pacientov u lekarov s menami pacientov a lekarov
SELECT
P.krstne Pacient,
L.krstne Lekar,
MIN(poplatok) 'Minimálny poplatok',
MAX(poplatok) 'Maximálny poplatok',
COUNT(poplatok) 'Počet poplatkov',
SUM(poplatok) 'Suma poplatkov',
AVG(poplatok) 'Priemer poplatkov',
FROM navstevy N
JOIN pacienti P ON P.idP = N.idP
JOIN lekari L ON L.idL = N.idL
GROUP BY N.idP, P.krstne, N.idL, L.krstne -- co ak sa dvaja pacienti/lekari volaju rovnako?
ORDER By N.idP, N.idL;
Dostali ste za úlohu navrhnúť štruktúru na sprevádzkovanie eshopu.
Navrhnite vhodnú štruktúru na sprevádzkovanie eshopu.
DÁTUM | DOMÁCI | HOSTIA | VÝSLEDOK |
---|---|---|---|
13.05.2022 15:20 | Francúzsko | Slovensko | 2:4 |
13.05.2022 19:20 | Nemecko | Kanada | 3:5 |
14.05.2022 11:20 | Dánsko | Kazachstan | 9:1 |
14.05.2022 15:20 | Švajčiarsko | Taliansko | 5:2 |
14.05.2022 19:20 | Slovensko | Nemecko | 1:2 |
15.05.2022 11:20 | Taliansko | Kanada | 1:6 |
15.05.2022 15:20 | Francúzsko | Kazachstan | 2:1 |
15.05.2022 19:20 | Dánsko | Švajčiarsko | 0:6 |
16.05.2022 15:20 | Slovensko | Kanada | 1:5 |
16.05.2022 19:20 | Francúzsko | Nemecko | 2:3 |
17.05.2022 15:20 | Taliansko | Dánsko | 1:2 |
17.05.2022 19:20 | Švajčiarsko | Kazachstan | 3:2 |
18.05.2022 15:20 | Francúzsko | Taliansko | 2:1 pp |
18.05.2022 19:20 | Švajčiarsko | Slovensko | 5:3 |
19.05.2022 17:00 | Nemecko | Dánsko | 1:0 |
19.05.2022 20:30 | Kanada | Kazachstan | 6:3 |
20.05.2022 15:20 | Nemecko | Taliansko | 9:4 |
20.05.2022 19:20 | Kazachstan | Slovensko | 3:4 |
21.05.2022 11:20 | Dánsko | Francúzsko | 3:0 |
21.05.2022 15:20 | Kanada | Švajčiarsko | 3:6 |
21.05.2022 19:20 | Taliansko | Slovensko | 1:3 |
22.05.2022 15:20 | Kazachstan | Nemecko | 4:5 |
22.05.2022 19:20 | Švajčiarsko | Francúzsko | 5:2 |
23.05.2022 15:20 | Kazachstan | Taliansko | 5:2 |
23.05.2022 19:20 | Kanada | Dánsko | 2:3 |
24.05.2022 11:20 | Nemecko | Švajčiarsko | 3:4 sn |
24.05.2022 15:20 | Slovensko | Dánsko | 7:1 |
24.05.2022 19:20 | Kanada | Francúzsko | 7:1 |
Dátum | Deň | Domáci | Hostia | Konečný stav |
---|---|---|---|---|
13.05.2022 15:20 | utorok | Francúzsko | Slovensko | Vyhrali |
14.05.2022 19:20 | sobota | Slovensko | Nemecko | Prehrali |
16.05.2022 15:20 | pondelok | Slovensko | Kanada | Prehrali |
18.05.2022 19:20 | streda | Švajčiarsko | Slovensko | Prehrali |
20.05.2022 19:20 | piatok | Kazachstan | Slovensko | Vyhrali |
21.05.2022 19:20 | sobota | Taliansko | Slovensko | Vyhrali |
24.05.2022 15:20 | utorok | Slovensko | Dánsko | Vyhrali |
INSERT, INSERT INTO SELECT, UPDATE, DELETE
ALTER TABLE
ADD | ALTER | DROP | CHANGE | MODIFY | RENAME COLUMN
ADD | ALTER | DROP [CONSTRAINT [symbol]] PRIMARY KEY | UNIQUE | FOREIGN KEY | CHECK
ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
-- vypnutie safe modu, aby sa dalo aktualizovat/mazat podla lubovolnej podmienky
SET SQL_SAFE_UPDATES = 0;
-- zapnutie safe modu, aby sa dalo aktualizovat/mazat len podla kluca
SET SQL_SAFE_UPDATES = 1;
UNION
INTERSECT
EXCEPT
=, >, <, >=, <=, <>, !=
IN, NOT IN
ANY, SOME
ALL
EXISTS, NOT EXISTS
Importnite si databázu množiny a zoznámte sa s jej štruktúrou. Zobrazte výsledky zjednotenia tabuliek a a b.
USE mnoziny;
-- Zjednotenie bez opakovania
SELECT x, y FROM a
UNION -- Zjednotenie bez opakovania
SELECT x, y FROM b;
Zobrazte výsledky zjednotenia tabuliek a a b tak, aby sa riadky mohli opakovať.
USE mnoziny;
-- Zjednotenie s opakovanim
SELECT x, y FROM a
UNION ALL -- Zjednotenie s opakovanim
SELECT x, y FROM b;
Zobrazte výsledky prieniku tabuliek a a b.
USE mnoziny;
-- Prienik
-- Prienik pomocou INTERSECT (od verzie 8.0.31)
SELECT x, y FROM a
INTERSECT
SELECT x, y FROM b;
-- Prienik pomocou INTERSECT (od verzie 8.0.31)
TABLE a INTERSECT TABLE b;
-- Prienik pomocou IN
SELECT x, y
FROM a
WHERE (x, y) IN (SELECT x, y FROM b);
-- Prienik pomocou ANY
SELECT x, y
FROM a
WHERE (x, y) = ANY (SELECT x, y FROM b);
-- Prienik pomocou SOME
SELECT x, y
FROM a
WHERE (x, y) = SOME (SELECT x, y FROM b);
-- Prienik pomocou EXISTS
SELECT x, y
FROM a
WHERE EXISTS (SELECT * FROM b WHERE b.x = a.x AND b.y = a.y);
-- Prienik pomocou INNER JOIN
SELECT a.x, a.y
FROM a
JOIN b ON b.x = a.x AND b.y = a.y;
-- Prienik pomocou INNER JOIN
SELECT DISTINCT a.x AS x, a.y AS y
FROM a
INNER JOIN b USING (x,y);
-- Prienik pomocou NATURAL JOIN
SELECT x, y
FROM a
NATURAL JOIN b;
Zobrazte výsledky rozdielu tabuliek a a b.
USE mnoziny;
-- Rozdiel
-- Rozdiel pomocou EXCEPT (od verzie 8.0.31)
SELECT x, y FROM a
EXCEPT
SELECT x, y FROM b;
-- Rozdiel pomocou EXCEPT (od verzie 8.0.31)
TABLE a EXCEPT TABLE b;
-- Rozdiel pomocou NOT IN
SELECT x, y
FROM a
WHERE (x, y) NOT IN (SELECT x, y FROM b);
-- Rozdiel pomocou ALL
SELECT x, y
FROM a
WHERE (x, y) <> ALL (SELECT x, y FROM b);
-- Rozdiel pomocou NOT EXISTS
SELECT x, y
FROM a
WHERE NOT EXISTS (SELECT * FROM b WHERE b.x = a.x AND b.y = a.y);
-- Rozdiel pomocou LEFT OUTER JOIN
SELECT a.x, a.y
FROM a
LEFT OUTER JOIN b ON b.x = a.x AND b.y = a.y
WHERE b.x IS NULL;
-- Rozdiel pomocou LEFT OUTER JOIN
SELECT DISTINCT a.x AS x, a.y AS y
FROM a
LEFT OUTER JOIN b USING (x,y)
WHERE b.x IS NULL;
Z databázy Poliklinika zobrazte všetky mená pacientov a lekárov. Mená sa môžu opakovať. Výsledok zoraďte lexikograficky.
USE poliklinika;
SEELCT krstne FROM pacienti
UNION ALL
SELECT krstne FROM lekari
ORDER BY krstne;
Zobrazte všetky mená pacientov a lekárov tak, aby sa mená neopakovali. Výsledok zoraďte lexikograficky.
SEELCT krstne FROM pacienti
UNION
SELECT krstne FROM lekari
ORDER BY krstne;
Zobrazte rovnaké mená pacientov a lekárov. Výsledok zoraďte lexikograficky.
-- Prienik
-- Prienik pomocou INTERSECT (od verzie 8.0.31)
SELECT krstne FROM pacienti
INTERSECT
SELECT krstne FROM lekari
ORDER BY krstne;
-- Prienik pomocou IN
SELECT krstne
FROM pacienti
WHERE krstne IN (SELECT krstne FROM lekari)
ORDER BY krstne;
-- Prienik pomocou ANY
SELECT krstne
FROM pacienti
WHERE krstne = ANY (SELECT krstne FROM lekari)
ORDER BY krstne;
-- Prienik pomocou SOME
SELECT krstne
FROM pacienti
WHERE krstne = SOME (SELECT krstne FROM lekari)
ORDER BY krstne;
-- Prienik pomocou EXISTS
SELECT krstne
FROM pacienti
WHERE EXISTS (SELECT krstne FROM lekari WHERE lekari.krstne = pacienti.krstne)
ORDER BY krstne;
-- Prienik pomocou CROSS JOIN
SELECT p.krstne
FROM pacienti p, lekari l
WHERE p.krstne = l.krstne
-- Prienik pomocou CROSS JOIN
SELECT p.krstne
FROM pacienti p CROSS JOIN lekari l
WHERE p.krstne = l.krstne
-- Prienik pomocou JOIN
SELECT p.krstne
FROM pacienti p JOIN lekari l ON p.krstne = l.krstne
Zobrazte len mená lekárov, ktorých mená neobsahujú mená pacientov. Výsledok zoraďte lexikograficky.
-- Rozdiel
-- Rozdiel pomocou EXCEPT (od verzie 8.0.31)
SELECT krstne FROM lekari
EXCEPT
SELECT krstne FROM pacienti
ORDER BY krstne;
-- Rozdiel pomocou NOT IN
SELECT krstne
FROM lekari
WHERE krstne NOT IN (SELECT krstne FROM pacienti)
ORDER BY krstne;
-- Rozdiel pomocou ALL
SELECT krstne
FROM lekari
WHERE krstne <> ALL (SELECT krstne FROM pacienti)
ORDER BY krstne;
-- Rozdiel pomocou NOT EXISTS
SELECT krstne
FROM lekari
WHERE NOT EXISTS (SELECT krstne FROM pacienti WHERE pacienti.krstne = lekari.krstne)
ORDER BY krstne;
-- Rozdiel pomocou LEFT OUTER JOIN
SELECT p.krstne
FROM pacienti p
LEFT OUTER JOIN lekari l ON p.krstne = l.krstne
WHERE l.idL IS NULL;
Pridajte stĺpec poradie k pacientom, kde tento stĺpec bude reprezentovať lexikografické poradie krstných mien v abecede.
SELECT
(SELECT COUNT(*) + 1 from pacienti x WHERE x.krstne < p.krstne) poradie,
p.*
FROM pacienti p;
Zobrazte rôzne krstné pacientov, ktorí navštívili daného lekára viac ako raz.
SELECT DISTINCT p.krstne FROM
(
SELECT idP, idL, COUNT(*) pocet
FROM navstevy
GROUP BY idP, idL
) as T -- alias stlpca je potrebny
JOIN pacienti p ON p.idP = T.idP
WHERE T.pocet > 1;
Nájdite údaje o pacientoch, ktorí májú druhý najmenší mesačný príjem.
-- Pomocou MIN
SELECT
p.*
FROM
pacienti p
WHERE
p.mesPrijem =
(
SELECT
MIN(p2.mesPrijem)
FROM
pacienti p2
WHERE
p2.mesPrijem >
(
SELECT
MIN(p1.mesPrijem)
FROM
pacienti p1
WHERE
p1.mesPrijem IS NOT NULL
)
);
-- Pomocou ALL
SELECT
T.*
FROM
(
SELECT p3.* FROM pacienti p3
WHERE p3.mesPrijem >
(
SELECT p2.mesPrijem FROM Pacienti p2
WHERE p2.mesPrijem <= ALL
(
SELECT p1.mesPrijem FROM Pacienti p1
WHERE p1.mesPrijem IS NOT NULL
)
)
) T
WHERE
T.mesPrijem <= ALL
(
SELECT p3.mesPrijem FROM Pacienti p3 -- 7
WHERE p3.mesPrijem >
(
SELECT p2.mesPrijem FROM Pacienti p2 -- 1
WHERE p2.mesPrijem <= ALL
(
SELECT p1.mesPrijem FROM Pacienti p1 -- 8
WHERE p1.mesPrijem IS NOT NULL
)
)
);
SHOW, INFORMATION_SCHEMA
ROLLUP
, CUBE
TEMPORARY TABLE
TRUNCATE TABLE
GENERATED ALWAYS
INSERT IGNORE INTO
REPLACE [INTO]
CHARACTER SET, COLLATION, COLLATE
MyISAM, InnoDB, MERGE, MEMORY (HEAP), ARCHIVE, CSV, FEDERATED
Zistite koľko zarobili jednotliví lekári. Vo výsledku chceme vidieť aj koľko zarobili dokopy.
SELECT
CASE WHEN l.krstne IS NULL THEN 'Spolu' ELSE l.krstne END krstne,
SUM(n.poplatok) as prijem
FROM navstevy n
JOIN lekari l ON l.idL = n.idL
GROUP BY l.krstne
WITH ROLLUP;
Dostali ste za úlohu spravovať databázu polikliniky. Importnite si ju a zoznámte sa s jej štruktúrou.
Importnite si databázu množiny a zoznámte sa s jej štruktúrou. Zobrazte výsledky zjednotenia tabuliek a a b.
UNION
USE mnoziny;
-- Zjednotenie
SELECT x, y FROM a
UNION
SELECT x, y FROM b;
Zobrazte výsledky zjednotenia tabuliek a a b tak, aby sa riadky mohli opakovať.
UNION ALL
USE mnoziny;
-- Zjednotenie s opakovanim
SELECT x, y FROM a
UNION ALL
SELECT x, y FROM b;
Zobrazte výsledky prieniku tabuliek a a b.
INTERSECT
IN
EXISTS
INNER JOIN
NATURAL JOIN
USE mnoziny;
-- Prienik
-- Prienik pomocou IN
SELECT x, y
FROM a
WHERE (x, y) IN (SELECT x, y FROM b);
-- Prienik pomocou EXISTS
SELECT x, y
FROM a
WHERE EXISTS (SELECT * FROM b WHERE b.x = a.x AND b.y = a.y);
-- Prienik pomocou INNER JOIN
SELECT a.x, a.y
FROM a
JOIN b ON b.x = a.x AND b.y = a.y;
-- Prienik pomocou INNER JOIN
SELECT DISTINCT a.x AS x, a.y AS y
FROM a
INNER JOIN b USING (x,y);
-- Prienik pomocou NATURAL JOIN
SELECT x, y
FROM a
NATURAL JOIN b;
-- Prienik pomocou INTERSECT (od verzie 8.0.31)
TABLE a INTERSECT TABLE b;
Zobrazte výsledky rozdielu tabuliek a a b.
EXCEPT
NOT IN
NOT EXISTS
LEFT OUTER JOIN
USE mnoziny;
-- Rozdiel
-- Rozdiel pomocou NOT IN
SELECT x, y
FROM a
WHERE (x, y) NOT IN (SELECT x, y FROM b);
-- Rozdiel pomocou NOT EXISTS
SELECT x, y
FROM a
WHERE NOT EXISTS (SELECT * FROM b WHERE b.x = a.x AND b.y = a.y);
-- Rozdiel pomocou LEFT OUTER JOIN
SELECT a.x, a.y
FROM a
LEFT OUTER JOIN b ON b.x = a.x AND b.y = a.y
WHERE b.x IS NULL;
-- Rozdiel pomocou LEFT OUTER JOIN
SELECT DISTINCT a.x AS x, a.y AS y
FROM a
LEFT OUTER JOIN b USING (x,y)
WHERE b.x IS NULL;
-- Rozdiel pomocou EXCEPT (od verzie 8.0.31)
TABLE a EXCEPT TABLE b;
Zobrazte mená pacientov, ktorí už navštívili lekára Ota alebo Imra. Uveďte aj mená lekárov a výsledok zoraďte podľa mien lekárov, pacientov.
JOIN
UNION
-- Len s pouzitim JOIN
SELECT
p.krstne 'Pacient',
l.krstne 'Lekar'
FROM pacienti p
JOIN navstevy n ON n.idp = p.idp
JOIN lekari l ON l.idl = n.idl
WHERE
l.krstne IN ('Oto' , 'Imro')
ORDER BY l.krstne, p.krstne;
-- alebo
-- S pouzitim JOIN a UNION
SELECT
p.krstne 'Pacient',
l.krstne 'Lekar'
FROM pacienti p
JOIN navstevy n ON n.idp = p.idp
JOIN lekari l ON n.idl = l.idl
WHERE
l.krstne = 'Oto'
UNION
SELECT
p.krstne 'Pacient',
l.krstne 'Lekar'
FROM pacienti p
JOIN navstevy n ON n.idp = p.idp
JOIN lekari l ON n.idl = l.idl
WHERE
l.krstne = 'Imro'
ORDER BY Lekar, Pacient;
-- alebo
-- Bez pouzitia JOIN a pouzitim UNION
SELECT
p.krstne 'Pacient',
'Oto' as 'Lekar'
FROM pacienti p
WHERE
idp IN
(
SELECT n.idp FROM navstevy n WHERE n.idl =
(
SELECT l.idl FROM lekari l where krstne = 'Oto'
)
)
UNION
SELECT
p.krstne 'Pacient',
'Imro' as 'Lekar'
FROM pacienti p
WHERE
idp IN
(
SELECT n.idp FROM navstevy n WHERE n.idl =
(
SELECT l.idl FROM lekari l where krstne = 'Imro'
)
)
ORDER BY Lekar, Pacient;
Zobrazte mená pacientov, ktorí už navštívili lekára Ota a Imra.
JOIN
IN
EXISTS
-- S pouzitim JOIN
SELECT
p.krstne 'Pacient',
lekar_oto.krstne 'Lekar Oto',
lekar_imro.krstne 'Lekar Imro'
FROM pacienti p
JOIN navstevy navstevy_u_ota ON p.idP = navstevy_u_ota.idP
JOIN lekari lekar_oto ON navstevy_u_ota.idL = lekar_oto.idL
JOIN navstevy navstevy_u_imra ON p.idP = navstevy_u_imra.idP
JOIN lekari lekar_imro ON navstevy_u_imra.idL = lekar_imro.idL
WHERE
lekar_oto.krstne = 'Oto' AND lekar_imro.krstne = 'Imro';
-- alebo
-- S pouzitim JOIN a IN
SELECT
p2.krstne 'Pacient'
FROM navstevy n2
JOIN lekari l2 ON l2.idL = n2.idL
JOIN pacienti p2 ON p2.idP = n2.idP
WHERE
l2.krstne = 'Imro'
AND p2.idP IN
(
SELECT
p.idP
FROM navstevy n
JOIN lekari l ON l.idL = n.idL
JOIN Pacienti p ON p.idP = n.idP
WHERE L.krstne = 'Oto'
);
-- alebo
-- Bez pouzitia JOIN
SELECT
p.krstne 'Pacient'
FROM pacienti p
WHERE
idp IN
(
SELECT idp
FROM
(
SELECT n.idp FROM navstevy n WHERE n.idl =
(
SELECT l.idl FROM lekari l WHERE krstne = 'Oto'
)
) a
WHERE EXISTS
(
SELECT *
FROM
(
SELECT n.idp FROM navstevy n WHERE n.idl =
(
SELECT l.idl FROM lekari l WHERE krstne = 'Imro'
)
) b
WHERE b.idp = a.idp
)
);
Zobrazte mená pacientov, ktorí navštívili lekára s id 1.
JOIN
IN
ANY
EXISTS
-- S pouzitim JOIN
SELECT
p.krstne 'Pacient'
FROM pacienti p
JOIN navstevy n ON n.idP = p.idP
WHERE
idL = 1;
-- alebo
-- S pouzitim IN
SELECT
p.krstne 'Pacient'
FROM pacienti p
WHERE p.idP IN
(
SELECT n.idP FROM navstevy n WHERE n.idL = 1
);
-- alebo
-- S pouzitim ANY
SELECT
p.krstne 'Pacient'
FROM pacienti p
WHERE p.idP = ANY
(
SELECT n.idP FROM navstevy n WHERE n.idL = 1
);
-- alebo
-- S pouzitim EXISTS
SELECT
p.krstne 'Pacient'
FROM pacienti p
WHERE EXISTS -- EXISTS vrati true ak vnutorny SELECT vrati aspon jeden riadok
(
SELECT n.idP FROM navstevy n WHERE n.idL = 1 AND n.idP = p.idP -- korelacia, t.j. stlpec p.idP z vonkajsieho SELECT pouzijeme vo vnutorom SELECT
);
Zobrazte počet všetkých návštev u zubára.
JOIN
IN
COUNT
SUM
SELECT
COUNT(n.idp)
FROM navstevy n
JOIN lekari l ON l.idl = n.idl
WHERE
l.spec = 'zubny';
-- alebo
SELECT
COUNT(*)
FROM
(
SELECT
n.idP, n.den
FROM navstevy n
JOIN lekari l ON l.idL = n.idL
WHERE
l.spec = 'Zubny'
) AS T;
-- alebo
SELECT
SUM(T.pocet)
FROM
(
SELECT
n.idP,
COUNT(*) AS pocet
FROM navstevy n
JOIN lekari l ON L.idL = N.idL
WHERE
l.spec = 'Zubny'
GROUP BY n.idP
) AS T;
-- alebo
-- S pouzitim IN
SELECT
COUNT(idN)
FROM
navstevy
WHERE
idL IN (
SELECT
idl
FROM
lekari
WHERE
spec = 'Zubny'
);
Zistite mená pacientov, ktorí už kedysi navštívili zubného lekára.
JOIN
IN
SELECT
p.krstne 'Pacient'
FROM pacienti p
JOIN navstevy n ON n.idP = p.idP
JOIN lekari l ON l.idL = n.idL
WHERE
l.spec = 'zubny';
-- alebo
-- S pouzitim IN
SELECT
p.krstne 'Pacient'
FROM pacienti p
WHERE
p.idP IN
(
SELECT n.idP FROM navstevy n
WHERE n.idL IN
(
SELECT idL FROM lekari l
WHERE l.spec = 'Zubny'
)
);
Zobrazte dátum narodenia najmladšieho/-ej lekára/-ky.
MAX
SELECT MAX(datnar) 'Najmladsi'
FROM lekari;
Zobrazte krstné meno, špecializáciu a dátum narodenia najmladšieho/-ej lekára/-ky.
MAX
-- Pomocou MAX
SELECT
l.krstne, l.spec, l.datnar
FROM lekari l
WHERE
l.datNar =
(
SELECT MAX(l1.datnar) FROM lekari l1
);
-- alebo
-- Pomocou ALL
SELECT
l.krstne, l.spec, l.datnar
FROM lekari l
WHERE
l.datNar >= ALL
(
SELECT l1.datnar FROM lekari l1
);
Nájdite údaje druhého najmladšieho/-ej lekára/-ky.
MAX
-- Pomocou MAX
SELECT
l.krstne, l.spec, l.datnar
FROM lekari l
WHERE
l.datNar =
(
SELECT
MAX(l2.datnar)
FROM
lekari l2
WHERE
l2.datnar <
(
SELECT
MAX(l1.datnar)
FROM
lekari l1
)
);
-- alebo
-- Pomocou ALL
SELECT
l.krstne, l.spec, l.datnar
FROM
(
SELECT
l3.krstne, l3.spec, l3.datnar
FROM
lekari l3
WHERE
l3.datnar <
(
SELECT
l2.datnar
FROM
lekari l2
WHERE
l2.datnar >= ALL
(
SELECT
l1.datnar
FROM
lekari l1
)
)
) l
WHERE
l.datnar >= ALL (
SELECT
l3.datnar
FROM
lekari l3
WHERE
l3.datnar <
(
SELECT
l2.datnar
FROM
lekari l2
WHERE
l2.datnar >= ALL
(
SELECT
l1.datnar
FROM
lekari l1
)
)
);
Nájdite všetky údaje o treťom/-tej najmladšom/-ej lekárovi/-ke.
MAX
-- Pomocou MAX
SELECT *
FROM lekari
WHERE
datnar =
(
SELECT max(l3.datNar)
FROM lekari l3
WHERE l3.datNar <
(
SELECT max(l2.datnar)
FROM lekari l2
WHERE l2.datNar <
(
SELECT max(l1.datnar) FROM lekari l1
)
)
);
Zistite koľko zarobili jednotliví lekári. Vo výsledku chceme vidieť krstné meno lekára a ich celkový príjem.
SUM
SELECT
l.krstne,
SUM(n.poplatok) as prijem
FROM navstevy n
JOIN lekari l ON l.idL = n.idL
GROUP BY l.krstne;
Zistite koľko zarobili jednotliví lekári. Vo výsledku chceme vidieť aj koľko zarobili dokopy.
SUM
WITH ROLLUP
SELECT
CASE WHEN l.krstne IS NULL THEN 'Spolu' ELSE l.krstne END krstne,
SUM(n.poplatok) as prijem
FROM navstevy n
JOIN lekari l ON l.idL = n.idL
GROUP BY l.krstne
WITH ROLLUP;
Dostali ste za úlohu spravovať upravenú databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.
Importnite si databázu osôb a zoznámte sa s jej štruktúrou. Vložte záznamy z pôvodnej databázy osôb do novej databázy.
INSERT SELECT
USE OsobaDB2;
INSERT osoba(id,meno,priezvisko,rodne_priezvisko,dat_nar,dat_smrti,pohlavie, vyska, vaha)
SELECT id,meno,priezvisko,rodne_priezvisko,dat_nar,dat_smrti,pohlavie, vyska, vaha
FROM osobadb.osoba;
Vložte záznam s id 14 do nového záznamu (s novým id 24).
INSERT SELECT
INSERT osoba(id,meno,priezvisko,rodne_priezvisko,datum_narodenia,dat_smrti,pohlavie, vyska, vaha)
SELECT 24,meno,priezvisko,rodne_priezvisko,dat_nar,dat_smrti,pohlavie, vyska, vaha
FROM osoba
WHERE id = 14;
Osoba s novovytvoreným záznam s id = 24 sa vydala. Upravte priezvisko na Dáša, pôvodné priezvisko nastavte podľa aktuálneho priezviska a nové priezvisko osoby je Dášová.
UPDATE
SET SQL_SAFE_UPDATES = 0;
UPDATE osoba
SET meno = 'Dáša', rodne_priezvisko = priezvisko, priezvisko = 'Dášová'
WHERE id = 24;
Odstráňte záznam s id = 24.
DELETE
SET SQL_SAFE_UPDATES = 0;
DELETE FROM osoba
WHERE id = 24;
Pridajte stĺpec vek a zaktualizujte vek u žijúcich osôb.
ALTER TABLE
ADD COLUMN
-- Pridanie stlpca
ALTER TABLE osoba ADD COLUMN vek INT;
-- alebo
ALTER TABLE osoba ADD vek INT;
-- Aktualizacia veku
UPDATE Osoba
SET vek = TIMESTAMPDIFF(YEAR, dat_nar, CURRENT_DATE())
WHERE dat_smrti NULL;
U zosnulých osôb zaktualizujte vek na vek úmrtia. Nastavte tĺpec vek na povinný s tým, že ak sa pri pridaní záznamu vek neuvedie, nastaví sa jeho hodnota na nulu.
ALTER TABLE
MODIFY COLUMN
DEFAULT
-- Aktualizacia veku
UPDATE Osoba
SET vek = TIMESTAMPDIFF(YEAR, dat_nar, IFNULL(dat_smrti, CURRENT_DATE()))
WHERE dat_smrti IS NOT NULL;
-- Modifikacia stlpca
ALTER TABLE osoba MODIFY COLUMN vek INT NOT NULL DEFAULT 0;
-- alebo
ALTER TABLE osoba MODIFY vek INT NOT NULL DEFAULT 0;
-- alebo
ALTER TABLE osoba CHANGE COLUMN vek vek INT NOT NULL DEFAULT 0;
-- alebo
ALTER TABLE osoba CHANGE vek vek INT NOT NULL DEFAULT 0;
Premenujte stĺpec vek na pocet_rokov.
ALTER TABLE
CHANGE COLUMN
ALTER TABLE osoba CHANGE COLUMN vek pocet_rokov INT NOT NULL DEFAULT 0;
-- alebo
ALTER TABLE osoba CHANGE vek pocet_rokov INT NOT NULL DEFAULT 0;
Odstráňte stĺpec vek/pocet_rokov.
ALTER TABLE
DROP COLUMN
ALTER TABLE osoba DROP COLUMN pocet_rokov;
-- alebo
ALTER TABLE osoba DROP pocet_rokov;
Zistite aké integritné obmedzenia už sú v databáze vytvorené.
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
SELECT * FROM information_schema.table_constraints
WHERE constraint_schema = 'osobadb2';
Pridajte primárny kľúč nad stĺpcom id a nastavte, aby sa automaticky zvyšovali hodnoty od 101. Overte správanie sa primárného kľúča na vyhovujúcich/nevyhovujúcich záznamoch.
PRIMARY KEY
ALTER TABLE osoba CHANGE id id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
-- alebo len pridanie kluca
ALTER TABLE osoba ADD PRIMARY KEY (id);
ALTER TABLE osoba AUTO_INCREMENT = 101;
Odstráňte primárny kľúč nad tabuľkou osôb.
PRIMARY KEY
ALTER TABLE osoba DROP PRIMARY KEY;
Pridajte obmedzenie, že pohlavie môže nadobúdať len hodnoty m alebo z. Pokúste sa pridať záznamy, ktoré vyhovujú/nevyhovujú danej podmienke. Na konci odstránte dané obmedzenie a skúste vložiť nevyhovujúci záznam.
CHECK
ALTER TABLE osoba ADD CONSTRAINT CHK_pohlavie CHECK(pohlavie IN('m','z'));
-- alebo
ALTER TABLE osoba ADD CHECK(pohlavie IN('m','z'));
-- odstranenie
ALTER TABLE osoba DROP CHECK CHK_pohlavie;
Pridajte obmedzenie, kde meno alebo priezvisko musia byť uvedené. Pokúste sa pridať záznamy, ktoré vyhovujú/nevyhovujú danej podmienke. Na konci odstránte dané obmedzenie a skúste vložiť nevyhovujúci záznam.
CHECK
ALTER TABLE osoba ADD CONSTRAINT CHK_not_null CHECK ( meno is not null or priezvisko is not null );
-- alebo
ALTER TABLE osoba ADD CHECK ( meno is not null or priezvisko is not null );
-- odstranenie
ALTER TABLE osoba DROP CHECK CHK_not_null;
Pridajte obmedzenie, kde trojica pohlavie, výška a váha musia byť jedinečné. Pokúste sa pridať záznamy, ktoré vyhovujú/nevyhovujú danej podmienke. Na konci odstránte dané obmedzenie a skúste vložiť nevyhovujúci záznam.
UNIQUE
ALTER TABLE osoba ADD CONSTRAINT UQ_pvv UNIQUE (pohlavie, vaha, vyska);
-- alebo
ALTER TABLE osoba ADD UNIQUE (pohlavie, vaha, vyska);
-- odstranenie
ALTER TABLE osoba DROP INDEX UQ_pvv;
Pridajte stĺpce otec, matka, ktoré budú zároveň cudzím kľúčom. Pokúste sa pridať záznamy, ktoré vyhovujú/nevyhovujú danej podmienke. Na konci odstránte dané obmedzenie a skúste vložiť nevyhovujúci záznam.
FOREIGN KEY
ALTER TABLE osoba ADD otec INT;
ALTER TABLE osoba ADD CONSTRAINT FK_otec FOREIGN KEY (otec) REFERENCES osoba (id);
ALTER TABLE osoba ADD COLUMN matka INTEGER, ADD FOREIGN KEY (matka) REFERENCES osoba (id);
-- odstranenie
ALTER TABLE osoba FOREIGN KEY FK_otec;
ALTER TABLE osoba FOREIGN KEY FK_matka;
Povoľte/zakážte integritné obmedzenie pre cudzie kľúče. Pokúste sa pridať záznamy, ktoré vyhovujú/nevyhovujú danej podmienke.
FOREIGN KEY
SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
ALTER TABLE osoba DISABLE KEYS;
ALTER TABLE osoba ENABLE KEYS;
Importnite si databázu MOZ a zoznámte sa s jej štruktúrou. Skúste nastaviť cudzie kľúče tak, aby sa pri aktualizácii hodnoty primárneho kľúča zaktualizovali aj hodnoty cudzích kľučov a pri mazaní miestnosti aby sa miestnosť na oddelení nastavila na NULL hodnotu. Mazanie pracovísk pokial majú zamestnanca nepovolíme.
FOREIGN KEY
USE MOZ;
ALTER TABLE Oddelenie
ADD CONSTRAINT fk_Miest
FOREIGN KEY (Miestnost)
REFERENCES Miestnost(idM)
ON DELETE SET NULL
ON UPDATE CASCADE;
-- RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
ALTER TABLE Zamestnanci
ADD CONSTRAINT fk_PNaOdd FOREIGN KEY (Prac_na_odd)
REFERENCES Oddelenie(Nazov_odd)
ON DELETE NO ACTION
ON UPDATE CASCADE;
-- RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
Importnite si upravenú databázu Osôb a zoznámte sa s jej štruktúrou. Premenujte tabľku Osoba na Person.
RENAME TABLE
USE OsobaDB2;
RENAME TABLE osoba TO person;