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

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

Oznam

  • Obhajoba projektov pre študentov predmetu PAZ1c: 29.10.2024 od 9:50 v SA1C03
  • Obhajoba projektov pre ostatných študentov: 29.10.2024, 4.11.2024, 5.11.2024, 11.11.2024, 12.11.2024, 18.11.2024, 19.11.2024 po cvičení
  • Polsemestrálna previerka: 4.11.2024, 5.11.2024, 14.11.2024
  • Koncosemestrálna previerka: 25.11.2024, 26.11.2024, 28.11.2024

Kontakt

Prednášajúci a skúšajúci

Cvičiaci

Motivácia

Matrix code

Práca s databázovými systémami? Načo mi to bude? Nepostačuje mi textový súbor, CSV, XML, JSON alebo excel?

Základné pojmy

Aké sú najpoužívanejšie DBMS s ktorými sa uplatním na svetovom trhu?

andscape and categorization of the high variety of existing database systems

Čo sa na tomto predmete naučím a aké mám ďalšie možnosti?

Š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

Administrácia 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

Materiál

Software

SQL Tutoriál

SQL Tutoriál

MySQL Tutoriál

Odporúčaná literatúra

Hodnotenie

Známka

  • A: 91-100 bodov
  • B: 81-90 bodov
  • C: 71-80 bodov
  • D: 61-70 bodov
  • E: 51-60 bodov
  • FX: 0-50 bodov

Bodovanie

  • Nutnou podmienkou hodnotenia je vyplnenie dotazníkov
  • Body za semester: maximálne 50 bodov
    • Každá neospravedlnená neúčasť: -1 bod
    • Priebežné previerky: 4 body
      • Preverienie, či študent pochopil preberanému účivu na prednáške, utvrdenie si preberaných pojmov
      • Približne 8x na začiatku cvičenia dostanete z témy poslednej prednášky 5 otázok po 0.1 bode
      • Portál na priebežné previerky
    • Domáce úlohy: 10 bodov
      • Preverienie a získanie praktických zručností v prvých týždňoch semestra
      • Približne 100 domácich úloh po 0.1 bode
        • Počas 1. cvičenia: 1 úloha
        • Po 2. cvičení: 20 úloh
        • Po 3. cvičení: 40 úloh
        • Po 4. cvičení: 30 úloh
        • Po 5. až 6. cvičení: príprava projektu a príprava na polsemestrálnu previerku
        • Niekedy po 9. cvičení: 10 úloh
        • Po preriešených domácich úlohach bude príprava na koncosemestrálnu previerku a skúšku
      • Portál na odovzdávanie domácich úloh
    • Projekt: 6 bodov
      • Preverienie, či študent vie navrhnúť vhodnú databázovu štruktúru pre svoj projekt
        • študenti predmetu PAZ1c - obhajoba na cvičení PAZ1c 29.10.2024
        • študenti predmetu DBS - obhajoba na prednáške DBS
        • ostatní - obhajoba mimo rozvrhu hodín niekedy v druhej polovici semestra
      • Viac o projekte
      • 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ť na cvičení PAZ1c.

        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.

        Bodovanie
        • 5-6 bodov: potrebné drobné úpravy na projekte
        • 3-4 body: potrebné väčšie úpravy na projekte, prerobenie maximálne 1 entitnej tabuľky s väzbami
        • 1-2 body: potrebné prerobenie celého projektu a poslanie cvičiacemu na opätovné schválenie
        Študenti návrhu predmetu ÚINF/DBS/15 Databázové systémy pre matematikov

        Obhajoba 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ť 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 návrhu 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.

    • Polsemestrálna previerka: 15 bodov
      • Preverienie, či študent vie riešiť úlohy z danej oblasti zadaných od zákazníka
      • Na prelome októbra a novembra
      • Príklad previerky
      • 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
    • Koncosemestrálna previerka: 15 bodov
      • Preverienie, či študent vie riešiť úlohy z danej oblasti zadaných od zákazníka
      • Začiatkom decembra
    • Aktívne zapájanie sa do výučby: body navyše
      • Editovateľný návod pre najnovšiu inštaláciu MySQL poslaný na email cvičiaceho: 1 bod
  • Skúška: 50 bodov
    • Preverienie, či študent ovláda princípy relačných databáz a SQL
    • Na papieri

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é. O danom incidente budú informovaní všetci kolegovia a daný prehrešok bude posunutý etickej komisii, ktorá môže rozhodnúť o vylúčení študenta zo štúdia.

Študujte kvôli sebe a pre seba... ...inak len mrháte svoj čas a čas iných. (K plagiátorstvu na PAZ1b)

