ADATBÁZISOK 9-10. gyakorlat: SQL 2. rész SELECT
SELECT utasítás általános alakja SELECT [DISTINCT] oszloplista FROM táblanévlista [WHERE feltétel] [GROUP BY oszloplista [HAVING feltétel] ] [ORDER BY oszloplista]; projekció Descartes-szorzat szelekció csoportonként összevonás csoport-szelekció rendezés DISTINCT: azonos sorokból csak egyet tart meg x DESC: x oszlop szerint csökkenő sorrendbe rendez
SELECT FROM SELECT
SELECT A SELECT utáni oszloplista tetszőleges kifejezéseket is tartalmazhat Az eredménytábla oszlopainak elnevezésére alias nevek is megadhatók Alias név megadása: név AS másodnév (MySQL-ben elhagyható az AS ) Összesítő függvények is használhatók, amelyek egy oszlop értékeiből egyetlen értéket hoznak létre
Összesítő függvények AVG() átlag COUNT() sorok száma MIN() legkisebb érték MAX() legnagyobb érték SUM() összeg
SELECT FROM SELECT WHERE
SELECT FROM SELECT WHERE ORDER BY
WHERE szűrőben használható Relációjelek: <, >, <=, >=, =,!=, <> Logikai műveletek: AND, OR, NOT Speciális logikai kifejezések (lásd következő dia)
Speciális logikai kifejezések x is NULL: x értéke NULL (nem = jellel!) x BETWEEN a AND b: a x b EXISTS lekérdezés: lekérdezés nem üres halmazt ad vissza x IN halmaz: x megegyezik a halmaz egy elemével x LIKE minta: karaktersorozat illeszkedik a mintára % : tetszőleges karaktersorozat _ : tetszőleges karakter NOT NULL, NOT EXISTS, NOT IN,
Példa: zenei adatbázis ELŐADÓ(előadó_kód, név, együttes, együttes_kód, szüldátum) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) SZÁM(lemez_kód, cím, hossz) együttes: 0 szóló előadó, 1 együttes együttes_kód: ha együttes tagja ELŐADÓ egyed előadó_kódja különben NULL (szóló előadó esetén)
Példa (projekció + rendezés) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) Lemezek címe és ára cím szerinti ABC-sorrendben: SELECT cím, ár FROM Lemez ORDER BY cím;
Példa (szelekció) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) 2013-ban kiadott lemezek: SELECT * FROM Lemez WHERE kiadás_éve = 2013;
Példa (természetes összekapcsolás) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) SZÁM(lemez_kód, cím, hossz) Milyen számok vannak a Best Of ABBA albumon? SELECT Szám.cím FROM Szám, Lemez WHERE Lemez.lemez_kód = Szám.lemez_kód AND Lemez.cím = 'Best Of ABBA'
Példa (természetes összekapcsolás) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) SZÁM(lemez_kód, cím, hossz) Milyen számok vannak a Best Of ABBA albumon? SELECT Szám.cím FROM Szám INNER JOIN Lemez ON Szám.lemez_kód = Lemez.lemez_kód WHERE Lemez.cím = 'Best Of ABBA'
Példa (alias nevek) ELŐADÓ(előadó_kód, név, együttes, együttes_kód, szüldátum) Kik a 30Y együttes aktuális tagjai? SELECT Tag.név FROM Előadó AS Tag, Előadó AS Együttes WHERE Tag.együttes_kód = Együttes.előadó_kód AND Együttes.név = '30Y'
Példa (összesítő függvény) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) ELŐADÓ(előadó_kód, név, együttes, együttes_kód, szüldátum) Összesen mennyibe kerülnek a 2008 után kiadott Republiclemezek? Mennyi a legolcsóbb és a legdrágább? SELECT SUM(ár),MIN(ár),MAX(ár) FROM Lemez,Előadó WHERE Lemez.előadó_kód = Előadó.előadó_kód AND előadó.név = 'Republic'
Példa (speciális logikai függvények) ELŐADÓ(előadó_kód, név, együttes, együttes_kód, szüldátum) Listázzuk ki azon szóló előadók születési dátumát, akik 1970. jan. 1. és 1980. jan. 1. között születtek, és legalább három szóból áll a nevük! SELECT név, szüldátum FROM Előadó WHERE együttes = 0 AND együttes_kód IS NULL AND szüldátum BETWEEN '1970-01-01' AND '1980-01-01' AND név LIKE '% % %'
Példa (speciális logikai függvények) ELŐADÓ(előadó_kód, név, együttes, együttes_kód, szüldátum) Cher és Madonna születési dátuma: SELECT szüldátum FROM Előadó WHERE név IN ('Cher', 'Madonna')
GROUP BY + HAVING A tábla sorainak csoportonkénti összesítésére szolgál Egy csoportba azok a sorok tartoznak, amelyekre a GROUP BY záradékban megadott oszloplista értéke azonos A SELECT utáni oszloplistában az összesítő függvényen kívül csak olyan oszlop adható meg, ami a GROUP BY-ban is szerepel Az összesítendő csoportok szűrhetők a HAVING záradékban megadott feltétellel
Szemléltetés a MIN függvényre SELECT B, MIN(A) FROM T GROUP BY B x 4 y 6 z 2 T tábla: A B C D E 5 x 6 x 4 x 7 x 8 x 6 y 7 y 2 z 5 z 2 z
Szemléltetés a MIN függvényre SELECT B, MIN(A) FROM T GROUP BY B HAVING MIN(A)<5 x 4 y 6 z 2 T tábla: A B C D E 5 x 6 x 4 x 7 x 8 x 6 y 7 y 2 z 5 z 2 z
Szemléltetés a MIN függvényre SELECT B, MIN(A) FROM T GROUP BY B SELECT B, MIN(A) FROM T GROUP BY B HAVING MIN(A)<5 B MIN(A) x 4 y 6 z 2 B MIN(A) x 4 z 2
Példa (GROUP BY) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) Listázzuk ki csökkenő sorrendben, hogy melyik kiadó hányféle lemezt adott ki! SELECT kiadó, COUNT(*) FROM Lemez GROUP BY kiadó ORDER BY COUNT(*) DESC
Példa (HAVING) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) Csak azon kiadókra listázzuk az előbbi darabszámot, amelyeknek legalább 50 fajta lemezük van! SELECT kiadó, COUNT(*) FROM Lemez GROUP BY kiadó HAVING COUNT(*) >= 50 ORDER BY COUNT(*) DESC
Példa (HAVING vs WHERE) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) Azon kiadókra listázzuk a 2000-nél korábban kiadott lemezek számát, amelyeknek ilyenből legalább 50 van! SELECT kiadó, COUNT(*) FROM Lemez WHERE kiadás_éve < 2000 GROUP BY kiadó HAVING COUNT(*) >= 50 ORDER BY COUNT(*) DESC
Alkérdés Valamely SQL utasítás belsejében szereplő SELECT művelet Például egy SELECT utásítás WHERE feltételében előfordulhat SELECT utasítást tartalmazó logikai kifejezés Ügyelni kell a típuskompatibilitásra Például egy A = x összehasonlításnál ha az A attribútum egy szám, akkor x helyén csak olyan SELECT utasítás lehet, ami egyetlen számot ad vissza
Példa (Alkérdés) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) Írassuk ki a legolcsóbb lemez(ek) címét! SELECT cím FROM Lemez WHERE ár = (SELECT MIN(ár) FROM Lemez)
Példa (Alkérdés) LEMEZ(lemez_kód, kiadó, kiadás_éve, előadó_kód, cím, ár) SZÁM(lemez_kód, cím, hossz) Írassuk ki azon lemezek címét, amelyeken mindegyik szám legfeljebb 4 perces! (A hosszt másodpercekben számítva tároljuk.) SELECT cím FROM Lemez WHERE NOT EXISTS (SELECT * FROM Szám WHERE Szám.lemez_kód = Lemez.lemez_kód AND hossz > 240 )
Nézettáblák Virtuális tábla származtatott adatokkal Automatikusan követi az alapadatok változását. Létrehozása: CREATE VIEW táblanév [(oszloplista)] AS alkérdés;
Nézettáblák (példa) CREATE VIEW Előadó_Cím_Ár AS SELECT név, cím, ár FROM Lemez, Előadó WHERE Lemez.előadó_kód = Előadó.előadó_kód