8.GYAKORLAT
(ADATBÁZISOK)
Nézettáblák,
munkatáblák
létrehozása és használata;
Rekurzió, with
záradék
>> I.RÉSZ
- NÉZETTÁBLÁK,
MUNKATÁBLÁK LÉTREHOZÁSA
ÉS HASZNÁLATA
>> II.RÉSZ
- HIERARCHIKUS, GRÁFOS ADATSZERKEZETEK, WITH
ZÁRADÉK
I.RÉSZ
Nézettáblák
[CREATE OR REPLACE | DROP ] VIEW; WITH
munkatáblák
1.) Egyszerű/összetett
nézettáblák
létrehozása, melyik
módosítható/melyik nem?
Adatok
karbantartása adattáblán
illetve
nézeten
keresztül,
és megfigyelni
ezek
egymásra
hatását: Hogyan hat a nézetek
adatainak
módosítása az
adattáblára,
és a másik
irányban, az
adatok módosítása hogyan
jelenik meg a nézetben?
>> Oracle SQL CREATE VIEW: SQL
Lang.Ref. CREATE VIEW
>>
[ kiegészítés: Oracle
segédanyagok: SQL11_view.pdf ]
2.) Például: Bonyolultabb
lekérdezés
megoldása
nézettáblák
segítségével...
Képezzük
osztályonként az
összfizetést, vegyük ezen
számok
átlagát, és
adjuk meg, hogy mely
osztályokon
nagyobb ennél
az átlagnál az összfizetés.
CREATE OR REPLACE VIEW osztaly_osszfiz
AS
SELECT onev, SUM(fizetes) ossz_fiz
FROM sila.dolgozo d, sila.osztaly o
WHERE d.oazon = o.oazon
GROUP BY onev;
CREATE OR REPLACE VIEW atlag_koltseg
AS
SELECT SUM(ossz_fiz)/COUNT(*) atlag
FROM osztaly_osszfiz;
SELECT * FROM osztaly_osszfiz
WHERE ossz_fiz >
(SELECT atlag FROM
atlag_koltseg);
-- -- -- -- --
3.) Példák WITH
munkatáblák használatára:
- lásd SQL08_alkerdes2.pdf
(16-18.o. példa, uez with-re példa SQL
Lang.Ref.)
- Oracle: SQL Language Reference
>> innen: Subquery
Factoring: Examples
Képezzük
osztályonként az
összfizetést, vegyük ezen
számok
átlagát, és
adjuk meg, hogy mely
osztályokon
nagyobb ennél
az átlagnál az összfizetés.
WITH
osztaly_osszfiz AS (
SELECT onev,
SUM(fizetes)
ossz_fiz
FROM sila.dolgozo
d,
sila.osztaly o
WHERE d.oazon =
o.oazon
GROUP BY onev),
atlag_koltseg AS (
SELECT
SUM(ossz_fiz)/COUNT(*)
atlag
FROM
osztaly_osszfiz)
SELECT * FROM osztaly_osszfiz
WHERE ossz_fiz > (SELECT atlag
FROM
atlag_koltseg);
-- -- -- -- --
>> Önálló
gyakorlásra: Oracle
Példatár Feladatok.pdf
6.fejezet feladatai
II.RÉSZ:
HIERARCHIKUS ADATSZERKEZETEK ÉS GRÁFOK,
REKURZIÓ
1.) Hierarchikus
adatszerkezetek
lekérdezése Oracle-ben: CONNECT BY
>> Oracle: SQL12_hiera_lekerd.pdf;
-- példákhoz: create_hr_synonym.txt
>> Oracle: LiveSQL
Tutorial_HieraQueries.html
>> Oracle
Példatár 3.fej.
Hierarchikus
lekérdezések: peldatar_62-65o.pdf
>> Oracle DB SQL Lang.
Ref. 12.2: Hierarchical
Queries html (Examples)
SQL Hierarchikus
függvények: sys_connect_by_path
html (Examples)
SELECT
... FROM... WHERE ... START WITH ... CONNECT BY PRIOR ...
-- Az Oracle SQL Lang.Ref. 9.fej. SELECT példáit
írjuk át,
lépésenként...
select dkod, dnev, fonoke from dolgozo;
select dkod, dnev, fonoke, level
from dolgozo
start with dkod = 7839 -- 'KING'
--
(select dkod from dolgozo where dnev='KING')
connect by prior dkod = fonoke;
-- Ha a fát felülről-lefelé,
előrefelé járjuk be:
select dkod, dnev, fonoke, level
from dolgozo
start with dkod = 7566 -- 'JONES'
connect by prior dkod = fonoke;
-- Ha a fát alulról felfelé,
visszafelé járjuk be:
select dkod, dnev, fonoke, level
from dolgozo
start with dkod = 7566 -- 'JONES'
connect by prior fonoke = dkod;
-- SQL Lang.Ref. 7.fej. SYS_CONNECT_BY_PATH fv-re való
példát is írjuk át:
select dkod, dnev, fonoke, level,
LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(dnev, '/')
"Útvonal"
from dolgozo
start with dkod = (select dkod
from dolgozo where dnev='KING')
connect by prior dkod = fonoke;
-- -- -- -- --
>> Önálló
gyakorlásra: Oracle
Példatár Feladatok.pdf 3.fejezetben is volt.
-- -- -- -- --
2.)
Gráfok lekérdezése, rekurzió az SQL szabványban: WITH RECURSIVE
Az Eljut-feladat a
Tankönyv
(Ullman-Widom kék
könyv) 10.2 szakaszára épül
Adott Jaratok(legitarsasag,
honnan, hova, koltseg, indulas, erkezes) táblában
repülőjáratok
adatait
tároljuk (honnan-hova várospárok). Azt
keressük, hogy
Dallasból
mely városokba tudunk eljutni
(közvetlenül vagy
egy/több átszállással).
>> Ullman-Widom
tankönyv 10.2 szakasza Eljut-feladat:
korábbiEA/p67_p80.pdf
>> Oracle: SQL Language Reference
>> innen: Recursive
Subquery
Factoring
>> Az Ullman-Widom
Tankönyv szerint (SQL szabvány szerint, csak
papíron)
(konkrét
adatbázis-kezelő rendszerekben eltérő
megvalósítások lehetnek)
WITH RECURSIVE Eljut(honnan, hova) AS
(SELECT honnan, hova FROM Jaratok
UNION
SELECT Eljut.honnan, Jaratok.hova
FROM Eljut, Jaratok
WHERE Eljut.hova = Jaratok.honnan)
SELECT hova FROM Eljut WHERE honnan='DAL';
---
Kérdés: itt miért fontos kiemelni az
UNION (halmaz)
és
UNION
ALL (multihalmaz) közötti
különbséget?
-- -- -- -- --
3.) Az Eljut feladat megvalósítása Oracle-ben WITH
utasítással:
Ezzel a
scripttel jaratok_tabla.txt
készítsünk saját
táblát.
>> Az SQL-99 szabványhoz
képest az eltérések, hogy WITH
RECURSIVE helyett
az Oracle-ben csak WITH,
és a UNION az Oracle-ben nem megy, hanem csak
UNION ALL működik,
és nem-hierarchikus esetben meg kell adni a CYCLE-t
is:
WITH Eljut (honnan, hova) as
(SELECT honnan, hova FROM Jaratok
UNION ALL
SELECT Jaratok.honnan, Eljut.hova
FROM Jaratok, Eljut
WHERE Jaratok.hova=Eljut.honnan
)
SEARCH DEPTH FIRST BY honnan SET SORTING
CYCLE honnan SET is_cycle TO 1 DEFAULT 0
SELECT distinct honnan, hova
FROM Eljut
ORDER BY honnan;
-- -- -- -- --
4.) Az Eljut feladat megvalósítása Oracle-ben CONNECT BY megoldással
Az előző feladat
scripttel jaratok_tabla.txt
készítsünk saját
táblát.
Amíg
nincs kör, a fenti 1.f. szerinti hierarchikus
lekérdezéssel működik
>> Ha kör van a
gráfban, akkor NOCYCLE
kiegészítéssel már
működik
SELECT LPAD(' ',
4*level) || honnan, hova,
level-1 atszallasok,
sys_connect_by_path(honnan||'->'||hova,
'/'),
connect_by_isleaf, connect_by_iscycle
FROM Jaratok
START WITH
honnan = 'SF'
CONNECT BY
NOCYCLE PRIOR hova = honnan;
-- -- -- -- --
5.) További
lehetőségek, érdekességek (nem-tananyag,
opcionális)
>> Reguláris
kifejezések: SQL_regularis_kif.txt;
SQL_regular_exp.pdf
>> Analitikus
függvények: Oracle
Példatár 13.fej.; Tutorial:
Analytic Funct.
-- -- -- -- --
>> KÖV.TÉMA
JÖN 9.-11.gyak. PL/SQL - SQL
progr.nyelvi környezetben használata