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

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

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

Oznamy a termíny

Motivácia

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

Prednáška

Cvičenie

Motivácia

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

Prerekvizita k predmetom

Predmety predpokladajúce základy SQL

Iné zaujímavé predmety ohľadom databáz

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

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

Ďalšie nadväzujúce predmety

Harmonogram

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

Prednáška

Č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)

Cvičenie

Č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)

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

Prednáška

Čas: Štvrtok 7:05 - 9:20
Miestnosť: SJ2P11 - Jesenná 5, 2. poschodie, poslucháreň
Študijné skupiny: 1MMm(A), 2ADUIb(A), 2EFMm(B), 2MMm(A)

Cvičenie

Č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)

Hodnotenie

Cvičenie

Priebežné previerky: 4 body
Domáce úlohy: 10 bodov
Projekt: 6 bodov

  • študenti predmetu PAZ1c - obhajoba - 02.11.2023 od 14:00 v SA1C03
  • študenti predmetu DBS - obhajoba na prednáške DBS
  • ostatní - obhajoba pravdepodobne mimo rozvrhu hodín - 13.11.2023 a 20.11.2023 pred alebo po cvičení
Polsemestrálna previerka: 15 bodov
  • pondelok - 30.10.2023
  • utorok - 07.11.2023
  • štvrtok - 09.11.2023
Koncosemestrálna previerka: 15 bodov
  • pondelok - 27.11.2023
  • utorok - 28.11.2023
  • štvrtok - 30.11.2023
Aktívne zapájanie sa do výučby: body navyše

Skúška

Skúška: 50 bodov

Plagiátorstvo

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.

Projekt

Inšpirácie z minulých rokov

Vyvarujte sa najčastejších chýb z minulých rokov

  • Zbytočne nekomplikujte daný projekt vecami, ktoré nie sú pre daný projekt podstatné (napr. evidovanie dátumu spotreby jednotlivých potravín pri receptoch).
  • Ujasnite si čo od daného projektu očakávate (napr. či pri otázke je jedna alebo viac správnych odpovedí, ako sa bude daný test hodnotiť, či sa môže zadávať aj slovná odpoveď).
  • Prejdite si práva a správanie jednotlivých používateľov (napr. z pohľadu admina, skladnika, lekárnika).
  • Zamyslite sa, či ten istý používateľ môže mať viacero pozícií (napr. predávajúci i kupujúci zároveň; astronóm, vedec, vynálezca, fotograf, vojenský letec, brigádny generál ozbrojených síl, organizátor, diplomat, politik a štátnik zároveň). Ako sa má vtedy daná aplikácia správať?
  • Snažte sa o znovupoužiteľnosť daného projektu (napr. aby sa štruktúra volebného programu dala použiť aj pre nasledujúce volebné obdobie, možnosť evidovania histórie).
  • Namiesto evidovania dvoch hodnôt môžete použiť aj dátový typ BOOLEAN (napr. is_active, is_woman).
  • Ak používateľ môže pisať dlhší text, môžete použiť aj dátový typ TEXT namiesto VARCHAR(2000).
  • Dobre si premyslite použitie vzťahov 1:1 a M:N, či nie je lepšie zlúčiť 2 tabuľky, resp. použiť radšej vzťah 1:N.
  • Umiestnite si tabuľky tak, aby sa vám čo najmenej čiar v ERD pretínalo.
  • Nebojte sa používať dátumy, sú vhodné pri hľadaní v histórii.
  • Vyvarujte sa duplicitným záznamom. Ak sú si tabuľky podobné, napr. dodávateľ/odberateľ, tak radšej nech "dedia" z jednej spoločnej tabuľky a do daných tabuliek len doevidujete čo má jedna tabuľke iné/naviac oproti inej.
  • ...
  • Popýtajte sa starších kolegov, kde najčastejšie robili chyby a čomu sa vyvarovať.
  • Konceptuálny návrh entitno-relačného diagramu nie je jednoduchý - nezúfajte a poučte sa z chýb.

Obhajoba

Študenti predmetu ÚINF/PAZ1c/17 Programovanie, algoritmy, zložitosť

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.

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

Obhajoba návrhu projektu bude prebiehať na prednáške DBS.

Študenti, ktorí sa NEzúčastnili obhajob návrhov projektov z predmetu PAZ1c alebo na prednáške predmetu 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:

  • 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.
  • ...
  • Ďalšie úlohy budú dopĺňané priebežne.

