ÚINF/DBS1a/15 Databázové systémy

ÚINF/DBS/15 Databázové systémy pre matematikov

Úvod

Š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.

Informačný list predmetu

ÚINF/DBS1a/15 Databázové systémy

Vysoká škola: Univerzita P. J. Šafárika v Košiciach
Fakulta: Prírodovedecká fakulta
Kód predmetu: ÚINF/DBS1a/15
Názov predmetu: Databázové systémy
Druh, rozsah a metóda vzdelávacích činností:
Forma výučby: Prednáška / Cvičenie
Odporúčaný rozsah výučby ( v hodinách ):
Týždenný: 2 / 2
Za obdobie štúdia: 28 / 28
Metóda štúdia: prezenčná
Počet ECTS kreditov: 5
Odporúčaný semester/trimester štúdia: 3.
Stupeň štúdia: I.
Podmieňujúce predmety:
Podmienky na absolvovanie predmetu:
Preukázanie primeraného zvládnutia obsahového štandardu predmetu pri priebežnom a záverečnom hodnotení, schopnosť sformulovať problém v osvojenej terminológii a riešiť ho v rámci projektu.
Písomná previerka v priebehu semestra, zadanie.
Skúška písomná a ústna.
Výsledky vzdelávania:
Š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.
Stručná osnova predmetu:
1) Relačné databázy a jazyk SQL, filtrácia.
2) Dátové typy, operátory, funkcie numerické, reťazcové a časové.
3) JOIN.
4) Agregácia a GROUP BY.
5) Dátové a databázové modely. Relačná schéma. Princípy RDB. Integrita dát.
6) Návrh DB, ER diagramy.
7) Systémové príkazy o DB a tabuľkách. Kaskádovité mazanie a aktualizácia.
8) Vnorené dopyty. ROLLUP. CASE výraz.
9) Trojhodnotová logika. Kvantifikátory a NOT. Množinové operácie.
10) Data science a získavanie znalostí pomocou R.
11) Dátové sklady. Dátová kocka. Pivot tabuľky.
12) Normalizácia relačných databáz - 1. Relačná algebra.
Odporúčaná literatúra:
C.J. Date, Database Design and Relational Theory, 2012, O’Reilly Media, Inc., ISBN: 978-1-449-32801-6
J. Murach, Murach's MySQL, 3rd Edition, 2019, Mike Murach & Associates, Inc., ISBN-10: 1943872368
R. Ramakrishnan, J. Gehrke, Database Management Systems, 2020, McGraw-Hill, ISBN139780071231510
S. Krajči: Databázové systémy, UPJŠ, 2005
S. Krajči: Databázy, UPJŠ, 2020 - materiál
Poznámky:Prezenčná alebo online výuka.
Vyučujúci:
doc. RNDr. Csaba Török, CSc.
RNDr. Lukáš Miňo, PhD.

ÚINF/DBS/15 Databázové systémy pre matematikov

Vysoká škola: Univerzita P. J. Šafárika v Košiciach
Fakulta: Prírodovedecká fakulta
Kód predmetu: ÚINF/DBS/15
Názov predmetu: Databázové systémy pre matematikov
Druh, rozsah a metóda vzdelávacích činností:
Forma výučby: Prednáška / Cvičenie
Odporúčaný rozsah výučby ( v hodinách ):
Týždenný: 3 / 2
Za obdobie štúdia: 42 / 28
Metóda štúdia: prezenčná
Počet ECTS kreditov: 6
Odporúčaný semester/trimester štúdia: 1., 3.
Stupeň štúdia: I., II.
Podmieňujúce predmety:
Podmienky na absolvovanie predmetu:
Preukázanie primeraného zvládnutia obsahového štandardu predmetu pri priebežnom a záverečnom hodnotení, schopnosť sformulovať problém v osvojenej terminológii a riešiť ho v rámci projektu.
Písomná previerka v priebehu semestra, zadanie.
Skúška písomná a ústna.
Výsledky vzdelávania:
Š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.
Stručná osnova predmetu:
1) Relačné databázy. Dopytovací jazyk SQL, filtrácia; Uložené procedúry.
2) Dátové typy, operátory, funkcie numerické, reťazcové a časové; Funkcie systémové a užívateľské.
3) JOIN operácie; Pohľady. CTE.
4) Agregácia a GROUP BY; Rekurzia a transitívny uzáver.
5) Dátové a databázové modely. Relačná schéma. Princípy RDB. Integrita dát; Transakcie.
6) Návrh DB, ER diagramy; Triggery a integrita.
7) Systémové príkazy o DB a tabuľkách. Kaskádovité mazanie a aktualizácia; Kurzory.
8) Vnorené dopyty. ROLLUP. CASE výraz; Fyzická organizácia dát.
9) Trojhodnotová logika. Kvantifikátory a NOT. Množinové operácie; B-stromy a indexy.
10) Data science a získavanie znalostí pomocou R. Funkčné závislosti.
11) Dátové sklady. Dátová kocka. Pivot tabuľky.
12) Normalizácia relačných databáz; Najnovšia normálna forma - ETNF. Relačná algebra.
Odporúčaná literatúra:
C.J. Date, Database Design and Relational Theory, 2012, O’Reilly Media, Inc., ISBN: 978-1-449-32801-6
J. Murach, Murach's MySQL, 3rd Edition, 2019, Mike Murach & Associates, Inc., ISBN-10: 1943872368
R. Ramakrishnan, J. Gehrke, Database Management Systems, 2020, McGraw-Hill, ISBN139780071231510
S. Krajči: Databázové systémy, UPJŠ, 2005
S. Krajči: Databázy, UPJŠ, 2020 - materiál
I. Ben-Gan, D. Sarka, A. Machanic, K. Farlee, T-SQL Querying, 2015, Microsoft Press, ISBN: 978-0-7356-8504-8
I. Ben-Gan, T-SQL Fundamentals, Third Edition, 2016, Microsoft Press, ISBN: 978-1-5093-0200-0
Poznámky:Prezenčná alebo online výuka.
Vyučujúci:
doc. RNDr. Csaba Török, CSc.
RNDr. Lukáš Miňo, PhD.

Informačný list predmetu

ÚINF/DBS1b/15 Databázové systémy

Vysoká škola: Univerzita P. J. Šafárika v Košiciach
Fakulta: Prírodovedecká fakulta
Kód predmetu: ÚINF/DBS1b/15
Názov predmetu: Databázové systémy
Druh, rozsah a metóda vzdelávacích činností:
Forma výučby: Prednáška / Cvičenie
Odporúčaný rozsah výučby ( v hodinách ):
Týždenný: 2 / 2
Za obdobie štúdia: 28 / 28
Metóda štúdia: prezenčná
Počet ECTS kreditov: 6
Odporúčaný semester/trimester štúdia: 4.
Stupeň štúdia: I.
Podmieňujúce predmety: ÚINF/DBS1a/15
Podmienky na absolvovanie predmetu:
Preukázanie primeraného zvládnutia obsahového štandardu predmetu pri priebežnom a záverečnom hodnotení, schopnosť sformulovať problém v osvojenej terminológii a riešiť ho v rámci projektu. Písomná previerka v priebehu semestra, zadanie.
Skúška písomná a ústna.
Výsledky vzdelávania:
Š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ť nerelačnými databázami.
Stručná osnova predmetu:
1) Úvod do SQL Server. Množinové operácie. Window functions.
2) Uložené procedúry. Funkcie systémové a užívateľské.
3) Pohľady. CTE, rekurzia a transitívny uzáver.
4) Transakcie. Kurzory. Pivot.
5) Triggery a integrita. Fyzická organizácia dát, B-stromy a indexy.
6) XML dokumenty a ich dopytovanie. JSON.
7) Funkčné závislosti a NF.
8) Najnovšia normálna forma - ETNF.
9) Big data a NoSQL.
10) MongoDB, CRUD a kurzory.
11) Agregácie a indexy.
12) Replikácia a sharding.
Odporúčaná literatúra:
C.J. Date, Database Design and Relational Theory, 2012, O’Reilly Media, Inc., ISBN: 978-1-449-32801-6
J. Murach, Murach's MySQL, 3rd Edition, 2019, Mike Murach & Associates, Inc., ISBN-10: 1943872368
R. Ramakrishnan, J. Gehrke, Database Management Systems, 2020, McGraw-Hill, ISBN139780071231510
S. Krajči: Databázové systémy, UPJŠ, 2005
S. Krajči: Databázy, UPJŠ, 2020 - materiál
Poznámky:Prezenčná alebo online výuka.
Vyučujúci:
doc. RNDr. Csaba Török, CSc.
RNDr. Lukáš Miňo, PhD.

