Vitam Vas na pokracovani SQL. V prvej casti sme si ukazali zakladne prikazy pre vytvorenie tabulky, pracu s tabulkou, insertovanie a selektovanie. V dnesnej casti sa dozviete o rozsireni SQL(Advanced), Select - Join, vnorene selekty atd. Budem pokracovat v trende, ze prikazy ukazem na prikladoch.
Advanced SQL
SQL Join
Spolocne stlpce v spojenych tabulkach v relacii 1:N su zvycajne primarny kluc dominantnej tabulky a cudzi kluc zavislej tabulky.
JOIN v jazyku SQL vytvara sucin tabuliek podobne ako ciarka v predchadzajucich pripadoch. Prikaz JOIN je casto zviazany s dodatocnou podmienkou - s podmienkou spojenia tabuliek. Ak podmienka vyjadruje rovnost hodnot z dvoch stlpcov z dvoch tabuliek, takyto JOIN sa nazyva prirodzeny JOIN (natural join).
Spajanie JOIN sa deli do styroch skupin:
- vnutorne spojenie (INNER JOIN)
- vonkajsie spojenie (OUTER JOIN) - može byt lave (LEFT JOIN / LEFT OUTER JOIN) alebo prave (RIGHT JOIN / RIGHT OUTER JOIN)
- krizove spojenie (CROSS JOIN)
- uplne spojenie (FULL JOIN)
Majme tabulku Projekt a tabulku Skola. Tabulka Projek obsahuje cudzi kluc z tabulky Skola.
Mozme zapisat JOIN takto: SELECT * FROM Projekt,Skola;
alebo : SELECT * FROM Projekt JOIN Skola;
Priklad:
SELECT Skola.NazovSkoly, Skola.IDSkola, Projekt.CisloNavrhu, Projekt.Nazov
FROM Projekt JOIN Skola
WHERE Projekt.IDSkola = Skola.IDSkola
Z tabulky Skola nam vyselektuje stlpce NazovSkoly, IDskola a z tabulky Projekt vyselektuje stlpce CisloNavrhu a Nazov, kde spolocny stplec tabuliek je IDSkola.
Synonyma
Priklad:
SELECT S.NazovSkoly, S.IDSkola, P.CisloNavrhu, P.Nazov
FROM Projekt P, Skola S
WHERE P.IDSkola = S.IDSkola
Projekt sme nahradili synonymom P a tabulku Skola synonymom S, ktore su zadefinovane z klauzule FROM.
Outer Join
Ako vyselektovat vsetky udaje, ked zavisla tabulka neobsahuje vsetky zaznamy?
Majme dve tabulky: Osoba a Zamestnanie (1 : N), ktore maju spolocny stlpec RC(nejake identifikacne cislo osoby).
RC Meno Priezvisko
1 Jan Durec
2 Ivan Michalik
3 Michal Vlasak
PC Názov RC
1 LinuxON 1
2 ABCsro 2
Ak napiseme:
Select Priezvisko, Nazov From Osoba, Zamestnanie
Where Osoba.RC = Zamestnanie.RC
tak nebude vyselektovany vo vyslednej mnozine udaj o Vlasakovi.
Pre SRBD Oracle mozeme pouzit nasledovnu syntax:
Select Priezvisko, Nazov
From Osoba, Zamestnanie,
Where Osoba.RC = Zamestnanie.RC (+)
Zamestnanie.RC (+) sposobi, ze data zo Zamestnania sa objavia vo vysledku aj ked neobsahuju korespondujuce udaje.
Distinct
select Distinct Meno
from Osoba , Zamestnanie
where Osoba.RC = Zamestnanie.RC
Distinct sposobuje zamedzenie duplicitny chriadkov vo vysledkovej množine.
Viacnasobny Join
Priklad: Mame tri tabulky Komponenty, Zariadenie a Kontrola. V klauzule FROM su pridelene synonyma.
SELECT Distinct Ko.IDKontrola, Ko.CisloKontroly, Ko.Kontrola,K.VyrobneCislo
FROM Komponenty K, Zariadenie Z, Kontrola Ko
Where K.IDKomponenty = Ko.IDKomponenty AND Z.IDZariadenie = Ko.IDZariadenie
Kazdy par tabuliek vyzaduje spojenie (cez ” = “) vklauzule Where (primarne kluce oproti cudzim).
Vnorene Selekty
Priklad1:
SELECT IDProjekt, CisloNavrhu, Nazov, DlzkaTrvania
FROM Projekt
WHERE IDSkola = (SELECT IDSkola From Skola
WHERE NazovSkoly = ‘STU’)
Vnoreny selekt sa nachadza v zatvorke. Vysledkom vnoreneho selektu v tomto pripade musi byt iba jedna vysledna hodnota (IDSkola)!
Priklad2:
SELECT CUSTOMER_NAME FROM CUSTOMER_T
WHERE CUSTOMER_ID IN
(SELECT DISTINCT CUSTOMER_ID FROM ORDER_T);
Operator IN testuje, ci hodnota CUSTOMER_ID daneho riadku je zahrnuta vo vyslednom zozname vnoreneho selektu.
V tomto pripade moze byt vysledna mnozina vnoreneho selektu viac ako jeden udaj.
Priklad3:
Ked chceme vypisat vsetkych zamestnancov, ktory boli v minulosti trestani:
SELECT RC, Meno, Priezvisko
FROM Zamestnanec
WHERE EXISTS
( SELECT * FROM Trest
WHERE Zamestnanec.RC = Trest.RC );
Zabezpecenie transakcnej integrity
- Transakcia je sekvencia operacii s ktorou sa zaobchadza ako s jednym celkom
-Moze zahrnat viacnasobne inserty, update, delete
-Ak sa akykolvek prikaz nevykona, tak sa zrusi cela transakcia
- SQL prikazy pre transakcie:
-BEGIN TRANSACTION/END TRANSACTION :Oznacuju hranice transakcie
-COMMIT: Potvrdzuje vsetky zmeny
-ROLLBACK: Rusi vsetky prikazy po posledny Commit





