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] oszlop1 , ..., oszlopn FROM tábla1 , ..., táblan [WHERE feltétel] [GROUP BY oszlop1 , ..., oszlopn ] [HAVING feltétel] [ORDER BY oszlop1 , ..., oszlopn ]
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 osz-
loplista 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 osz-
lopné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 osz-
tá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, lis-
tá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