Dotazník

Neoficiálne hodnotenie pre interné účely Lukáša Miňa Oficiálny dotazník (ohodnoďte osobitne prednášku a cvičenie) pre celkové hodnotenie v rámci fakulty

Kontakt

Prednášajúci

doc. RNDr. Csaba Török, CSc.
csaba.torok@upjs.sk

Cvičiaci

RNDr. Lukáš Miňo, PhD.
lukas.mino@upjs.sk

Harmonogram

ÚINF/DBS1a/15 Databázové systémy

Prednáška

Čas: Streda 14:25 - 15:55
Miestnosť: SJ2P11 - Jesenná 5, 2. poschodie, poslucháreň
Študijné skupiny: 2AIb(A), 2BASInfb(A), 2GIb(A), 2Ib(A), 2MIb(A), 2ISVSb(A)

Cvičenie

Čas: Pondelok 8:00 - 9:30
Miestnosť: SA1C04 - Park Angelinum 9, 1. poschodie, počítačová učebňa
Študijné skupiny: 2AIb(A), 2BASInfb(A), 2GIb(A), 2MIb(A), 2ISVSb(A), 2ISVSb(A)

alebo

Čas: Štvrtok 08:00 - 09:30
Miestnosť: SA1C05 - Park Angelinum 9, 1. poschodie, počítačová učebňa
Študijné skupiny: 2GIb(A), 2Ib(A), 2MIb(A)

ÚINF/DBS/15 Databázové systémy pre matematikov

Prednáška

Čas: Streda 14:25 - 16:40
Miestnosť: SJ2P11 - Jesenná 5, 2. poschodie, poslucháreň
Študijné skupiny: 1MMm(A), 2ADUIb(A), 2EFMm(B), 2MMm(A)

Cvičenie

Čas: Pondelok 08:00 - 09:30
Miestnosť: SA1C04 - Park Angelinum 9, 1. poschodie, počítačová učebňa
Študijné skupiny: 1MMm(A), 2ADUIb(A), 2EFMm(B), 2MMm(A)

Hodnotenie

Cvičenie

Projekt: 6 bodov
Priebežné hodnotenia: 4 body
Polsemestrálne hodnotenie: 20 bodov
Koncosemestrálne hodnotenie: 20 bodov
Aktívne zapájanie sa do výučby: body navyše

Kto má súčet bodov za polsemestrálne a koncosemestrálne hodnotenie menej ako 25 bodov, tak píše opravný zápočet z celého semestra, za ktorý môže získať maximálne 25 bodov.

Skúška

Skúška: 50 bodov

Projekt

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:

  • Načrtnite entitno relačný diagram vašej databázy, kde navrhnete databázu s aspoň 4 entitnými tabuľkami, ktoré budú vhodne prepojené cudzími kľúčmi priamo, alebo pomocou prepájacích tabuliek. Pod pojmom entitná tabuľka budeme rozumieť tabuľku, ktorá má primárny kľúč a aspoň jeden stĺpec, ktorý nie je súčasťou primárneho kľúča.
  • Tabuľky naplnite vhodnými ilustračnými dátami (t.j. riadkami).
  • Vymyslite aspoň tri vhodné dopyty tak, aby sa aspoň v jednom použilo prepojenie dvoch rôznych tabuliek a aspoň v jednom ďalšom použilo prepojenie minimálne troch rôznych tabuliek.

Software

MySQL

Prednáška

  • 1. prednáška (aktualizované 26.9.2022)
    1. DB
    2. Modely
    3. SQL dopyty
    4. Príklady
    5. WHERE
  • 2. prednáška (aktualizované 5.10.2022)
    1. Prvky jazyka MySQL
    2. Typy a pretypovanie
    3. Operátory
    4. Funkcie reťazcové, numerické a časové
  • 3. prednáška (aktualizované 19.10.2022)
    1. JOIN
    2. Agregačné funkcie, GROUP BY, HAVING
  • 4.,5.,6. prednáška (aktualizované 26.10.2022)
    1. Dátové modely, schémy a inštancie, integrita dát 1
    2. Návrh relačných databáz a ER diagramy
    3. Vytvorenie databáz, tabuliek a integrita dát 2
  • 7. prednáška (aktualizované 1.11.2022)
    1. Databázy – súbory
    2. Systémové príkazy o DB a tabuľkách
    3. Tabuľky a storage engines
    4. Kaskádovité mazanie a aktualizácia - integrita
  • 8. prednáška (aktualizované 9.11.2022)
    1. Typy výsledkov dopytu
    2. Vnorené dopyty
    3. LIMIT
    4. CASE výraz
    5. GROUP BY s ROLLUP
    6. Extrémy a vnorené dopyty
  • 9. prednáška (aktualizované 20.11.2022)
    1. Trojhodnotová logika
    2. Alternatívny prístup k chýbajúcim údajom
    3. Kvantifikátory ALL, ANY (SOME), EXISTS a NOT
    4. Množinové operácie
    5. Príklady
  • 9. prednáška pre matematikov (aktualizované 16.11.2022)
    1. VIEW – POHĽAD
    2. CTE WITH
      1. Úvod
      2. Tranzitívny uzáver
      3. Syntax rekurzívneho CTE
      4. Príklady
      5. Ohraničenie iteračného kroku
  • 10. prednáška (aktualizované 23.11.2022)
    1. Dátové sklady
    2. Pivot tabuľky
  • 11. prednáška (aktualizované 30.11.2022)
    1. Úvod do R
    2. Databázové operácie a tidyverse
    3. Pivot tabuľka polikliniky
    4. Balík rpivotTable
    5. NASA - exoplanety
  • 12. prednáška (aktualizované 07.12.2022)
    • Normalizácia relačných databáz
      1. 1NF - 1. normálna forma
      2. 2NF - 2. normálna forma
      3. 3NF - 3. normálna forma
      4. HBCNF - Heat-Boyce-Coddova normálna forma

Cvičenie

1. cvičenie

Ciele

  • Dátové typy
  • Vytvorenie, odstránenie, použitie databáz
  • Vytvorenie a odstránenie tabuliek
  • Vloženie záznamov do tabuľky
  • Výpis záznamov z tabuľky

Zadania

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.

1. zadanie

Navrhnite, vytvorte a naplňte tabuľku podľa nasledujúceho vzoru:

