Študent po absolvovaní predmetu ovláda princípy relačných databáz, je schopný aplikovať štandardné dátové modely, navrhovať relačné databázy a sformulovať filtračné dopyty.
Študent po absolvovaní predmetu zvládne použitie náročnejších techník relačných databáz, teoretickú analýzu funkčných závislostí atribútov a je schopný pracovať s nerelačnými databázami.
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.
Obhajoba projektu bude prebiehať na prednáške 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:
DÁTUM | DOMÁCI | HOSTIA | VÝSLEDOK |
---|---|---|---|
13.05.2022 15:20 | Francúzsko | Slovensko | 2:4 |
13.05.2022 19:20 | Nemecko | Kanada | 3:5 |
14.05.2022 11:20 | Dánsko | Kazachstan | 9:1 |
14.05.2022 15:20 | Švajčiarsko | Taliansko | 5:2 |
14.05.2022 19:20 | Slovensko | Nemecko | 1:2 |
15.05.2022 11:20 | Taliansko | Kanada | 1:6 |
15.05.2022 15:20 | Francúzsko | Kazachstan | 2:1 |
15.05.2022 19:20 | Dánsko | Švajčiarsko | 0:6 |
16.05.2022 15:20 | Slovensko | Kanada | 1:5 |
16.05.2022 19:20 | Francúzsko | Nemecko | 2:3 |
17.05.2022 15:20 | Taliansko | Dánsko | 1:2 |
17.05.2022 19:20 | Švajčiarsko | Kazachstan | 3:2 |
18.05.2022 15:20 | Francúzsko | Taliansko | 2:1 pp |
18.05.2022 19:20 | Švajčiarsko | Slovensko | 5:3 |
19.05.2022 17:00 | Nemecko | Dánsko | 1:0 |
19.05.2022 20:30 | Kanada | Kazachstan | 6:3 |
20.05.2022 15:20 | Nemecko | Taliansko | 9:4 |
20.05.2022 19:20 | Kazachstan | Slovensko | 3:4 |
21.05.2022 11:20 | Dánsko | Francúzsko | 3:0 |
21.05.2022 15:20 | Kanada | Švajčiarsko | 3:6 |
21.05.2022 19:20 | Taliansko | Slovensko | 1:3 |
22.05.2022 15:20 | Kazachstan | Nemecko | 4:5 |
22.05.2022 19:20 | Švajčiarsko | Francúzsko | 5:2 |
23.05.2022 15:20 | Kazachstan | Taliansko | 5:2 |
23.05.2022 19:20 | Kanada | Dánsko | 2:3 |
24.05.2022 11:20 | Nemecko | Švajčiarsko | 3:4 sn |
24.05.2022 15:20 | Slovensko | Dánsko | 7:1 |
24.05.2022 19:20 | Kanada | Francúzsko | 7:1 |
Dátum | Deň | Domáci | Hostia | Konečný stav |
---|---|---|---|---|
13.05.2022 15:20 | utorok | Francúzsko | Slovensko | Vyhrali |
14.05.2022 19:20 | sobota | Slovensko | Nemecko | Prehrali |
16.05.2022 15:20 | pondelok | Slovensko | Kanada | Prehrali |
18.05.2022 19:20 | streda | Švajčiarsko | Slovensko | Prehrali |
20.05.2022 19:20 | piatok | Kazachstan | Slovensko | Vyhrali |
21.05.2022 19:20 | sobota | Taliansko | Slovensko | Vyhrali |
24.05.2022 15:20 | utorok | Slovensko | Dánsko | Vyhrali |
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:
CHAR, VARCHAR, BOOLEAN, INTEGER, DECIMAL, DATE, ...
CREATE DATABASE [IF NOT EXISTS], DROP DATABASE [IF EXISTS]
USE
CREATE TABLE [IF NOT EXISTS], DROP TABLE [IF EXISTS]
INSERT [INTO] ... VALUES
SELECT * FROM table_name
SHOW DATABASES
SHOW TABLES [FROM database_name]
Majiteľ reštaurácie U vlka chce nalákať zákazníkov aj tým, že im bude zverejňovať denné menu na internete. Pomôžte mu splniť nasledujúce zadania.
Navrhnite, vytvorte a naplňte tabuľku podľa nasledujúceho vzoru:
Dátum | Číslo objednávky | Gramáž | Jedlo | Cena | Dostupnosť |
---|---|---|---|---|---|
25.09.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) |
|
-- 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)');
Vyberte/zobrazte/vypíšte obsah tabuľky.
Riešenie
/* Zobrazenie zaznamov z tabulky */
SELECT * FROM denne_menu;
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)');
Zobrazte zoznam tabuliek.
Riešenie
-- Zobrazenie tabuliek z aktualnej databazy
SHOW TABLES;
-- Zobrazenie tabuliek z konkretnej databazy
SHOW TABLES FROM restauracia_u_vlka;
SELECT
DISTINCT
AS
ORDER BY
LIMIT
WHERE
IS NULL, IS NOT NULL
AND, OR, NOT, XOR
IN, NOT IN
BETWEEN, NOT BETWEEN
LIKE, NOT LIKE
Dostali ste za úlohu spravovať databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.
NOT REGEXP
REGEXP
REGEXP_INSTR()
REGEXP_LIKE()
REGEXP_REPLACE()
REGEXP_SUBSTR()
RLIKE
CONCAT, REPLACE, UPPER, ...
PI, RAND, SQRT, ...
CURDATE, MONTHNAME, DATEDIFF, ...
CASE, CAST, COALESCE, ...
-- zobrazenie hodnoty systemovej premennej lc_time_names
SELECT @@lc_time_names;
-- en_US
-- sk_SK
-- nastavenie sk_SK
SET lc_time_names = 'sk_SK';
-- sk_SK
-- en_US
Dostali ste za úlohu spravovať databázu osôb. Importnite si ju a zoznámte sa s jej štruktúrou.
Skúste napísať regulárny výraz, ktorý vyhodnotí, či email bol napísaný v správnom formáte.
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}$';
Skúste na príklade ukázať rozdiel medzi funkciami NOW
a SYSDATE
.
SELECT NOW(); #vrati cas spustenia dopytu
SELECT SYSDATE(); #vrati cas kedy bola zavolana funkcia
-- Pozn.: CURRENT_TIMESTAMP a NOW vratia cas zaciatku vykonavania dopytu. Naproti tomu SYSDATE vrati aktualny cas. Vid. priklady:
-- Cas oboch volani NOW je rovnaky.
SELECT NOW(), SLEEP(2), NOW();
-- Cas druheho volania SYSDATE je posunuty o dve sekundy.
SELECT SYSDATE(), SLEEP(2), SYSDATE();
Zobrazte dnešný deň v týždni po slovensky.
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;
CROSS JOIN
[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
MIN, MAX, COUNT, SUM, AVG, ...
-- zobrazenie hodnoty systemovej premennej sql_mode
SELECT @@sql_mode;
-- ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
-- zobrazenie hodnoty systemovej premennej session.sql_mode
SELECT @@session.sql_mode;
-- ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
-- nastavenie ONLY_FULL_GROUP_BY
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY';
-- alebo
SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY';
-- alebo
SET SESSION sql_mode = sys.list_add(@@session.sql_mode, 'ONLY_FULL_GROUP_BY');
-- zrusenie ONLY_FULL_GROUP_BY
SET SESSION sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Po úspešnom absolvovaní predchádzajúcich týždoch Vás presunuli na medicínsky projekt. Dostali ste za úlohu spravovať databázu polikliniky. Importnite si ju a zoznámte sa s jej štruktúrou.
Importnite si databázu 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);
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.
Zobrazte meno pacienta, ktorý ma najväčší mesačný príjem.
-- Meno pacienta, ktory ma najvacsi mesacny prijem
SELECT
krstne
FROM pacienti
WHERE mesPrijem = (SELECT MAX(mesPrijem) FROM pacienti);
Zobrazte mininimálny, maximálny, počet, sumu a priemerný poplatok pacientov u jednotlivých lekárov.
-- Informacie o poplatkoch pacientov u lekarov
SELECT
idP Pacient,
idL Lekar,
MIN(poplatok) 'Minimálny poplatok',
MAX(poplatok) 'Maximálny poplatok',
COUNT(poplatok) 'Počet poplatkov',
SUM(poplatok) 'Suma poplatkov',
AVG(poplatok) 'Priemer poplatkov',
FROM navstevy
GROUP BY idP, idL
ORDER By idP, idL;
-- alebo
SELECT
idP Pacient,
idL Lekar,
MIN(poplatok) 'Minimálny poplatok',
MAX(poplatok) 'Maximálny poplatok',
COUNT(poplatok) 'Počet poplatkov',
SUM(poplatok) 'Suma poplatkov',
AVG(poplatok) 'Priemer poplatkov',
FROM navstevy
GROUP BY idL, idP
ORDER By idP, idL;
Zobrazte mininimálny, maximálny, počet, sumu a priemerný poplatok pacientov u jednotlivých lekárov. Zobrazte meno pacienta a meno lekára.
-- Informacie o poplatkoch pacientov u lekarov s menami pacientov a lekarov
SELECT
P.krstne Pacient,
L.krstne Lekar,
MIN(poplatok) 'Minimálny poplatok',
MAX(poplatok) 'Maximálny poplatok',
COUNT(poplatok) 'Počet poplatkov',
SUM(poplatok) 'Suma poplatkov',
AVG(poplatok) 'Priemer poplatkov',
FROM navstevy N
JOIN pacienti P ON P.idP = N.idP
JOIN lekari L ON L.idL = N.idL
GROUP BY N.idP, P.krstne, N.idL, L.krstne -- co ak sa dvaja pacienti/lekari volaju rovnako?
ORDER By N.idP, N.idL;
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;
Dostali ste za úlohu navrhnúť databázovú štruktúru na sprevádzkovanie eshopu.
Navrhnite vhodnú databázovú štruktúru na sprevádzkovanie eshopu.
INSERT, INSERT INTO SELECT, UPDATE, DELETE
ALTER TABLE
ADD | ALTER | DROP | CHANGE | MODIFY | RENAME COLUMN
ADD | ALTER | DROP [CONSTRAINT [symbol]] PRIMARY KEY | UNIQUE | FOREIGN KEY | CHECK
ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
-- vypnutie safe modu, aby sa dalo aktualizovat/mazat podla lubovolnej podmienky
SET SQL_SAFE_UPDATES = 0;
-- zapnutie safe modu, aby sa dalo aktualizovat/mazat len podla kluca
SET SQL_SAFE_UPDATES = 1;
UNION
INTERSECT
EXCEPT
=, >, <, >=, <=, <>, !=
IN, NOT IN
ANY, SOME
ALL
EXISTS, NOT EXISTS
Importnite si databázu množiny a zoznámte sa s jej štruktúrou. Zobrazte výsledky zjednotenia tabuliek a a b.
USE mnoziny;
-- Zjednotenie bez opakovania
SELECT x, y FROM a
UNION -- Zjednotenie bez opakovania
SELECT x, y FROM b;
Zobrazte výsledky zjednotenia tabuliek a a b tak, aby sa riadky mohli opakovať.
USE mnoziny;
-- Zjednotenie s opakovanim
SELECT x, y FROM a
UNION ALL -- Zjednotenie s opakovanim
SELECT x, y FROM b;
Zobrazte výsledky prieniku tabuliek a a b.
USE mnoziny;
-- Prienik
-- Prienik pomocou INTERSECT (od verzie 8.0.31)
SELECT x, y FROM a
INTERSECT
SELECT x, y FROM b;
-- Prienik pomocou INTERSECT (od verzie 8.0.31)
TABLE a INTERSECT TABLE b;
-- Prienik pomocou IN
SELECT x, y
FROM a
WHERE (x, y) IN (SELECT x, y FROM b);
-- Prienik pomocou ANY
SELECT x, y
FROM a
WHERE (x, y) = ANY (SELECT x, y FROM b);
-- Prienik pomocou SOME
SELECT x, y
FROM a
WHERE (x, y) = SOME (SELECT x, y FROM b);
-- Prienik pomocou EXISTS
SELECT x, y
FROM a
WHERE EXISTS (SELECT * FROM b WHERE b.x = a.x AND b.y = a.y);
-- Prienik pomocou INNER JOIN
SELECT a.x, a.y
FROM a
JOIN b ON b.x = a.x AND b.y = a.y;
-- Prienik pomocou INNER JOIN
SELECT DISTINCT a.x AS x, a.y AS y
FROM a
INNER JOIN b USING (x,y);
-- Prienik pomocou NATURAL JOIN
SELECT x, y
FROM a
NATURAL JOIN b;
Zobrazte výsledky rozdielu tabuliek a a b.
USE mnoziny;
-- Rozdiel
-- Rozdiel pomocou EXCEPT (od verzie 8.0.31)
SELECT x, y FROM a
EXCEPT
SELECT x, y FROM b;
-- Rozdiel pomocou EXCEPT (od verzie 8.0.31)
TABLE a EXCEPT TABLE b;
-- Rozdiel pomocou NOT IN
SELECT x, y
FROM a
WHERE (x, y) NOT IN (SELECT x, y FROM b);
-- Rozdiel pomocou ALL
SELECT x, y
FROM a
WHERE (x, y) <> ALL (SELECT x, y FROM b);
-- Rozdiel pomocou NOT EXISTS
SELECT x, y
FROM a
WHERE NOT EXISTS (SELECT * FROM b WHERE b.x = a.x AND b.y = a.y);
-- Rozdiel pomocou LEFT OUTER JOIN
SELECT a.x, a.y
FROM a
LEFT OUTER JOIN b ON b.x = a.x AND b.y = a.y
WHERE b.x IS NULL;
-- Rozdiel pomocou LEFT OUTER JOIN
SELECT DISTINCT a.x AS x, a.y AS y
FROM a
LEFT OUTER JOIN b USING (x,y)
WHERE b.x IS NULL;
Z databázy Poliklinika zobrazte všetky mená pacientov a lekárov. Mená sa môžu opakovať. Výsledok zoraďte lexikograficky.
USE poliklinika;
SELECT krstne FROM pacienti
UNION ALL
SELECT krstne FROM lekari
ORDER BY krstne;
Zobrazte všetky mená pacientov a lekárov tak, aby sa mená neopakovali. Výsledok zoraďte lexikograficky.
SELECT krstne FROM pacienti
UNION
SELECT krstne FROM lekari
ORDER BY krstne;
Zobrazte rovnaké mená pacientov a lekárov. Výsledok zoraďte lexikograficky.
-- Prienik
-- Prienik pomocou INTERSECT (od verzie 8.0.31)
SELECT krstne FROM pacienti
INTERSECT
SELECT krstne FROM lekari
ORDER BY krstne;
-- Prienik pomocou IN
SELECT krstne
FROM pacienti
WHERE krstne IN (SELECT krstne FROM lekari)
ORDER BY krstne;
-- Prienik pomocou ANY
SELECT krstne
FROM pacienti
WHERE krstne = ANY (SELECT krstne FROM lekari)
ORDER BY krstne;
-- Prienik pomocou SOME
SELECT krstne
FROM pacienti
WHERE krstne = SOME (SELECT krstne FROM lekari)
ORDER BY krstne;
-- Prienik pomocou EXISTS
SELECT krstne
FROM pacienti
WHERE EXISTS (SELECT krstne FROM lekari WHERE lekari.krstne = pacienti.krstne)
ORDER BY krstne;
-- Prienik pomocou CROSS JOIN
SELECT p.krstne
FROM pacienti p, lekari l
WHERE p.krstne = l.krstne
-- Prienik pomocou CROSS JOIN
SELECT p.krstne
FROM pacienti p CROSS JOIN lekari l
WHERE p.krstne = l.krstne
-- Prienik pomocou JOIN
SELECT p.krstne
FROM pacienti p JOIN lekari l ON p.krstne = l.krstne
Zobrazte len mená lekárov, ktorých mená neobsahujú mená pacientov. Výsledok zoraďte lexikograficky.
-- Rozdiel
-- Rozdiel pomocou EXCEPT (od verzie 8.0.31)
SELECT krstne FROM lekari
EXCEPT
SELECT krstne FROM pacienti
ORDER BY krstne;
-- Rozdiel pomocou NOT IN
SELECT krstne
FROM lekari
WHERE krstne NOT IN (SELECT krstne FROM pacienti)
ORDER BY krstne;
-- Rozdiel pomocou ALL
SELECT krstne
FROM lekari
WHERE krstne <> ALL (SELECT krstne FROM pacienti)
ORDER BY krstne;
-- Rozdiel pomocou NOT EXISTS
SELECT krstne
FROM lekari
WHERE NOT EXISTS (SELECT krstne FROM pacienti WHERE pacienti.krstne = lekari.krstne)
ORDER BY krstne;
-- Rozdiel pomocou LEFT OUTER JOIN
SELECT p.krstne
FROM pacienti p
LEFT OUTER JOIN lekari l ON p.krstne = l.krstne
WHERE l.idL IS NULL;
Pridajte stĺpec poradie k pacientom, kde tento stĺpec bude reprezentovať lexikografické poradie krstných mien v abecede.
SELECT
(SELECT COUNT(*) + 1 from pacienti x WHERE x.krstne < p.krstne) poradie,
p.*
FROM pacienti p;
Zobrazte rôzne krstné pacientov, ktorí navštívili daného lekára viac ako raz.
SELECT DISTINCT p.krstne FROM
(
SELECT idP, idL, COUNT(*) pocet
FROM navstevy
GROUP BY idP, idL
) as T -- alias stlpca je potrebny
JOIN pacienti p ON p.idP = T.idP
WHERE T.pocet > 1;
Nájdite údaje o pacientoch, ktorí májú druhý najmenší mesačný príjem.
-- Pomocou MIN
SELECT
p.*
FROM
pacienti p
WHERE
p.mesPrijem =
(
SELECT
MIN(p2.mesPrijem)
FROM
pacienti p2
WHERE
p2.mesPrijem >
(
SELECT
MIN(p1.mesPrijem)
FROM
pacienti p1
WHERE
p1.mesPrijem IS NOT NULL
)
);
-- Pomocou ALL
SELECT
T.*
FROM
(
SELECT p3.* FROM pacienti p3
WHERE p3.mesPrijem >
(
SELECT p2.mesPrijem FROM Pacienti p2
WHERE p2.mesPrijem <= ALL
(
SELECT p1.mesPrijem FROM Pacienti p1
WHERE p1.mesPrijem IS NOT NULL
)
)
) T
WHERE
T.mesPrijem <= ALL
(
SELECT p3.mesPrijem FROM Pacienti p3 -- 7
WHERE p3.mesPrijem >
(
SELECT p2.mesPrijem FROM Pacienti p2 -- 1
WHERE p2.mesPrijem <= ALL
(
SELECT p1.mesPrijem FROM Pacienti p1 -- 8
WHERE p1.mesPrijem IS NOT NULL
)
)
);
SHOW, INFORMATION_SCHEMA
ROLLUP
, CUBE
TEMPORARY TABLE
TRUNCATE TABLE
GENERATED ALWAYS
INSERT IGNORE INTO
REPLACE [INTO]
CHARACTER SET, COLLATION, COLLATE
MyISAM, InnoDB, MERGE, MEMORY (HEAP), ARCHIVE, CSV, FEDERATED
Zistite koľko zarobili jednotliví lekári. Vo výsledku chceme vidieť aj koľko zarobili dokopy.
SELECT
CASE WHEN l.krstne IS NULL THEN 'Spolu' ELSE l.krstne END krstne,
SUM(n.poplatok) as prijem
FROM navstevy n
JOIN lekari l ON l.idL = n.idL
GROUP BY l.krstne
WITH ROLLUP;