Zopakujme si radu z PAZ:
Spolupráca a vzájomná komunikácia je predpokladom k úspešnému zvládnutiu štúdia. Avšak aby ste sa vyhli obvineniu z plagiátorstva odporúčame dodržiavať tieto pravidlá známe z PAZ:

  • Pri vysvetľovaní učiva nepoužívajte ako príklady úlohy, ktoré sú z aktuálnych sád domácich zadaní, ale napr. z cvičení.
  • Ak hovoríte o riešení úlohy z aktuálnej sady zadaní, vyhnite sa použitiu kódu.
  • Ak využívate školské učebne na riešenie úloh z aktuálnych sád domácich zadaní, svoje riešenia neuchovávajte na školskom počítači a nezabudnite sa odhlásiť zo systémov.
  • Pri nejasnostiach kontaktujte cvičiaceho.

Prednáška

  • ÚINF/DBS1a/15 Databázové systémy
    • Čas: Utorok 12:50 - 14:20
    • 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)
  • ÚINF/DBS/15 Databázové systémy pre matematikov
    • Čas: Utorok 12:50 - 15:05
    • Miestnosť: SJ2P11 - Jesenná 5, 2. poschodie, poslucháreň
    • Študijné skupiny: 1MMm(A), 2ADUIb(A), 2EFMm(B), 2MMm(A)

Databázy používané na prednáškach

Prednáška

  • 1. prednáška (aktualizované 24.9.2024)
    1. DB
    2. Modely
    3. SQL dopyty
    4. Príklady
    5. WHERE
  • 2. prednáška (aktualizované 24.9.2024)
    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é 1.10.2024)
    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é 15.10.2024)
    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é 29.10.2024)
    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é 5.11.2024)
    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é 12.11.2024)
    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é 19.11.2024)
    1. Dátové sklady - Data warehouse (DWH) a OLAP
    2. Pivot kocka a pivot tabuľky

Cvičenie

  • 1. skupina: informatici
    • Čas: Pondelok 16:00 - 17:30
    • Miestnosť: SA1C04 - Park Angelinum 9, 1. poschodie, počítačová učebňa
    • Študijné skupiny: 2AIb(A), 2Ib(A)
  • 2. skupina: informačná bezpečnosť, školstvo a verejná správa
    • Čas: Utorok 15:20 - 16:50
    • Miestnosť: SA1C03 - 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)
  • 3. skupina: manažéri, ekonómovia, dátoví analytici
    • Čas: Štvrtok 8:00 - 9:30
    • Miestnosť: SA1C04 - Park Angelinum 9, 1. poschodie, počítačová učebňa
    • Študijné skupiny: 1MMm(A), 2ADUIb(A), 2EFMm(B), 2MMm(A)

1. cvičenie: Úvod do databázových systémov

Ciele

  • Úvod do databázových systémov
  • Dátové typy
  • Vytvorenie, odstránenie, použitie databáz
  • Vytvorenie a odstránenie tabuliek
  • Vloženie dát do tabuľky
  • Výber dát 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.2024

1

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

25.09.2024

2

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

26.09.2024

1

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

26.09.2024

2

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

27.09.2024

1

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

27.09.2024

2

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

Riešenie
                                       