Dátum Číslo objednávky Gramáž Jedlo Cena Dostupnosť
19.09.2022

1

150g Kurací steak plnený syrom a suš. paradajkou, ryža, šalát (1,7) 6.00€

19.09.2022

2

350g Granatiersky pochod, kyslá uhorka (1) 5.70€

20.09.2022

1

150g Debrecínsky guľáš, kolienka (1,3) 5.80€

20.09.2022

2

300g Jablkovo- škoricové pirohy (1,3) 4.70€

21.09.2022

1

150g Hovädzí maďarský guľáš, domáca knedľa (1,7) 5.80€

21.09.2022

2

Vyprážaný hermelín, listový šalát, hranolky, dresing (1,3,7)

  • CREATE DATABASE
  • DROP DATABASE
  • USE
  • CREATE TABLE
  • DROP TABLE
  • INSERT
  • SELECT
  • SHOW DATABASES
  • SHOW TABLES
                                 
# Vytvorenie databazy
CREATE DATABASE restauracia_u_vlka;

-- Pouzitie databazy
USE restauracia_u_vlka;

/* Vytvorenie tabulky */
CREATE TABLE denne_menu
(
   datum DATE,
   cislo INT,
   gramaz INT,
   jedlo VARCHAR(300),
   cena DEC(5,2),
   dostupnost BOOL
);

