3.GYAKORLAT (ADATBÁZISOK)
Témakör:
Több
táblás
lekérdezések relációs
algebrában és SQL-ben,
ekvivalens
átírások alap rel.algebrai
kifejezések <=> és SQL SELECT
-- Megjegyzés:
Relációs algebrában
használhatunk
segédváltozókat, aminek
az SQL-ben inline nézetet
használunk vagyis FROM listán (SFW) temp_tabla
(itt a rövidítés:
SFW = SELECT ... FROM ...
WHERE ... utasítás)
-- SQL-ben halmazműveleteket azonos
típusú lekérdezések
között
végezzük!
Miben különbözik
a halmazműveletek
halmaz és multihalmaz szemantikája?
>> Oracle DB SQL
példák: SQL04_set_operators.pdf;
>> Oracle DB SQL Lang.Ref.
>> 4.Op. >> Set Operators (halmazműv.)
(A fenti demo
lekérdezésekhez volt: createHRsyn.txt szinonimák)
-- SQL SELECT utasítás FROM listán
táblák direkt szorzata,
összekapcsolása
>> Oracle DB SQL
példák: SQL07_osszekapcsolas.pdf
>> Oracle DB SQL Lang.Ref
>> Joins (Self Joins, Inner Joins, Outer Joins)
I.RÉSZ: Átírás alap rel.algebrai kifejezés
<=> SQL (1., 2.gyak.folyt.)
-- Gyakorlat példái: Szeret (nev,
gyumolcs) sémájú
tábla létrehozása:
Oracle AB-ban SQL: createSzeret.txt
és Relax-ban: Relax_Szeret.txt
Szeret (nev,
gyumolcs) tábla sok-sok kapcsolatot ír le, azaz
egy vevő
több
gyümölcsöt is szerethet és egy
gyümölcsöt több vevő is szerethet.
SQL lekérdezésekben a
halmazműveletek használata:
- Fontos! Az SQL-ben a halmazműveleteket nem
táblákra, hanem
- SFW
lekérdezésekre alkalmazzuk (azonos
dimenzió, kompatibilis típus)
- Alapértelmezésben
halmazként
értelmezve:
duplikációk
nélkül
- "ALL"
kiegészítőszóval multihalmazként értelmezve (multiplicitás)
SFW
{UNION
[ALL]| MINUS | INTERSECT }
SFW
Feladatok:
-- A korábbi
relációs algebrai
feladatokat írjuk át SELECT
utasításra!
- volt Rel.alg.1.rész:
egy
táblára vonatkozó
lekérdezések, +halmazműveletek
1. Kik szeretik az almát?
2. Kik nem szeretik az almát? (de valami
mást igen)
3. Kik szeretik vagy az almát vagy a
körtét?
4. Kik szeretik az almát is és a
körtét is?
5. Kik azok, akik szeretik az almát, de nem
szeretik a körtét?
6. Kik szeretik vagy az almát vagy a
körtét, de csak az egyiket?
- volt Rel.alg.2.rész:
Tábla átnevezése,
önmagával vett direkt szorzata
- Feladatok direkt szorzatra
(táblákkal,
összesítő függvények
nélkül)
7. Kik szeretnek legalább
kétféle gyümölcsöt?
(direkt szorzattal)
8. Kik szeretnek legalább
háromféle
gyümölcsöt?
9. Kik szeretnek legfeljebb kétféle
gyümölcsöt?
10. Kik szeretnek pontosan kétféle
gyümölcsöt?
- új Rel.alg.3.rész:
Hányados
(minden
kifejezése) rel.algebrában -> SQL-ben
11. Kik szeretnek minden gyümölcsöt?
(Kik szeretik az összes olyan
gyümölcsöt, amit valaki szeret?)
12. Kik azok, akik legalább azokat a
gyümölcsöket szeretik, mint
Micimackó?
13. Kik azok, akik legfeljebb azokat a
gyümölcsöket szeretik, mint
Micimackó?
14. Kik azok, akik pontosan azokat a
gyümölcsöket szeretik, mint
Micimackó?
II.RÉSZ Több
táblás
lekérdezések SQL-ben és
relációs
algebrában
-- 1.rész: Egy
táblás lekérdezések,
és a halmazműveletek, lásd fent 1-6.f.;
-- 2.rész: Tábla
átnevezése, önmagával vett
direkt szorzata, lásd fent 7-10.f.;
- 3.rész:
Hányados -> átír SQL-be, lásd fent 11-14.f. (folyt.5.gyak.SQL több mo is)
-- 4.rész: Több
táblás lekérdezések, direkt
szorzat, természetes összekapcsolás,
és az "Elhagyásos"
típusú feladatok, pl. max/min
kifejezése alap rel.algebrában:
Rel.alg.4.rész
feladataihoz táblák relax-ban Dolgozo, Osztaly: Relax_Dolg_Oszt.txt
-- Gyakorlat
példái: Dolgozo, Osztaly, Fiz_Kategoria
táblák Oracle AB: createDolg.txt
Itt a Dolgozo és Osztaly
közötti dolg(dkod,
oazon) kapcsolat sok-egy kapcsolat,
azaz egy dolgozo nem dolgozhat több
osztályon, legfeljebb csak egy osztályon,
(ha tudjuk, hogy a dolgozó melyik
osztályon dolgozik, akkor az egyértelmű).
Hasonlóan két Dolgozo
közötti fonok(dkod, fonoke)
kapcsolat is ilyen sok-egy
kapcsolat. A sok-egy kapcsolatokat
leíró
táblák beolvadtak a Dolgozo
táblába.
Osztaly (oazon,
onev,
telephely)
Dolgozo (dkod,
dnev, foglalkozas,
fonoke, belepes, fizetes, jutalek, oazon)
Fiz_Kategoria (kategoria,
also, felso) -- táblázat a fizetési
sávokat adja meg
Rövid emlékeztető:
>> Szorzások,
összekapcsolások a FROM listán
(rövid összefoglaló)
-- Direkt szorzat: SELECT * FROM dolgozo, osztaly;
SELECT *|{[DISTINCT]
oszlopnév|kifejezés
[másodnév],...}
FROM táblanév
[[sorváltozó], táblanév [sorváltozó],
... ]
[WHERE feltétel]
[ORDER
BY {oszlopnév [DESC], ...}];
-- Természetes
összekapcsolás és az inner join
összehasonlítása:
SELECT dkod, dnev, oazon, onev FROM
dolgozo NATURAL JOIN
osztaly;
SELECT dkod, dnev, dolgozo.oazon, onev
FROM
dolgozo, osztaly
WHERE
dolgozo.oazon=osztaly.oazon;
SELECT dkod, dnev,
dolgozo.oazon, onev FROM dolgozo JOIN osztaly
ON
dolgozo.oazon=osztaly.oazon;
SELECT tábla1.oszlop,
tábla2.oszlop
FROM
tábla1
[NATURAL JOIN tábla2] |
[JOIN tábla2 USING
(oszlopnév)] |
[JOIN tábla2
ON
(tábla1.oszlopnév =
tábla2.oszlopnév)]
[CROSS JOIN tábla2]
-- Theta-join:
SELECT * FROM dolgozo JOIN
fiz_kategoria ON fizetes BETWEEN also and felso;
SELECT * FROM dolgozo JOIN
fiz_kategoria ON fizetes >= also and fizetes <=
felso;
-- Később 5.gyakorlaton
folyt. külső
joinok ([LEFT | RIGHT | FULL] OUTER JOIN)
és
az
alkérdések
témakörben is nézünk
további példákat
szemijoinra, antijoinra.
Feladatok:
-- Fejezzük ki alap relációs algebrai
kifejezésekkel, majd írjuk át SQL-be!
-- cross join (selfjoin - tábla
önmagával vett direkt szorzata)
1. Kik azok a dolgozók, akiknek a
főnöke KING? (dkod, dnev, fizetes)
2. Kik azok a dolgozók, akik
főnökének a főnöke KING?
3. Adjuk meg azokat a dolgozókat, akik
többet keresnek a főnöküknél.
-- natural join és theta join
összevetése (más az oazon oszlopra
való
hivatkozás)
4. Kik azok a dolgozók, akik
osztályának telephelye DALLAS vagy CHICAGO?
5. Kik azok a dolgozók, akik
osztályának telephelye nem DALLAS és
nem
CHICAGO?
-- maximum kifejezése függvények
nélkül, csak egyszerű tábla műveletekkel
6. Kik azok a dolgozók, akiknek a
legmagasabb a fizetésük, itt a
lekérdezést
alap
relációs
algebrai kifejezésként írjuk
fel, azaz nem használható rendezés,
nem használhatóak
függvények,
és a sigma kiválasztási
feltételben
nem lehet
lekérdezés/tábla,
hanem csak elemi
összehasonlítások (=, !=, <,
<=, >, >=) és
not, and
és or logikai műveletek szerepelhetnek csak a
kiválasztási feltételben!
-- További feladatokat írjuk fel
relációs algebrában is SQL SELECT
utasítással is!
7. Kik azok a dolgozók, akiknek van
2000-nél nagyobb fizetésű beosztottja.
8. Kik azok a dolgozók, akiknek nincs
2000-nél nagyobb fizetésű beosztottja.
9. Mely telephelyeken van elemző (ANALYST)
foglalkozású dolgozó.
10. Mely telephelyeken nincs elemző (ANALYST)
foglalkozású dolgozó.
11. Adjuk meg azon osztályok
nevét
és
telephelyét, amelyeknek
van 1-es
fizetési kategóriájú
dolgozója.
12. Adjuk meg azon osztályok nevét
és
telephelyét, amelyeknek
nincs 1-es
fizetési
kategóriájú dolgozója.
H.F.
A Tankönyvből további
feladatok lekérdezésekre (Rel.alg.
<=> SQL)
>> További
gyakorló feladatok a Tankönyv
2.4.szakasz lekérdezési feladatai:
>> create
Termékek -- és a
Tankönyv feladatai: Termékek-feladatok.pdf
>> create
Csatahajók -- és a
Tankönyv feladatai: Csatahajók-feladatok.pdf
-- Itt most olyan megoldásokat
keressünk, amit előbb az alap relációs
algebrai
lekérdezésként adunk
meg, majd ezt átírjuk SQL
lekérdezésekre.
-- Ha a relációs
algebrában segédváltozókat
is
használunk, ahhoz az SQL-ben
most inline
nézeteket, vagyis FROM
listán (alkérdés)
sorváltozó-t
rendelünk.