Adatbázisok 9. gyakorlat SQL: SELECT 2015. október 26. 2015. október 26. Adatbázisok 1 / 14
SQL SELECT Lekérdezésre a SELECT utasítás szolgál, mely egy vagy több adattáblából egy eredménytáblát állít el Szintaxis: SELECT [DISTINCT] oszloplista FROM táblanévlista [WHERE feltétel]; Ha a SELECT utáni oszloplista helyére *-ot írunk, akkor az összes oszlop értéke lesz lekérdezhet A FROM utáni táblanév listában több tábla is szerepelhet, ilyenkor ezek Descartes-szorzata képz dik WHERE feltétellel a számunkra relevánsak kiválasztása 2015. október 26. Adatbázisok 2 / 14
SQL SELECT Kib vített szintaxis: SELECT [DISTINCT] oszlop 1,..., oszlop n FROM tábla 1,..., tábla n [WHERE feltétel] [GROUP BY oszlop 1,..., oszlop n ] [HAVING feltétel] [ORDER BY oszlop 1,..., oszlop n ] 2015. október 26. Adatbázisok 3 / 14
El z órai példa módosítása CREATE TABLE Osztaly( osztalykod INT(3) PRIMARY KEY, osztalynev CHAR(20), vezadoszam DECIMAL(10) ); CREATE TABLE Dolgozo( adoszam DECIMAL(10) PRIMARY KEY, nev CHAR(30), lakcim CHAR(40) DEFAULT 'ismeretlen', zetes INT(6), osztalykod INT(3) REFERENCES Osztaly(osztalykod) ); 2015. október 26. Adatbázisok 4 / 14
Példák Legegyszer bb SELECT utasítás egy tábla teljes tartalmának lekérdezése: SELECT * FROM Dolgozo; Ha csak bizonyos adatokra vagyunk kíváncsiak (adószám, név, zetés): SELECT adoszam, nev, zetes FROM Dolgozo; A WHERE feltétel megadásával a sorokra adhatunk meg sz rési feltételeket Pl.: az összes 50000 forintnál nagyobb zetés dolgozók nevének kilistázása SELECT DISTINCT nev FROM Dolgozo WHERE zetes > 50000; DISTINCT - az azonos sorok közül csak egyet jelenít meg 2015. október 26. Adatbázisok 5 / 14
Függvények Összesít függvények COUNT (oszlop): sorok számát adja vissza (oszlop helyett * is szerepelhet, ilyenkor nem lehet DISTINCT) SUM (oszlop): adott oszlopban szerepl értékek összegét adja vissza MIN (oszlop): adott oszlopban szerepl értékek minimumát adja vissza MAX (oszlop): adott oszlopban szerepl értékek maximumát adja vissza AVG (oszlop): adott oszlopban szerepl értékek átlagát adja vissza Az oszlopnév el tt szerepelhet a DISTINCT kulcsszó 2015. október 26. Adatbázisok 6 / 14
Példák Dolgozók számának lekérdezése SELECT COUNT(*) FROM Dolgozo; Hány osztályon vannak dolgozók? SELECT COUNT(DISTINCT osztkod) FROM Dolgozo; A dolgozók átlagzetése SELECT AVG(zetes) FROM Dolgozo; A dolgozók zetésének összege SELECT SUM(zetes) FROM Dolgozo; 2015. október 26. Adatbázisok 7 / 14
Függvények Logikai függvények: AND - és kapcsolat OR - vagy kapcsolat NOT - negáció, tagadás Speciális logikai függvények: x IS NULL - igaz, ha az x mez értéke NULL x BETWEEN a AND b - igaz, ha a x b x IN halmaz - igaz, ha x megegyezik a halmaz egy elemével x LIKE minta - igaz, ha az x karaktersorozat megfelel a megadott mintának _ : egy tetsz leges karakter % : tetsz leges szám tetsz leges karakter 2015. október 26. Adatbázisok 8 / 14
Példák Az 50000 és 70000 forint között keres k dolgozók neve SELECT DISTINCT nev FROM Dolgozo WHERE zetes BETWEEN 50000 AND 70000; Az 1-es, 2-es vagy 5-ös osztályon dolgozók nevei SELECT DISTINCT nev FROM Dolgozo WHERE osztkod IN(1, 2, 5); Az összes "M" bet vel kezd d dolgozó kilistázása, akinek a nevében a harmadik bet "r" bet SELECT DISTINCT nev FROM Dolgozo WHERE nev LIKE 'M_r%'; 2015. október 26. Adatbázisok 9 / 14
Összesítés, csoportosítás A tábla sorainak oszloponkénti összesítésére a GROUP BY oszloplista parancs szolgál Egy csoportba azon sorok tartaóoznak, melyeknél az oszloplista értéke azonos Pl.: Dolgozó táblában osztályonkénti átlagzetés SELECT osztkod, AVG(zetes) FROM Dolgozo GROUP BY osztkod; A SELECT után az összesít függvényen kívül csak olyan oszlopnév feltüntetésének van értelme, amely a GROUP BY-ban is szerepel A GROUP BY által leképezett csoportok között a HAVING feltétel alparancs segítségével válogathatunk 2015. október 26. Adatbázisok 10 / 14
Példa Kérdezzük le, hogy hány dolgozó van az egyes osztályokon, listázzuk ki az osztály kódját és mellé az osztályon dolgozók számát! Csak azon osztályokat jelenítsük meg, amelyeken legalább 2 ember dolgozik! SELECT osztkod, COUNT(adoszam) AS dolgozok_szama FROM Dolgozo GROUP BY osztkod HAVING dolgozok_szama 2; 2015. október 26. Adatbázisok 11 / 14
Rendezés Az eredménytábla sorait rendezhetjük az ORDER BY segítségével Alapértelmezés szerint a rendezés növekv sorrendben történik (ASC), ha fordítva szerenénk, akkor a DESC kulcsszó írandó a megfelel oszlopnév után Pl.: Dolgozók és zetéseik listája az osztálykódok növekv, ezen belül a zetések csökken sorrendjében: SELECT osztkod, nev, zetes FROM Dolgozo ORDER BY osztkod, zetes DESC; 2015. október 26. Adatbázisok 12 / 14
Két tábla összekapcsolása Tfh. a dolgozók listáját úgy szeretnénk kiíratni, hogy ne az osztálykód szerepeljen a dolgozó adatai mellett, hanem az osztály neve SELECT adoszam, nev, lakcim, zetes, osztalynev FROM Dolgozo, Osztaly WHERE Dolgozo.osztkod = Osztaly.osztalykod; A táblák Descartes szorzatából csak azok a sorok maradnak meg, amelyek kapcsolódnak Ezt természetes összekapcsolásnak/bels összekapcsolásnak (natural join/inner join) nevezzük SELECT adoszam, nev, lakcim, zetes, osztalynev FROM Osztaly INNER JOIN Dolgozo ON Dolgozo.osztkod = Osztaly.osztalykod; 2015. október 26. Adatbázisok 13 / 14
Továbbfejlesztett példa Kérdezzük le, hogy hány dolgozó van az egyes osztályokon, listázzuk ki az osztály nevét és mellé az adott osztályon dolgozók számát! Csak azokat az osztályokat jelenítsük meg, amelyeken legalább 2 ember dolgozik! SELECT osztalynev, COUNT(adoszam) AS dolgozok_szama FROM Dolgozo, Osztaly WHERE Dolgozo.osztkod = Osztaly.osztalykod GROUP BY osztkod HAVING dolgozok_szama 2; 2015. október 26. Adatbázisok 14 / 14