# Vlozenie zaznamu do tabulky
INSERT INTO denne_menu VALUES ('2022-09-19', 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
('2022-09-19', 2, 350, 'Granatiersky pochod, kyslá uhorka (1)', 5.70, true),
('2022-09-20', 1, 150, 'Debrecínsky guľáš, kolienka (1,3)', 5.80, true);

/* Vlozenie zaznamu do tabulky */
INSERT denne_menu VALUES ('2022-09-20', 2, 300, 'Jablkovo- škoricové pirohy (1,3)', 4.70, false);

# Vlozenie zaznamu do tabulky
INSERT denne_menu(datum, cislo, gramaz, jedlo, cena, dostupnost) 
VALUES ('2022-09-21', 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 ('2022-09-21', 2, 'Vyprážaný hermelín, listový šalát, hranolky, dresing (1,3,7)');

/* Zobrazenie zaznamov z tabulky */
SELECT * FROM denne_menu;
                                 
                              
2. zadanie

Upravte skript z 1. zadania tak, aby sa dal použiť viackrát.

  • CREATE DATABASE IF NOT EXISTS
  • DROP DATABASE IF EXISTS
  • USE
  • CREATE TABLE IF NOT EXISTS
  • DROP TABLE IF EXITS
  • INSERT
  • SELECT
                                 
# 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 INT,
gramaz INT,
jedlo VARCHAR(300),
cena DEC(5,2),
dostupnost BOOL
);

# Vlozenie zaznamu do tabulky
INSERT INTO denne_menu VALUES ('2022-09-19', 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
('2022-09-19', 2, 350, 'Granatiersky pochod, kyslá uhorka (1)', 5.70, true),
('2022-09-20', 1, 150, 'Debrecínsky guľáš, kolienka (1,3)', 5.80, true);

/* Vlozenie zaznamu do tabulky */
INSERT denne_menu VALUES ('2022-09-20', 2, 300, 'Jablkovo- škoricové pirohy (1,3)', 4.70, false);

# Vlozenie zaznamu do tabulky
INSERT denne_menu(datum, cislo, gramaz, jedlo, cena, dostupnost) 
VALUES ('2022-09-21', 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 ('2022-09-21', 2, 'Vyprážaný hermelín, listový šalát, hranolky, dresing (1,3,7)');

/* Zobrazenie zaznamov z tabulky */
SELECT * FROM denne_menu;
                                 
                              
3. zadanie

Zobrazte zoznam databáz a tabuliek.

  • SHOW DATABASES
  • SHOW TABLES
                                 
# Zobrazenie databaz
SHOW DATABASES;

-- Pouzitie databazy
USE restauracia_u_vlka;

-- Zobrazenie tabuliek z aktualnej databazy
SHOW TABLES;

-- Zobrazenie tabuliek z konkretnej databazy
SHOW TABLES FROM restauracia_u_vlka;
                                 
                              
Bonusové zadanie

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.

  • SELECT
  • AS
  • DATE_FORMAT
  • COALESCE
  • IFNULL
  • IF
                                 
# Zobrazenie tabulky z 1. zadania
SELECT 
   DATE_FORMAT(datum, '%d.%m.%Y') AS 'Dátum',
   cislo 'Číslo objednávky',
   IFNULL(CONCAT(gramaz, 'g'), null) "Gramáž",
   jedlo Jedlo,
   COALESCE(CONCAT(cena, '€'), null) AS Cena,
   IF(dostupnost IS NULL, 'x', IF(dostupnost = false, 'x', '')) AS 'Dostupnosť'
FROM
   denne_menu;
                                 
                              

2. cvičenie

Ciele

  • Zobrazenie databáz
  • Zobrazenie tabuliek
  • Zobrazenie záznamov z tabuľky
  • Pomenovanie stĺpcov
  • Zoradenie záznamov
  • Vertikálna a horizontálna filtrácia záznamov

Zadania

Dostali ste za úlohu spravovať databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.

1. zadanie

Zobrazte zoznam databáz.

  • SHOW DATABASES
                                 
# Zobrazenie databaz
SHOW DATABASES;
                                 
                              
2. zadanie

Zobrazte zoznam tabuliek z databázy OsobaDB.

  • SHOW TABLES
                                 
-- Pouzitie databazy
USE OsobaDB;

-- Zobrazenie tabuliek z aktualnej databazy
SHOW TABLES;

-- Zobrazenie tabuliek z databazy OsobaDB
SHOW TABLES FROM OsobaDB;
                                 
                              
3. zadanie

Zobrazte záznamy z tabuľky Osoba.

  • SELECT * FROM tabulka
                                 
-- Pouzitie databazy OsobaDB
USE OsobaDB;

-- Zobrazenie zaznamov z tabulky Osoba
SELECT * FROM osoba;
                                 
                              
4. zadanie

Zobrazte len meno, priezvisko a pohlavie z tabuľky Osoba.

  • SELECT
                                 
-- Zobrazenie stlpcov meno, priezvisko, pohlavie z tabulky Osoba
SELECT meno, priezvisko, pohlavie FROM osoba;
                                 
                              
5. zadanie

Zobrazte meno, priezvisko a pohlavie a názvy sĺpcov zobrazte po anglicky, t.j. Name, Surname, Gender.

  • AS
                                 
-- Zobrazenie stlpcov meno, priezvisko, pohlavie ako stlpce Name, Surname, Gender z tabulky Osoba
SELECT meno AS 'Name', priezvisko "Surname", pohlavie Gender FROM osoba;
                                 
                              
8. zadanie

Zoraďte záznamy podľa priezviska vzostupne, ak majú rovnaké priezvisko tak podľa mena zostupne, ak majú rovnaké meno a priezvisko tak podľa dátumu narodenia od najstaršieho.

  • ORDER BY
  • ASC
  • DESC
                                 
-- Zoradenie podla priezviska vzostupne, mena zostupne a datumu narodenia vzostupne
SELECT meno, priezvisko, dat_nar 'Dátum narodenia' 
FROM osoba
ORDER BY priezvisko ASC, 1 DESC, 'Dátum narodenia';
                                 
                              
10. zadanie

Zobrazte iba piatu a šiestu najvyššiu osobu.

  • ORDER BY
  • DESC
  • LIMIT
                                 
-- Piata a siesta najvyssia osoba
SELECT * 
FROM osoba
ORDER BY vyska DESC
LIMIT 4, 2;

-- alebo

SELECT * 
FROM osoba
ORDER BY vyska DESC
LIMIT 2 OFFSET 4;
                                 
                              
11. zadanie

Zobrazte osoby, ktoré majú id menšie ako štyri.

  • WHERE
                                 
-- Osoby, kde id < 4
SELECT * 
FROM osoba
WHERE id < 4;
                                 
                              
12. zadanie

Zobrazte žijúce ženy (nemajú uvedený dátum smrti), ktoré sa vydali (priezvisko a rodné priezvisko sú rôzne), narodili sa pred 1.1.1990 a majú viac ako 160 cm.

  • WHERE
  • AND
                                 

-- Zeny, ktore maju rozne priezvisko ako povodne, su zijuce, narodili sa pred 1.1.1990 a maju viac ako 160
SELECT * 
FROM osoba 
WHERE pohlavie = 'z' AND priezvisko <> rodne_priezvisko AND dat_smrti IS NULL AND dátum_narodenia < '1990-01-01' AND vyska > 160;
                                 
                              
13. zadanie

Zobrazte osoby, ktoré majú výšku 167, 169 alebo 182 cm.

  • WHERE
  • OR
  • IN
                                 
-- Osoby s vyskou 167, 169, 182
SELECT * 
FROM osoba 
WHERE vyska = 167 OR vyska = 169 OR vyska = 182;

-- alebo

SELECT * FROM osoba WHERE výška IN (167, 169, 182);
                                 
                              
14. zadanie

Zobrazte osoby, ktoré sa nevolajú Jozef, Ján ani Zuzana.

  • WHERE
  • AND
  • NOT IN
                                 
-- Osoby, ktore sa nevolaju Jozef, Jan, Zuzana
SELECT * 
FROM osoba 
WHERE meno != 'Jozef' AND meno <> 'Ján' AND NOT meno = 'Zuzana'; 

-- alebo

SELECT * 
FROM osoba 
WHERE meno NOT IN ('Jozef','Ján','Zuzana');
                                 
                              
16. zadanie

Zobrazte osoby, ktorých váha je menej ako 50 kg alebo viac ako 80 kg.

  • WHERE
  • OR
  • NOT BETWEEN
                                 
-- Osoby, ktore vazia menej ako 50 alebo viac ako 80
SELECT * 
FROM osoba 
WHERE vaha < 50 OR vaha > 80;

-- alebo

SELECT * 
FROM osoba 
WHERE vaha NOT BETWEEN 50 AND 80;
                                 
                              

3. cvičenie

Ciele

  • Vyhľadávanie pomocou operátora LIKE
  • Vyhľadávanie pomocou regulárnych výrazov

Zadania

Dostali ste za úlohu spravovať databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.

1. zadanie

Zobrazte osoby, ktorých priezviská začínaju slovom Novák.

  • LIKE
  • %
  • _
                                 
-- Priezviska zacinaju slovom Novak
SELECT * 
FROM osoba 
WHERE priezvisko LIKE 'Novák%';
                                 
                              
2. zadanie

Zobrazte osoby, ktorých priezviská obsahujú ová.

  • LIKE
  • %
  • _
                                 
-- Priezviska obsahuju ova
SELECT * 
FROM osoba 
WHERE priezvisko LIKE '%ová%';
                                 
                              
3. zadanie

Zobrazte osoby, ktorých priezviská končia na ová.

  • LIKE
  • %
  • _
                                 
-- Priezviska koncia na ova
SELECT * 
FROM osoba 
WHERE priezvisko LIKE '%ová';
                                 
                              
4. zadanie

Zobrazte osoby, ktorých priezviská končia na ová a nejaký ľubovoľný neprázdny znak.

  • LIKE
  • %
  • _
                                 
-- Priezviska koncia na ova a nejaky znak
SELECT * 
FROM osoba 
WHERE priezvisko LIKE '%ová_';
                                 
                              
5. zadanie

Zobrazte osoby, ktorých priezviská obsahujú znaky o alebo a.

  • LIKE
  • %
  • _
                                 
-- Priezviska obsahuju znaky o alebo a
SELECT * 
FROM osoba 
WHERE priezvisko LIKE '%o%' OR priezvisko LIKE '%a%';
                                 
                              
6. zadanie

Zobrazte osoby, ktorých priezviská majú 5 znakov.

  • LIKE
  • %
  • _
  • CHAR_LENGTH
                                 
-- Priezviska maju 5 znakov
SELECT * 
FROM osoba 
WHERE priezvisko LIKE '_____';

-- alebo

SELECT * 
FROM osoba 
WHERE CHAR_LENGTH(priezvisko) = 5;

-- alebo

SELECT * 
FROM osoba 
WHERE CHARACTER_LENGTH(priezvisko) = 5;
                                 
                              
7. zadanie

Pomocou regulárneho výrazu zobrazte osoby, ktorých priezviská začínaju slovom Novák.

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE
                                 
-- Priezviska zacinaju slovom Novak
SELECT * 
FROM osoba 
WHERE priezvisko REGEXP '^Novák';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko RLIKE '^Novák';

-- alebo

SELECT * 
FROM osoba 
WHERE REGEXP_LIKE(priezvisko, '^Novák');
                                 
                              
8. zadanie

Pomocou regulárneho výrazu zobrazte osoby, ktorých priezviská obsahujú ová.

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE
                                 
-- Priezviska obsahuju ova
SELECT * 
FROM osoba 
WHERE priezvisko REGEXP 'ová';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko RLIKE 'ová';

-- alebo

SELECT * 
FROM osoba 
WHERE REGEXP_LIKE(priezvisko, 'ová');
                                 
                              
9. zadanie

Pomocou regulárneho výrazu zobrazte osoby, ktorých priezviská končia na ová.

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE
                                 
-- Priezviska koncia na ova
SELECT * 
FROM osoba 
WHERE priezvisko REGEXP 'ová$';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko RLIKE 'ová$';

-- alebo

SELECT * 
FROM osoba 
WHERE REGEXP_LIKE(priezvisko, 'ová$');
                                 
                              
10. zadanie

Pomocou regulárneho výrazu zobrazte osoby, ktorých priezviská končia na ová a nejaký ľubovoľný neprázdny znak.

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE
                                 
-- Priezviska koncia na ova a nejaky znak
SELECT * 
FROM osoba 
WHERE priezvisko REGEXP 'ová.$';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko RLIKE 'ová.$';

-- alebo

SELECT * 
FROM osoba 
WHERE REGEXP_LIKE(priezvisko, 'ová.$');
                                 
                              
11. zadanie

Pomocou regulárneho výrazu zobrazte osoby, ktorých priezviská obsahujú znaky o alebo a.

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE
                                 
-- Priezviska obsahuju znaky o alebo a
SELECT * 
FROM osoba 
WHERE priezvisko REGEXP '[oa]';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko RLIKE '[oa]';

-- alebo

SELECT * 
FROM osoba 
WHERE REGEXP_LIKE(priezvisko, '[oa]');
                                 
                              
12. zadanie

Pomocou regulárneho výrazu zobrazte osoby, ktorých priezviská majú 5 znakov.

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE
                                 
-- Priezviska maju 5 znakov
SELECT * 
FROM osoba 
WHERE priezvisko REGEXP '^.....$';

-- alebo 

SELECT * 
FROM osoba 
WHERE priezvisko REGEXP '^.{5}$';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko RLIKE '^.....$';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko RLIKE '^.{5}$';

-- alebo

SELECT * 
FROM osoba 
WHERE REGEXP_LIKE(priezvisko, '^.....$');

-- alebo

SELECT * 
FROM osoba 
WHERE REGEXP_LIKE(priezvisko, '^.{5}$');
                                 
                              
13. zadanie

Zobrazte osoby, ktorých priezviská neobsahujú (malé i veľké) znaky k, l, m, n, o.

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE
                                 
-- Priezviska maju 5 znakov
SELECT * 
FROM osoba 
WHERE priezvisko NOT REGEXP '[klmnoKLMNO]';

-- alebo 

SELECT * 
FROM osoba 
WHERE priezvisko NOT REGEXP '[k-oK-O]';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko NOT RLIKE '[klmnoKLMNO]';

-- alebo

SELECT * 
FROM osoba 
WHERE priezvisko NOT RLIKE '[k-oK-O]';

-- alebo

SELECT * 
FROM osoba 
WHERE NOT REGEXP_LIKE(priezvisko, 'klmnoKLMNO');

-- alebo

SELECT * 
FROM osoba 
WHERE NOT REGEXP_LIKE(priezvisko, 'k-oK-O');
                                 
                              
Bonusové zadanie

Skúste napísať regulárny výraz, ktorý vyhodnotí, či email bol napísaný v správnom formáte.

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE
                                 
# Vrati 1 ak email je v spravnom formate, inak vrati 0.
SELECT 'lukas.mino@upjs.sk' REGEXP '^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';

-- Vrati 0
SELECT 'lukas,mino@upjs.sk' REGEXP '^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';
                                 
                              

4. cvičenie

Ciele

  • Funkcie pre prácu s reťazcami, číslami a dátumami

Zadania

Dostali ste za úlohu spravovať databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.

1. zadanie

Zobrazte priezviská osob a ich dĺžku v znakoch a bajtoch.

  • LENGTH
  • CHAR_LENGTH
  • CHARACTER_LENGTH
                                 
-- Priezviska a ich dlzky v znakoch a bajtoch
SELECT 
   priezvisko, 
   CHAR_LENGTH(priezvisko) 'Dĺžka v znakoch', 
   CHARACTER_LENGTH(priezvisko) 'Dĺžka v znakoch (iný spôsob)', 
   LENGTH(priezvisko) 'Dĺžka v bajtoch'
FROM osoba;
                                 
                              
Všimnime si, že priezviská obsahujúce diakritiku majú viac bajtov.
2. zadanie

Zobrazte len jedinečné (neopakujúce sa) posledné znaky z priezvisk osôb zotriedené lexikograficky, tieto znaky preveďte na malé písmená a zobrazte ich ASCII hodnotu, potom na veľké písmeno a zobrazte ich ASCII hodnotu. Skúste zistiť či je rozdiel v ASCII hodnote medzi veľkými a malými písmenami rovnaký. Skúste previesť ASCII hodnotu naspäť na konkrétny znak.

  • ASCII
  • LEFT
  • MID
  • RIGHT
  • SUBSTR
  • SUBSTRING
  • LCASE
  • LOWER
  • UCASE
  • UPPER
                                 
-- ASCII hodnoty poslednych pismen priezvisk - porovnanie velkych a malych pismen
SELECT 
   DISTINCT 
   RIGHT(priezvisko,1) 'Posledný znak', -- mozeme pouzit aj SUBSTR(priezvisko, CHAR_LENGTH(priezvisko),1), resp. SUBSTRING(priezvisko, CHARACTER_LENGTH(priezvisko),1)
   ASCII(RIGHT(priezvisko,1)) 'ASCII hodnota posledného znaku', 
   CHAR(ASCII(RIGHT(priezvisko,1)) USING ascii) 'Znak z ASCII hodnoty posledného znaku', 
   LCASE(RIGHT(priezvisko,1)) 'Malé písmeno', -- mozeme pouzit aj LOWER(RIGHT(priezvisko,1))
   ASCII(LCASE(RIGHT(priezvisko,1))) 'ASCII hodnota malého písmena', 
   CHAR(ASCII(LCASE(RIGHT(priezvisko,1))) USING ascii) 'Znak z ASCII hodnoty malého písmena',
   UCASE(RIGHT(priezvisko,1)) 'Veľké písmeno', -- mozeme pouzit aj UPPER(RIGHT(priezvisko,1))
   ASCII(UCASE(RIGHT(priezvisko,1))) 'ASCII hodnota malého písmena',
   CHAR(ASCII(UCASE(RIGHT(priezvisko,1))) USING ascii) 'Znak z ASCII hodnoty veľkého písmena',
   ASCII(UCASE(RIGHT(priezvisko,1))) - ASCII(LCASE(RIGHT(priezvisko,1))) AS 'Rozdiel v ASCII hodnotách medzi veľkým a malým písmenom'
FROM osoba
ORDER BY 1;
                                 
                              
Všimnime si, že znaky s diakritikou vrátili ASCII hodnotu 195 (asi dľžeň) a 196 (asi mäkčeň) a naspäť sa z čisla nepodarilo získať znak (funkcia CHAR vrátila otáznik).
3. zadanie

Vytvorte premennú snickers, do ktorej uložte text Keď si hladný, nie si to ty. Potom premennú snickers vypíšte

  1. príkazom SELECT.
  2. s medzerami nahradenými reťazcom ' vlastne '.
  3. s veľkými písmenami.
  4. s iba poslednými 8 znakmi.
  5. s vynechanými prvými 8 znakmi.
  6. s vynechanými prvými 8 znakmi. Vypíšte len 14 znakov.
  7. s iba prvými/poslednými dvoma slovami.
  8. s iba prvým slovom rozšíreným na 10 znakov, kde zvyšné znaky doplňte bodkami.

  • REPLACE
  • UPPER
  • RIGHT
  • SUBSTRING
  • MID
  • SUBSTRING_INDEX
  • RPAD
                                 
-- Premenna snickers
SET @snickers = 'Keď si hladný, nie si to ty';

-- Vypise vsetky uzivatelske premenne
SELECT * FROM performance_schema.user_variables_by_thread;

-- Vypise vsetky aplikacne premenne
SHOW VARIABLES;

-- a. príkazom SELECT.

SELECT @snickers;

-- b. s medzerami nahradenými reťazcom ' vlastne '.

SELECT REPLACE(@snickers, ' ', ' vlastne ');

-- c. s veľkými písmenami.

SELECT UPPER(@snickers);

-- d. s iba poslednými 8 znakmi.

SELECT RIGHT(@snickers, 8);

-- e. s vynechanými prvými 8 znakmi.

SELECT SUBSTRING(@snickers, 8);

SELECT MID(@snickers, 8); # MID je synonymum ku SUBSTRING

-- f. s vynechanými prvými 8 znakmi. Vypíšte len 14 znakov.

SELECT SUBSTRING(@snickers, 8, 14);

SELECT MID(@snickers, 8, 14);

-- g. s iba prvými/poslednými dvoma slovami.

SELECT SUBSTRING_INDEX(@snickers, ' ', 2);

SELECT SUBSTRING_INDEX(@snickers, ' ', - 2);

-- h. s iba prvým slovom rozšíreným na 10 znakov, kde zvyšné znaky doplňte bodkami.

SELECT RPAD(SUBSTRING_INDEX(@snickers, ' ', 1), 10, '.'); # RPAD-right-padded, ked dáme slovo dlhšie ako počet znakov, tak ho odsekne
                                 
                              
4. zadanie

Zobrazte mená a priezviská osôb v jednom stĺpci.

  • CONCAT
  • CONCAT_WS
                                 
-- Meno a priezvisko v jednom stlpci
SELECT CONCAT(meno, ' ', priezvisko) AS 'Meno a priezvisko'
FROM osoba
ORDER BY priezvisko, meno;

-- alebo

SELECT CONCAT_WS(' ', meno, priezvisko) AS 'Meno a priezvisko'
FROM osoba
ORDER BY priezvisko, meno;
                                 
                              
5. zadanie

Zobrazte prvý znak mena, bodku, medzeru a priezvisko osôb v jednom stĺpci. Napr. A. Prvý.

  • CONCAT
  • CONCAT_WS
  • SUBSTRING
  • LEFT
                                 
-- Prve pismeno z mena a priezvisko
SELECT CONCAT(SUBSTRING(meno, CHAR_LENGTH(meno),1), '. ', priezvisko) 
FROM osoba;

-- alebo

SELECT CONCAT_WS('. ', LEFT(meno, 1), priezvisko) # retazcova funkcia LEFT vrati najlavejsich X znakov
FROM osoba; 
                                 
                              
6. zadanie

Zobrazte meno, priezvisko, vysku po zaokruhlení a celočíselnú váhu (dolná celá časť) osôb.

  • ROUND
  • FLOOR
  • CEIL
                                 
-- Prve pismeno z mena a priezvisko
SELECT 
   meno, 
   priezvisko, 
   ROUND(vyska, 0) AS 'vyska' -- alebo ROUND(vyska)
   FLOOR(vaha) AS 'vaha' # numericka funkcia - FLOOR(X) vrati najvaciu celociselnu hodnotu nie vacsiu ako X
FROM osoba;
                                 
                              
9. zadanie

Zobrazte aktuálnu časovú pečiatku (dátum a čas v jednom stĺpci).

  • CURRENT_TIMESTAMP
                                 
-- Aktualna casova peciatka
SELECT CURRENT_TIMESTAMP();
                                 
                              
10. zadanie

Skúste na príklade ukázať rozdiel medzi funkciami NOW a SYSDATE.

  • NOW
  • SYSDATE
                                 
SELECT NOW(); #vrati cas spustenia príkazu

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();
                                 
                              
12. zadanie

Zobrazte včerajší dátum.

  • SUBDATE
  • CURRENT_DATE
  • CURDATE
                                 
-- Vcerajsi datum
SELECT SUBDATE(CURRENT_DATE(), 1);

-- alebo

SELECT ADDDATE(CURRENT_DATE(), -1);
                                 
                              
13. zadanie

Zobrazte aký bude dátum presne o mesiac.

  • ADDDATE
  • TIMESTAMPADD
  • CURRENT_DATE
  • CURDATE
                                 
-- Datum o mesiac
SELECT ADDDATE(CURRENT_DATE(), INTERVAL 1 MONTH);

-- alebo

SELECT TIMESTAMPADD(MONTH, 1, CURRENT_DATE());
                                 
                              
15. zadanie
16. zadanie

Zobrazte dnešný deň v týždni (po slovensky).

  • DAYNAME
  • CURRENT_DATE
  • CURDATE
                                 
-- Den v tyzdni
-- po slovensky
SET lc_time_names = 'sk_SK'; 
SELECT DAYNAME(CURRENT_DATE()) slov;

-- 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 DAYOFWEEK(CURRENT_DATE()) -- 1 = Sunday
   WHEN 1 THEN 'Nedela'
   WHEN 2 THEN 'Pondelok'
   WHEN 3 THEN 'Utorok'
   WHEN 4 THEN 'Streda'
   WHEN 5 THEN 'Stvrtok'
   WHEN 6 THEN 'Piatok'
   WHEN 7 THEN 'Sobota'
   ELSE 'Nezname'
   END 'Deň v týždni'
FROM osoba;
                                 
                              
17. zadanie

Zobrazte meno aktuálneho mesiaca (po slovensky).

  • MONTHNAME
  • CURRENT_DATE
  • CURDATE
                                 
-- Nazov mesiaca

-- po slovensky
SET lc_time_names = 'sk_SK'; 
SELECT MONTHNAME(CURRENT_DATE()) slov;

-- po anglicky
SET lc_time_names = 'en_US'; 
SELECT MONTHNAME(CURRENT_DATE()) ang;
                                 
                              
18. zadanie

Zobrazte osoby narodené medzi rokmi 1980 a 1985.

  • YEAR
  • BETWEEN
  • AND
                                 
-- Osoby narodene medzi rokmi 1980 a 1985.
SELECT * FROM osoba WHERE YEAR(dat_nar) BETWEEN 1980 AND 1985;

-- alebo

SELECT * FROM osoba WHERE 1980 <= YEAR(dat_nar) AND YEAR(dat_nar) <= 1985;
                                 
                              
19. zadanie

Zobrazte osoby narodené medzi 10. a 20. dňom v septembri.

  • MONTH
  • DAY
                                 
-- Osoby narodene medzi 10. a 20. dnom septembra.
SELECT * FROM osoba WHERE MONTH(dat_nar) = 9 AND DAY(dat_nar) BETWEEN 10 AND 20;
                                 
                              
20. zadanie

Zobrazte osoby narodené v pondelok.

  • WEEKDAY
  • DAYOFWEEK
                                 
-- Osoby narodene v pondelok
SELECT * FROM osoba 
WHERE WEEKDAY(dat_nar)  = 1; -- 1 = Monday

-- alebo

SELECT * FROM osoba 
WHERE DAYOFWEEK(dat_nar) = 2; -- 2 = Monday
                                 
                              
21. zadanie

Zobrazte meno, priezvisko a dátum narodenia osôb v slovenskom formáte (den.mesiac.rok).

  • DATE_FORMAT
                                 
-- Datum narodenia vo formate dd.MM.yyyy
SELECT 
   meno,
   priezvisko,
   DATE_FORMAT(dat_nar, '%d.%m.%Y')
FROM osoba;
                                 
                              
22. zadanie

Zobrazte meno, priezvisko, dátum narodenia a aktuálny vek u žijúcich osôb.

  • TIMESTAMPDIFF
  • CURRENT_DATE
                                 
-- Meno, priezvisko, datum narodenia a vek
SELECT 
   meno, 
   priezvisko, 
   dat_nar, 
   TIMESTAMPDIFF(YEAR, dat_nar, CURRENT_DATE())
FROM
   osoba;
                                 
                              
23. zadanie

Zobrazte meno, priezvisko, dátum narodenia, dátum smrti a vek (u žijúcich aktuálny vek, u zosnulých vek v čase smrti).

  • TIMESTAMPDIFF
  • CURRENT_DATE
  • IFNULL
  • COALESCE
                                 
-- Meno, priezvisko, datum narodenia, datum smrti a vek (u zosnulych vek v case umrtia)
SELECT 
   meno, 
   priezvisko, 
   dat_nar, 
   dat_smrti, 
   TIMESTAMPDIFF(YEAR, dat_nar, IFNULL(dat_smrti, CURRENT_DATE()))
FROM
   osoba;

-- alebo

SELECT 
   meno, 
   priezvisko, 
   dat_nar, 
   dat_smrti, 
   TIMESTAMPDIFF(YEAR, dat_nar, COALESCE(dat_smrti, CURRENT_DATE()))
FROM
   osoba;
                                 
                              
24. zadanie

Zobrazte číslo meno, priezvisko a pohlavie (muž, žena, neznáme).

  • CASE
                                 
-- Meno, priezvisko, pohlavie (muz/zena/nezname)
SELECT
   meno,
   priezvisko,s
   CASE 
      WHEN pohlavie = 'm' THEN 'Muz' 
      WHEN pohlavie = 'z' THEN 'Zena'
      ELSE 'Nezname'
   END pohlavie
FROM osoba;

-- alebo

SELECT
   meno,
   priezvisko,s
   CASE pohlavie
      WHEN 'm' THEN 'Muz' 
      WHEN 'z' THEN 'Zena'
      ELSE 'Nezname'
   END pohlavie
FROM osoba;
                                 
                              
25. zadanie

Zobrazte číslo PI na 15 desatinných miest.

  • PI
  • CAST
  • CONVERT
                                 
-- cislo PI
SELECT PI(); # defaultne zobrazi 7 desatinnych miest

-- cislo PI na 15 desatinných miest.
SELECT CAST(PI() AS DECIMAL(16, 15)); # CAST funkcia pretypuje vybrany vyraz na zadany typ
                                 
                              

5. cvičenie

Ciele

  • Agregačné funkcie

Zadania

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.

5. zadanie

Zobrazte meno pacienta, ktorý ma najväčší mesačný príjem.

  • MAX
                                 
-- Meno pacienta, ktory ma mes. prijem 35000
SELECT 
   krstne
FROM pacienti
WHERE mesPrijem = 35000;

-- Meno pacienta, ktory ma najvacsi mesacny prijem
SELECT 
   krstne 
FROM pacienti
WHERE mesPrijem = (SELECT MAX(mesPrijem) FROM pacienti);
                                 
                              
6. zadanie

Zistite koľko návštev mal lekár s id = 3.

  • COUNT
                                 
-- Pocet navstev u lekara s id = 3
SELECT 
   COUNT(*) 'Počet návštev' 
FROM navstevy
WHERE idL = 3;
                                 
                              
7. zadanie

Zobrazte počet návštev u jednotlivých lekárov.

  • COUNT
                                 
-- Pocet navstev u jednotlivych lekarov
SELECT 
   idL, 
   COUNT(*) 'Počet návštev' 
FROM navstevy
GROUP BY idL;
                                 
                              
8. zadanie

Zobrazte koľko rôznych pacientov navštívilo jednotlivých lekárov.

  • COUNT
  • DISTINCT
                                 
-- Pocet roznych pacientov u jednotlivych lekarov
SELECT 
   idL, 
   COUNT(DISTINCT idP) 'Počet pacientov' 
FROM navstevy
GROUP BY idL;
                                 
                              
9. zadanie

Zobrazte lekárov a počet návštev, ktorí mali viac ako 3 návštevy.

  • COUNT
                                 
-- Pocet navstev u jednotlivych lekarov, ktori mali viac ako 3 navstevy
SELECT 
   idL, 
   COUNT(*) 'Počet návštev' 
FROM navstevy
GROUP BY idL
HAVING COUNT(*) > 3;
                                 
                              
10. zadanie

Zobrazte počet návštev jednotlivých pacientov.

  • COUNT
                                 
-- Pocet navstev jednotlivych pacientov
SELECT 
   idP, 
   COUNT(*) 'Počet návštev' 
FROM navstevy
GROUP BY idP;
                                 
                              
11. zadanie

Zobrazte počet návštev pacientov u jednotlivých lekárov.

  • COUNT
                                 
-- Pocet navstev pacientov u lekarov
SELECT 
   idP Pacient, 
   idL Lekar, 
   COUNT(*) Pocet 
FROM navstevy
GROUP BY idP, idL
ORDER By idP, idL;

-- alebo

SELECT 
   idP Pacient, 
   idL Lekar, 
   COUNT(*) Pocet 
FROM navstevy
GROUP BY idL, idP
ORDER By idP, idL;
                                 
                              
12. zadanie

Zobrazte návštevy medzi 5.7. a 9.9.2008.

  • BETWEEN
                                 
-- Navstevy medzi 5.7.2008 a 9.9.2008
SELECT 
   * 
FROM navstevy
WHERE den BETWEEN '2008-07-05' AND '2008-09-09';
                                 
                              
17. zadanie

6. cvičenie

Ciele

  • Práca s viacerými tabuľkami

Zadania

Dostali ste za úlohu spravovať databázu polikliniky. Importnite si ju a zoznámte sa s jej štruktúrou.

1. zadanie

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.

  • CROSS JOIN
  • (INNER) JOIN
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
                                 
USE mnoziny;

-- CROSS JOIN
SELECT * FROM a, b;

-- INNER JOIN
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 OUTER JOIN b USING(x);

-- RIGHT OUTER JOIN
SELECT * FROM a RIGHT OUTER JOIN b ON b.x = a.x;
-- alebo
SELECT * FROM a RIGHT OUTER JOIN b USING(x);
                                 
                              
2. zadanie

V ďalšich zadaniach budete pracovať s databázou poliklinika. Zobrazte id rôznych pacientov, ktorí už kedysi navštívili zubného lekára.

  • JOIN
                                 
USE poliklinika;

-- Neefektivne riesenie - karteziansky sucin dvoch tabuliek 
SELECT 
   DISTINCT n.idp
FROM
   navstevy n, -- <=> navstevy AS n,
   lekari l
WHERE
   l.idl = n.idl AND l.spec = 'zubny';
-- (optimizer to v skutocnosti radsej prevedie na riesenie nizsie)

-- Spravne riesenie pomocou prepajacieho operatora JOIN
SELECT 
   DISTINCT n.idp
FROM navstevy n
   JOIN lekari l ON l.idl = n.idl
WHERE
   l.spec = 'zubny';
      
-- Ak prepajame dve tabulky na identickych stlpcov, tak MySQL podporuje takuto skratenu syntax.
SELECT 
   DISTINCT n.idp
FROM navstevy n
   JOIN lekari l USING(idl)
WHERE
   l.spec = 'zubny'; 
                                 
                              
3. zadanie

Zobrazte id pacientov, ktorí navštívili zubára, pričom vypíšte aj dátum návštevy.

  • JOIN
                                 
SELECT 
   n.idp, 
   n.den
FROM navstevy n
   JOIN lekari l USING (idl)
WHERE
   l.spec = 'zubny';
                                 
                              
4. zadanie

Zobrazte id pacientov, ktorí navštívili zubára, pričom vypíšte aj dátum návštevy, meno lekára a meno pacienta.

  • JOIN
                                 
SELECT 
   p.idp, 
   p.krstne 'Meno pacienta',
   l.krstne 'Meno lekara',
   n.den
FROM navstevy n
   JOIN lekari l ON l.idL = n.idL
   JOIN pacienti p ON p.idP = n.idP
WHERE
   l.spec = 'zubny';

-- alebo pomocou USING

SELECT 
   p.idp, 
   p.krstne 'Meno pacienta',
   l.krstne 'Meno lekara',
   n.den
FROM navstevy n
   JOIN lekari l USING (idl)
   JOIN pacienti p USING (idp)
WHERE
   l.spec = 'zubny';

-- Skratena syntax pre viac JOIN operatorov

SELECT 
   p.idp, 
   p.krstne 'Meno',
   l.krstne 'Meno lekara',
   n.den
FROM navstevy n
   JOIN (lekari l, pacienti p) USING (idl, idp)
WHERE
   l.spec = 'zubny';

-- alebo

SELECT 
   p.idp, 
   p.krstne 'Meno', 
   n.den
FROM navstevy n 
   JOIN (lekari l, pacienti p) ON l.idl = n.idl AND p.idp = n.idp
WHERE
   l.spec = 'zubny';
                                 
                              
5. zadanie

Zobrazte počet všetkých návštev u zubára.

  • JOIN
                                 
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;
                                 
                              
6. zadanie

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
                                 
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;
                                 
                              
7. zadanie

Zobrazte mená pacientov, ktorí už navštívili lekára Ota a Imra.

  • JOIN
                                 
-- NEFUNGUJE    
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 = 'Oto' AND l.krstne = 'Imro' # ved navsteva prislucha iba jednemu lekarovi, a neexistuje navsteva kde je lekar aj Oto aj Imro
ORDER BY l.krstne, p.krstne;

-- SPRAVNE
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

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'
	);
                                 
                              

7. cvičenie

Ciele

  • Konceptuálny návrh entitno-relačného diagramu

Zadania

Dostali ste za úlohu navrhnúť štruktúru na sprevádzkovanie eshopu.

8. cvičenie

Ciele

  • Množinové operácie
  • Vnorené dopyty

Zadania

Dostali ste za úlohu spravovať databázu polikliniky. Importnite si ju a zoznámte sa s jej štruktúrou.

1. zadanie

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;
                                 
                              
2. zadanie

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;
                                 
                              
3. zadanie

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;
                                 
                              
4. zadanie

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;
                                 
                              
5. zadanie

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;
                                 
                              
6. zadanie

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
      )
   );
                                 
                              
