10. gyakorlat SQL SELECT
Az SQL matematikai alapjai Relációs algebra: relációs adatbázistáblákon végzett műveletek Fő műveletek: Direkt szorzat Szelekció sorok közt válogat бf(T) – „T” tábla, „f” logikai kifejezés Projekció oszlopok közt válogat πJ(T) – „T” tábla, „J” attribútumlista
Lekérdezés általános alakja Mely táblákból legyen direkt szorzat Mely oszlopok jelennek meg SELECT FROM Logikai kifejezés (mely sorok) WHERE Mi szerint rendezünk ORDER BY GROUP BY Mi szerint csoportosítunk HAVING Csoportok szűrése
Egyszerű SQL lekérdezés SELECT * FROM dolgozo, fizetes; direkt szorzat Dolgozók neveinek és fizetéseinek lekérdezése: SELECT dNev, osszeg FROM dolgozo, fizetes WHERE dolgozo.fizID = fizetes.fizID ORDER BY dNev ASC; dolgozo fizetes dolgozoID dNev fizID 1 Péter 2 Anna 3 Ádám fizID osszeg 1 20000 2 25000
1. Feladat Honlapom: gyak10_sql_sablon.php Előző órán használt adatbázis: áruk, forgalom táblák Kérdezd le az adatbázisban található árukat: csak a nevük jelenjen meg ABC szerint csökkenő sorrendben rendezve! Az előbbi lekérdezést hajtsd végre úgy, hogy ha több ugyanolyan nevű áru van, akkor ugyanaz a név már ne jelenjen meg még egyszer a listában!
Összesítő függvények használata Használatukkor csoportosítást kell alkalmazni minden olyan megjelenő oszlopra, mely nem szerepel az összesítő függvényben Csoportra vonatkozó feltétel a HAVING után adható meg Pl.: SELECT SUM(osszeg) FROM fizetes;
Összesítő függvények AVG() – átlag COUNT() – sorok száma MIN() – legkisebb érték MAX() – legnagyobb érték SUM() – összeg Pl.: SELECT dNev, MIN(osszeg) FROM dolgozo, fizetes WHERE dolgozo.fizID = fizetes.fizID GROUP BY dNev;
2. Feladat Kérdezd le az áruk adatbázisból és jelenítsd meg egy listában az egyes árukat és a belőlük összesen eladott mennyiséget! Csak azokat az árukat kérdezd le az előbbi módon, amikből több mint 20-at eladtak már!
Speciális logikai kifejezések x IS NULL: akkor igaz, ha x értéke NULL x BETWEEN a AND b: akkor igaz, ha a<=x<=b x IN halmaz: akkor igaz, ha x a halmaz egy elemével megegyezik Halmaz explicit megadása: pl. város IN (‘Szeged’, ‘Budapest’, ‘Pécs’) Halmaz megadása allekérdezéssel X = NULL
Speciális logikai kifejezések (folyt.) x relációjel ALL halmaz: igaz, ha x a halmaz minden elemével a megadott relációban van x relációjel ANY halmaz: igaz, ha x a halmaz valamely elemével a megadott relációban van Pl. fizetés < ANY (10000, 20000, 30000) EXISTS halmaz: igaz, ha a halmaz nem üres EXISTS(allekérdezés): igaz, ha az allekérdezés legalább 1 elemet visszaad
Speciális logikai kifejezések (folyt.) x LIKE minta: igaz, ha x illeszkedik az adott mintára %: tetszőleges karaktersorozat (%Vár u.%) _: tetszőleges karakter (_él) NOT x IS NOT NULL x NOT IN halmaz …
Példák speciális logikai kifejezés használatára Mennyi 10000 és 20000 közötti összegű fizetés van: SELECT COUNT(fizID) FROM fizetes WHERE osszeg BETWEEN 10000 AND 20000; Azon dolgozók nevei, amikben a név ‘Anna’-val kezdődik00000: SELECT dNev FROM dolgozo WHERE dNev LIKE ‘Anna%’;
Allekérdezés: mennyi az adott dolgozó eddigi összes kifizetése? dolgtorzs(dkod, dnev, atlagfiz) kifiz(dkod, osszeg, honap) Írassuk ki azon dolgozók neveit, akiknél az összes kifizetett pénz nagyobb, mint 5000! SELECT dnev FROM dolgtorzs WHERE _________ > 5000; Allekérdezés: mennyi az adott dolgozó eddigi összes kifizetése?
Dolgozó kódja, akiről éppen szó van Allekérdezés (folyt.) Adott dolgozó eddigi kifizetésének lekérdezése: SELECT SUM(osszeg) FROM kifiz WHERE kifiz.dkod = _________ A végső megoldás tehát: SELECT dnev FROM dolgtorzs WHERE (SELECT SUM(osszeg) FROM kifiz WHERE kifiz.dkod = dolgtorzs.dkod) > 5000; Dolgozó kódja, akiről éppen szó van
További allekérdezéses feladatok Írassuk ki azon dolgozók neveit, ahol volt 50000-nél nagyobb kifizetés valamelyik hónapban! SELECT dnev FROM dolgtorzs WHERE dolgtorzs.dkod IN ( SELECT kifiz.dkod FROM kifiz WHERE osszeg>50000 ); Megoldható allekérdezés nélkül? Ez az allekérdezés halmazt ad eredményül.
További allekérdezéses feladatok Töröljük ahhoz a dolgozóhoz tartozó rekordot a dolgtorzs táblából, akihez nem tartozik kifizetés a kifiz táblában! DELETE FROM dolgtorzs WHERE NOT EXISTS ( SELECT kifiz.dkod FROM kifiz WHERE kifiz.dkod = dolgtorzs.dkod );
Köszönöm a figyelmet!