210 likes | 324 Views
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
E N D
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
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áru.%) • _: 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 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?
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 );