7. zadanie

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
);
                                 
                              
8. zadanie

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'
	);
                                 
                              
9. zadanie

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'
      )
   );
                                 
                              
11. zadanie

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
	);
                                 
                              
12. zadanie

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
					)
			)
	);
                                 
                              
13. zadanie

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
         )
      )
   );
                                 
                              
14. zadanie

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;
                                 
                              
15. zadanie

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;
                                 
                              

9. cvičenie

Ciele

  • Polsemestrálna previerka

Príklad zápočtu

1. Návrh štruktúry (5 bodov)

Majstrovstvá sveta v ľadovom hokeji sa v roku 2022 konali vo Fínsku. V základnej A skupine sa stretlo 8 mužstiev a odohrali nasledujúcich 28 zápasov:
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
pp - po predĺžení
sn - samostatné nájazdy

Navrhnite vhodnú štruktúru a naplňte tabuľky uvedenými dátami (na zápočte pre krátkosť času stačí vložiť aspoň 6 záznamov).
(vytvorenie vlastnej databázy 1 bod, vytvorenie tabuľky 1 bod (lepšie je vytvoriť 2 tabuľky za 2 body), naplnenie tabuliek 1 bod, výpis tabuľky (aj s pomenovanými stĺpcami) 1 bod)

2. Základné informácie (3 body)

  1. Koľko ubehlo dní od prvého zápasu (po dnešný dátum)? Skúste namiesto dní zistiť koľko mesiacov mohlo už ubehnúť od prvého zápasu (0.5 boda za počet dní, 0.5 boda za počet mesiacov)
  2. Vypíšte štáty, ktoré začínajú na S a končia na o. Štáty zoraďte zostupne (podmienka 0.5 boda, zoradenie 0.5 boda)
  3. Janko Hraško sa stavil s kamarátom o to, koľko zápasov vyhrá hráč uvedený ako prvý (domáci). Dopomôžte mu vygenerovať záznamy dátumov a mužstiev, kde domáci vyhrali (1 bod)