Materiál

Software

R

Tutoriál

MySQL

Inštalácia
Dokumentácia
Tutoriál

Odporúčaná literatúra

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.

Databáza

Domáca úloha

Dotazník

Prednáška

  • 1. prednáška (aktualizované 28.9.2023)
    1. DB
    2. Modely
    3. SQL dopyty
    4. Príklady
    5. WHERE
  • 2. prednáška (aktualizované 05.10.2023)
    1. Prvky jazyka MySQL
    2. Typy a pretypovanie
    3. Operátory
    4. Numerické funkcie
    5. Reťazcové funkcie
    6. Dátumy a časové funkcie
  • 3. prednáška (aktualizované 26.10.2023)
    1. Tri základné typy JOIN
    2. Ďalšie typy JOIN
    3. NULL hodnoty a OUTER JOIN
    4. Agregačné funkcie
    5. GROUP BY, HAVING
  • 4.,5.,6. prednáška (aktualizované 26.10.2023)
    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é 2.11.2023)
    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.2023)
    1. Typy výsledkov dopytu
    2. Vnorené dopyty
    3. CASE výraz
    4. GROUP BY s ROLLUP
    5. LIMIT
    6. Extrémy a vnorené dopyty
  • 9. prednáška (aktualizované 16.11.2023)
    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
  • 10. prednáška (aktualizované 07.12.2023)
    1. Dátové sklady
    2. Pivot kocka a pivot tabuľky
  • 11. prednáška (aktualizované 30.11.2023)
    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

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ýber záznamov z tabuľky
  • Zobrazenie databáz
  • Zobrazenie tabuliek

Kľúčové slová

  • 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]

Návody

Návody z www.w3schools.com

Návody z www.mysqltutorial.org

Dokumentácia z dev.mysql.com

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

Vyberte/zobrazte/vypíšte obsah tabuľky.

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

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

Zobrazte zoznam databáz.

                                 
# Zobrazenie databaz
SHOW DATABASES;
                                 
                              
5. zadanie

Zobrazte zoznam tabuliek.

                                 
-- 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. Dáta sa nemajú meniť, iba správne zobraziť.

2. cvičenie

Ciele

  • Výber záznamov z tabuľky
  • Pomenovanie stĺpcov
  • Zoradenie záznamov
  • Vertikálna a horizontálna filtrácia záznamov
  • Vyhľadávanie záznamov

Kľúčové slová

  • 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

Návody

Návody z www.w3schools.com

Návody z www.mysqltutorial.org

Dokumentácia z dev.mysql.com

Databáza

Zadania

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

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

3. cvičenie

Ciele

  • Vyhľadávanie pomocou regulárnych výrazov
  • MySQL funkcie

Kľúčové slová

Vyhľadávanie pomocou regulárnych výrazov

  • NOT REGEXP
  • REGEXP
  • REGEXP_INSTR()
  • REGEXP_LIKE()
  • REGEXP_REPLACE()
  • REGEXP_SUBSTR()
  • RLIKE

MySQL funkcie

  • CONCAT, REPLACE, UPPER, ...
  • PI, RAND, SQRT, ...
  • CURDATE, MONTHNAME, DATEDIFF, ...
  • CASE, CAST, COALESCE, ...

Návody

Vyhľadávanie pomocou regulárnych výrazov

MySQL funkcie

Databáza

Tipy a triky

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

Zadania

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

1. zadanie

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

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

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;
                                 
                              

4. cvičenie

Ciele

  • Spojenie tabuliek
  • Agregačné funkcie

Kľúčové slová

Spojenie tabuliek

  • CROSS JOIN
  • [INNER] JOIN
  • LEFT [OUTER] JOIN
  • RIGHT [OUTER] JOIN
  • FULL [OUTER] JOIN

Agregačné funkcie

  • MIN, MAX, COUNT, SUM, AVG, ...

Návody

Spojenie tabuliek

Agregačné funkcie

Databáza

Tipy a triky

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

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.

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.

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

3. zadanie

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

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

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;
                              
                           

5. cvičenie

Ciele

  • Konceptuálny návrh Entitno-Relačného Diagramu (ERD)

Návody

