Webchat IRC #linuxon
Nedeľa, 5. február 2012 Meniny majú: Dnes: Agáta Zajtra: Dorota
Slovak English French German Hungarian Polish Romanian Russian Spanish

LinuxON.sk - Blogy

Font Size

Screen

Nastavenia

SQL časť: 2.

  • PDF

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

 

Posledná zmena v Piatok, 19 Február 2010 00:19

Navigácia Blogy Janico SQL časť: 2.
Internetový portál pre užívateľov, fanúšikov, záujemcov operačného systému linux a voľne šíriteľného softvéru. Viac... | Podporte nas... | Reklama
 Hostia: 211