3. Prehľad (3 body)

  1. Vypíšte duel prvého zápasu (0.5 boda za nájdenie dátumu, 0.5 boda za výpis zápasu)
  2. V ktorom zápase padlo najviac gólov? (0.5 bod za nájdenie počtu gólov, 0.5 boda za výpis zápasu)
  3. V ktorých zápasoch bol rozdiel gólov najtesnejší? (0.5 bod za nájdenie najmenšieho rozdielu, 0.5 boda za výpis záznamu)

4. Informácie pre slovenského fanúšika (5 bodov)

Slovenský fanúšik chce vidieť len zápasy svojho mužstva. Dopomôžte mu tým, že uvidí dátumy zápasov so Slovenskom, dni , súperov, s ktorými hrali a informáciu o tom, či zápas pre Slovákov skončil výhrou alebo prehrou. Záznamy nech sú zotriedené podľa dátumu ako je vidieť na tomto príklade:
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
(výpis stĺpcov dátum, domácich a hostí 1 bod, filter 1 bod, stĺpec deň 0.5 boda (vypísaný aj po slovensky 0.5 boda), stĺpec konečný stav 1 bod , zoradenie 1 bod)

5. Tabuľka výsledkov (4 body)

Vypíšte kompletnú výsledkovú tabuľku, ktorá bude obsahovať názov tímu, počet zápasov, počet výhier, počet výhier po predĺžení, počet prehier po predĺžení, počet prehier, počet daných gólov, počet získaných gólov a body (za výhru sú 3 body, za výhru po predĺžení 2 body, za prehru po predĺžení 1 bod, za prehru 0 bodov). Tabuľku zoradte podľa počtu bodov a ak je počet bodov rovnaký, tak pre jednoduchosť stačí podľa daných gólov.
(stĺpce názov 1 bod, výhry/výhry po predĺžení/prehry po predĺžení/prehry 1 bod, dané góly 0.5 boda, získané góly 0.5 boda, body 0.5 boda boda, zoradenie 0.5 boda – spolu 4 body)
Tabuľku výsledkov jsi môžete pozrieť na stránke https://en.wikipedia.org/wiki/2022_IIHF_World_Championship_Group_A