-- 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 ('2024-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
("2024-09-25", 2, 350, 'Granatiersky pochod, kyslá uhorka (1)', 5.70, true),
('2024-09-26', 1, 150, "Debrecínsky guľáš, kolienka (1,3)", 5.80, true);

/* Vlozenie zaznamu do tabulky */
INSERT denne_menu VALUES ("2024-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 ('2024-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 ('2024-09-27', 2, 'Vyprážaný hermelín, listový šalát, hranolky, dresing (1,3,7)');
                                       
                                    
2. zadanie

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

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

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

Riešenie
                                       
# 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 ('2024-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
('2024-09-25', 2, 350, 'Granatiersky pochod, kyslá uhorka (1)', 5.70, true),
('2024-09-26', 1, 150, 'Debrecínsky guľáš, kolienka (1,3)', 5.80, true);

/* Vlozenie zaznamu do tabulky */
INSERT denne_menu VALUES ('2024-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 ('2024-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 ('2024-09-27', 2, 'Vyprážaný hermelín, listový šalát, hranolky, dresing (1,3,7)');
                                       
                                    
4. zadanie

Zobrazte zoznam databáz.

Riešenie
                                       
# Zobrazenie databaz
SHOW DATABASES;
                                       
                                    
5. zadanie

Zobrazte zoznam tabuliek.

Riešenie
                                       
-- Zobrazenie tabuliek z aktualnej databazy
SHOW TABLES;

-- Zobrazenie tabuliek z konkretnej databazy
SHOW TABLES FROM restauracia_u_vlka;
                                       
                                    

2. cvičenie: Výber dát

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.

3. cvičenie: Regulárne výrazy, MySQL funkcie

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.

Riešenie
                                       
# 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.

Riešenie
                                       
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.

Riešenie
                                       
-- 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: Spojenie tabuliek, agregačné funkcie

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 Mnoziny2 a zoznámte sa s jej štruktúrou. Zobrazte výsledky spojenia dvoch tabuliek T1 a T1 cez stĺpec x pomocou CROSS JOIN, INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN.

                                       
USE mnoziny2;

-- CROSS JOIN
SELECT * FROM T1 CROSS JOIN T2;
-- alebo
SELECT * FROM T1, T2;

-- CROSS JOIN spojením tabuliek cez stĺpec x
SELECT * FROM T1 CROSS JOIN T2 WHERE T2.x = T1.x;
-- alebo
SELECT * FROM T1, T2 WHERE T2.x = T1.x;
-- NEEFEKTIVNE, radsej pouzit INNER JOIN

-- INNER JOIN
SELECT * FROM T1 INNER JOIN T2 ON T2.x = T1.x;
-- alebo
SELECT * FROM T1 JOIN T2 ON b.x = T1.x;
-- alebo
SELECT * FROM T1 JOIN T2 USING(x);

-- LEFT OUTER JOIN
SELECT * FROM T1 LEFT OUTER JOIN T2 ON T2.x = T1.x;
-- alebo
SELECT * FROM T1 LEFT JOIN b ON T2.x = T1.x;
-- alebo
SELECT * FROM T1 LEFT OUTER JOIN T2 USING(x);
-- alebo
SELECT * FROM T1 LEFT JOIN T2 USING(x);

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

Importnite si databázu Mnoziny2 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 mnoziny2;

-- FULL OUTER JOIN MySQL zatial nepodporuje
SELECT * FROM T1 FULL OUTER JOIN T2 WHERE T2.x = T1.x;

-- Simulacia spojenia cez FULL OUTER JOIN
SELECT * FROM T1 LEFT OUTER JOIN T2 ON T2.x = T1.x
UNION
SELECT * FROM T1 RIGHT JOIN T2 ON T2.x = T1.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;
                                    
                                 
6. zadanie

Zobrazte id pacientov, ktorí mali viac ako 1 návštevu. Uveďte id pacienta a počet návštev. Výsledok zoraďte podľa najväčšieho počtu návštev a potom podľa id pacientov.

                                    
   -- id pacientov a pocet navstev, ktori mali viac ako 1 navstevu
   SELECT 
      idP,
      COUNT(idN) 'Počet návštev'
   FROM navstevy
   GROUP BY idP
   HAVING COUNT(idN) > 1
   ORDER BY 2 DESC, idP ASC;
   
   -- alebo
   
   SELECT 
      idP,
      COUNT(*) 'Počet návštev'
   FROM navstevy
   GROUP BY idP
   HAVING COUNT(*) > 1
   ORDER BY COUNT(*) DESC, 1;
                                    
                                 

5. cvičenie: Návrh databázovej štruktúry

Ciele

  • Návrh databázovej štruktúry

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úť databázovú štruktúru na sprevádzkovanie eshopu.

Zadanie

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

6. cvičenie: Opakovanie

Ciele

  • Opakovanie

7. cvičenie: Modifikácia dát a metadát, integritné obmedzenia

Ciele

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

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

8. cvičenie: Polsemestrálna previerka

Ciele

  • Polsemestrálna previerka
    • Výber dát
    • Regulárne výrazy
    • MySQL funkcie
    • Spojenie tabuliek
    • Agregačné funkcie
    • Návrh databázovej štruktúry

9. cvičenie: Množinové operácie, vnorené dopyty

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;

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

                                       
SELECT 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

Tipy a triky

Trendy

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

  • Teoretické základy databáz
  • Úvod do Microsoft SQL Server
    • 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
    • Spúšťače - TRIGGER
    • Pohľady - VIEW
    • Common Table Expression (CTE) - WITH
    • Rekurzia
    • Indexy - INDEX
    • Transakcie - TRANSACTION, COMMIT, ROLLBACK
    • Kurzory - CURSOR
    • Kontingenčné tabuľky - PIVOT
    • WINDOW funkcie
    • XML
    • JSON
    • a iné
  • Úvod do NoSQL a MongoDB

Ďalšie predmety nadväzujúce na predmet ÚINF/DBS1b/15 Databázové systémy

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: Koncosemestrálna previerka

Ciele

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

13. cvičenie: Opakovanie, vyhodnotenie semestra, príprava na skúšku, konzultácie

Ciele

  • Opakovanie
  • Vyhodnotenie semestra
  • Príprava na skúšku
  • Konzultácie

Databáza