Tipy a triky

  • Vytvorenie nového modelu:
    File -> New Model -> Add Diagram
  • Reverzné inžinierstvo z existujúcej databázy:
    Database -> Reverse Engineer
  • Export SQL skriptu:
    File -> Export -> Forward Engineer SQL CREATE Script
  • Export ERD do PDF/PNG/SVG:
    File -> Export

Zadania

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

Zadanie

Navrhnite vhodnú štruktúru na sprevádzkovanie eshopu.

6. cvičenie

Ciele

  • Opakovanie

7. cvičenie

Ciele

  • Polsemestrálna previerka

Príklad previerky

1. Návrh štruktúry (3 body)

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 pomocou ERD (entitno-relačného diagramu), vyexportuje SQL skript a PNG obrázok ERD. Naplňte tabuľky uvedenými dátami (na zápočte pre krátkosť času stačí vložiť aspoň 6 záznamov).

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 zobraziť 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 (3 body)

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

5. Tabuľka výsledkov (3 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.
Výslednú tabuľku výsledkov môžete vidieť na stránke https://en.wikipedia.org/wiki/2022_IIHF_World_Championship_Group_A

8. cvičenie

Ciele

  • Pridanie, aktualizácia, zmazanie dát
  • Modifikácia metadát tabuľky
  • Integritné obmedzenia
    • PRIMARY KEY
    • FOREIGN KEY
    • UNIQUE
    • CHECK
    • NOT NULL
    • DEFAULT

Kľúčové slová

  • 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

Návody

Databáza

Tipy a triky

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

Vyriešené príklady z cvičenia

9. cvičenie

Ciele

  • Množinové operácie
    • UNION
    • INTERSECT
    • EXCEPT
  • Vnorené dopyty
    • Výsledok
      • nič
      • skalárna hodnota
      • zoznam
      • tabuľka
    • Umiestnenie
      • v SELECT zozname
      • vo FROM klauzule
      • vo WHERE klauzule
    • Operátory
      • porovnávacie operátory
      • IN, NOT IN
      • ANY, SOME
      • ALL
      • EXISTS, NOT EXISTS
    • Korelované/Nekorelované

Kľúčové slová

Množinové operácie

  • UNION
  • INTERSECT
  • EXCEPT

Vnorené dopyty

  • =, >, <, >=, <=, <>, !=
  • IN, NOT IN
  • ANY, SOME
  • ALL
  • EXISTS, NOT EXISTS

Návody

Zjednotenie

Prienik

Rozdiel

Databáza

Zadania

1. zadanie

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

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

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

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

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

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

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

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

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

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

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

10. cvičenie

Ciele

  • Ďalšie možnosti MySQL
  • Opakovanie

Kľúčové slová

  • 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

Ďalšie možnosti MySQL

!!! SQL Injection !!!

MySQL Export/Import CSV

SHOW vs. INFORMATION_SCHEMA

Integrácia MySQL s rôznymi programovacími jazykmi

Ďalšie možnosti - letný semester - ÚINF/DBS1b/15 Databázové systémy

  • Relačná algebra
  • Normalizácia databáz
  • WINDOW funkcie
  • Deklarácia premenných - DECLARE, SET
  • Podmienky - IF, CASE
  • Cykly - LOOP, WHILE, REPEAT, LEAVE
  • Procedúry - PROCEDURE
  • Funkcie - FUNCTION
  • Spracovanie chýb a výnimiek
  • Pohľady - VIEW
  • Common Table Expression (CTE) - WITH
  • Rekurzia
  • Transakcie - TRANSACTION, COMMIT, ROLLBACK
  • Kurzory - CURSOR
  • Kontingenčné tabuľky - PIVOT
  • Spúšťače - TRIGGER
  • Indexy - INDEX
  • XML
  • JSON
  • a iné

Zadania

1. zadanie

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;
                                 
                              

11. cvičenie

Ciele

  • Koncosemestrálna previerka
    • Pridanie, aktualizácia, zmazanie dát
    • Modifikácia metadát tabuľky
    • Integritné obmedzenia
    • Množinové operácie
    • Vnorené dopyty

12. cvičenie

Ciele

  • MySQL v R

R

Tutoriál

Návody

Databáza

Vyriešené príklady z cvičenia

13. cvičenie

Ciele

  • Konzultácie

8. cvičenie

Ciele

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

Databáza

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;
                                 
                              

7. cvičenie

Ciele

  • Polsemestrálna previerka

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