10. cvičenie

Ciele

  • Integritné obmedzenia

Zadania

Dostali ste za úlohu spravovať upravenú databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.

1. zadanie

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;
                                 
                              
2. zadanie

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;
                                 
                              
3. zadanie

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;
                                 
                              
4. zadanie
5. zadanie

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;
                                 
                              
6. zadanie

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;
                                 
                              
7. zadanie

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;
                                 
                              
8. zadanie

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;
                                 
                              
9. zadanie

Zistite aké integritné obmedzenia už sú v databáze vytvorené.

  • INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                                 
SELECT * FROM information_schema.table_constraints
WHERE constraint_schema = 'osobadb2';
                                 
                              
10. zadanie

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;
                                 
                              
11. zadanie

Odstráňte primárny kľúč nad tabuľkou osôb.

  • PRIMARY KEY
                                 
ALTER TABLE osoba DROP PRIMARY KEY;
                                 
                              
12. zadanie

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;
                                 
                              
13. zadanie

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;
                                 
                              
14. zadanie

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;
                                 
                              
15. zadanie

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;
                                 
                              
16. zadanie

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;
                                 
                              
17. zadanie

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
                                 
                              
18. zadanie

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;
                                 
                              

11. cvičenie

Ciele

  • Data science a získavanie znalostí pomocou R

Materiál

12. cvičenie

Ciele

  • Koncosemestrálna previerka

13. cvičenie

Ciele

  • Opravný zápočet