5.gyak. Lekérdezések kifejezése kiterjeszett relációs algebrában,
csoportosítás és összesítések 
       
Feladatok: Ezen a gyakorlaton olyan lekérdezéseket fejezük ki SQL-ben, amit
relációs algebrában nem lehet kifejezni, majd bevezetjük a kiterjeszett relációs
algebrát a multihalmazokra, a kiterjesztett vetítést, az ismétlődések megszüntetését,
az összesítési és csoportosítási műveleteket,  valamint a rendezés műveletét.
A papíros feladatoknál (mint ahogy a relációs algebrában volt) ebben a kiterjesztett
relációs algebrában is lineáris jelöléssel és kifejezésfával is írjuk fel a lekérdezéseket.
> A gyakorlat gépes része:
   >> 1.8. Csoportosítás és összesítések az SQL-ben   
> A gyakorlat táblás része:
   >> E3. Kiterjesztett relációs algebra (papíros feladatok)
> Köv.héten: I.ZH + Ehhez előzetes zh infó és mintafeladatsor
   
Előzmények: Az 5.előadásanyaghoz kapcsolódó feladatokat nézünk csoportosításra. 
5.EA: Ullman-Widom: Adatbázisrendszerek. Alapvetés. Második átdolgozott kiadás.
- 5.2. Kiterjesztett műveletek a relációs algebrában [ Kit.rel.algebra ]
- 6.4. Relációkra vonatkozó műveletek [ SQL/4 (csoportosítás) ]
-- OracleSQL_csoportosítás
   
A lekérdezési feladatok megoldásához előbb az alaptáblákat kell létrehoznunk
(aki volt az előző gyakorlatokon, azoknak megvan, aki nem volt, most hozza létre)
1.) Oracle segédanyag példáinak kipróbálása:
- Ehhez előkészítés: HR séma tábláihoz készítsük el a szinonimákat create_synonym
   >> 1.8. Csoportosítás és összesítések az SQL-ben
   >> Kiterjesztett relációs algebra (papíros feladatok)
   
2.) Az órai gyakorlatok feladatai: órai_feladatok
- Dolgozo és Osztaly feladatok: table_dolgozo.txt és a táblák létrehozása create_dolg
           
3.) A példatár feladatai önálló gyakorlásra:
--  Lásd Feladatok.pdf (2.fejezet feladatai) és a táblák létrehozása  cr_dept_emp 
   
1.8. Csoportosítás és összesítések az SQL-ben
   
SELECT column,] group_function(column), ...
FROM   table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
   
Segédanyag: >> OracleSQL_csoportosítás példáit próbáljuk ki!
 
Feladat_1: Adjuk meg osztályonként a dolgozók összfizetését
a hr.employees és hr.departments táblák adatai alapján
(department_name, sum(salary)) formában.
1. Azok az osztályok is jelenjenek meg ahol nem dolgozik senki,
    ott az összfizetés 0 legyen.
2. Ha van olyan dolgozó, akinek nincs osztálya, azokat
    egy 'FIKTIV' nevű osztályon gyűjtsük össze.
3. Csak azokat az osztályokat jelenítsük meg, amelyek nevében
     van 'B' betű, plusz a FIKTIV osztályt.
-- Megoldás/ellenőrzésként: lásd itt

Feladat_2: A szeret táblára vonatkozó relációs algebrai feladatait 
átírtuk SQL SELECT-re. Most a korábbitól eltérő megoldásokat
adjunk (például a COUNT függvény és az alkérdések használatával)
arra, hogy kik azok, akik minden gyümölcsöt szeretnek? 
  

E3. Kiterjesztett relációs algebra
   
Segédanyag: Lekerd  (nézzük meg SQL-ben is + a Külső join  művelet példáit is!)
Az alábbi lekérdezéseket fejezzük ki SQL SELECT-tel, majd írjuk át a lekérdezést
kiterjesztett relációs algebrai operátorokat felhasználó kifejezéssé, majd rajzoljuk fel
a kifejezésfát is.
 - Adjuk meg osztályonként az osztály nevét és az ott dolgozók számát
   a dolgozók száma szerint növekvő sorrendben.
- Adjuk meg azoknak az osztályoknak a nevét, ahol az átlagfizetés nagyobb mint 2000.
- Adjuk meg azoknak a foglalkozásoknak a nevét, amelyek a 10-es és 20-as
  osztályon is  előfordulnak. Ismétlődések ne legyenek a végeredményben.
   
Fejezd ki a lekérdezéseket SQL SELECT-tel és kiterjeszett relációs algebrában!
2.) A gyakorlatok feladatai itt: table_dolgozo.txt
Feladatok az 5.gyakorlatra:
1.8. Csoportosítás, GROUP BY .. HAVING .. záradékok, alkérdések HAVING-ben
- Mekkora a minimális és a maximális fizetés a dolgozók között?
- Kinek a legkisebb a fizetése?
- Kinek a legnagyobb a fizetése?
- Mennyi a dolgozók összfizetése?
- Mennyi a 20-as osztályon az átlagfizetés?
- Adjuk meg, hogy hány különböző foglalkozás fordul elő a dolgozók között!
- Kik azok a dolgozók, és milyen munkakörben dolgoznak, akiknek a legnagyobb
  a fizetésük?
- Adjuk meg osztályonként az átlagfizetést!
- Adjuk meg osztályonként a telephelyet és az átlagfizetést!
- Adjuk meg az osztályonkénti legmagasabb átlagfizetést!
- Adjuk meg azokra az osztályokra az átlagfizetést, ahol ez nagyobb mint 2000.
- Adjuk meg azokra az osztályokra az átlagfizetést, ahol legalább hárman dolgoznak!
- Melyek azok az osztályok, ahol legalább hárman dolgoznak?
- Adjuk meg osztályonként a minimális fizetést, de csak azokat az osztályokét, ahol
  a minimális fizetés nagyobb, mint a 30-as osztályon dolgozók minimális fizetése.
- Adjuk meg osztályonként az ott dolgozó hivatalnokok (FOGLALKOZAS='CLERK')
   átlagfizetését, de csak azokon az osztályokon, ahol legalább két hivatalnok dolgozik!
- Adjuk meg, hogy mely dolgozók fizetése jobb, mint a saját osztályán (ahol dolgozik)
   dolgozók átlagfizetése!
- Adjuk meg, hogy mely dolgozók átlagjövedelme jobb, mint a saját osztályának az
   átlagjövedelme, ahol a jövedelem a fizetés és jutalék összege, ahol nincs jutalék
   megadva, ott a 0 helyettesítő értékkel számoljunk (NVL függvény alkalmazása).
- Adjuk meg, hogy az egyes osztályokon hány ember dolgozik (azt is, ahol 0=senki).
- Adjuk meg osztályonként a dolgozók összfizetését az osztály nevét megjelenítve
   ONEV, SUM(FIZETES) formában, és azok az osztályok is jelenjenek meg ahol
   nem dolgozik senki, ott az összfizetés 0 legyen. Valamint ha van olyan dolgozó,
   akinek nincs megadva, hogy mely osztályon dolgozik, azokat a dolgozókat
   egy 'FIKTIV' nevű osztályon gyűjtsük össze. Minden osztályt a nevével plusz 
   ezt a 'FIKTIV' osztályt is jelenítsük meg az itt dolgozók összfizetésével együtt. 
  

3.) További gyakorló feladatok: Oracle példatár Feladatok.pdf
- 2.fejezet: Csoportosító lekérdezések
        
Vissza az AB1 gyakorlat oldalára             Vissza a Kezdőlapra