– SELECT - 2. – Tarcsi Ádám 2006. március Adatbázis gyakorlat
Jan 21, 2016
– SELECT - 2. –
Tarcsi Ádám
2006. március
Adatbázis gyakorlat
Miről lesz szó?
• SELECT befejezés:– GROUP BY– HAVING– dátum kezelés– Al-select (subselect)– INSERT, DELETE, UPDATE, CREATE – selecttel
GROUP BYSELECT …
FROM … [WHERE …]GROUP BY mező1, [mező 2]
[ORDER BY …]• Csoportosítás, csoport képzés.
Megszámolhatjuk, hogy hány sor van egy csoportban, vagy kiválaszthatjuk a csoport egy kívánt tagját (pl.: a legidősebbet a csoportban)
• Oszlopfüggvényeket (SUM, AVG, COUNT, stb.) az egyes csoportokban külön-külön hajtja végre
• A GROUP BY-ban megadott mezőnek szerepelnie kell a SELECT utáni felsorolásban.
GROUP BY – 2.• A WHERE feltételnek megfelelő sorokat
csoportosítja úgy, hogy a megadott csoportosítási kifejezéseken (GROUP BY x,y…) belül az egyező értékkel bírók, illetve azok teljes sorai kerülnek 1-1 csoportba.
• Üres csoportok nem kerülnek be!• FeladatFeladat: Adjuk meg, hogy az egyes tanárok
hány diáknak osztályfőnökei! (Azonosítóval)SELECT Ofo, COUNT(DAzon) AS DbFROM tDiakGROUP BY Ofo;
GROUP BY feladatok
• Adjuk meg az egyes tanárok (névvel megadva) által oktatott diákok átlagéletkorát!
Megjegyzés: Az eredmény táblába nem kerülnek bele azok a tanárok, akik nem tanítanak senkit sem.
HAVING
• Csoportokra vonatkozó feltétel megadás. csak a GROUP BY utasítással együtt használjuk.
MindenMinden WHEREWHERE GROUP BYGROUP BY HAVINGHAVING
HAVING feladatok
• Adjuk meg azon tanárok nevét, akik 2 diáknál többet tanítanak!
• Adjuk meg azon tanárok nevét és tanítványainak átlagéletkorát, akik legalább 3 diákot tanítanak!
Dátumkezelés
• Dátum tárolás: (évszázad,) év, nap, óra, perc, másodperc, századmásodperc.
• SELECT sysdate FROM dual; - rendszeridő, dátum
Eredménye: 2007-02-28 15:20:03.0 • Dátummal végezhető műveletek:
– dátum +- szám - napokat ad hozzá, vesz el– dátum – dátum - eltelt napok száma– dátum + szám/24 - szám db órát ad a dátumhoz
Dátum konverzió
• Hozzunk létre egy új táblát:
tEmber(EAzon:szám,Nev:szoveg,Szuletes:date)
• Töltsük fel egy rekorddal:
• INSERT INTO-val próbáljuk meg feltölteni!INSERT INTO tEmber VALUES (5,'Kiss János','1988-FEB-28 10:00:00.0');
Konverziós függvény!
Konverzió
• TO_DATE(‘dátumérték’,’formátum’): number,char,varchar típusú dátumértéket adott formátumú dátummá alakítja. Pl.: TO_DATE('1988.feb.28.','YYYY.mon.DD.')
• Most próbáljuk újra!INSERT INTO tEmber VALUES (10,'Kiss János',TO_DATE('1988.feb.28.','YYYY.mon.DD.'));
Konverzió TO_CHARLehetséges dátum formátummaszkok pl.:• YYYY - teljes évszám, számmal• YEAR - évszám betűvel• MM - hónapneve (pl:.03)• MONTH - hónap teljes neve, betűvel• mon - hónap 3 betűs rövidítése,
kisbetűvel• WW - hét sorszáma az évben• DD - nap sorszáma a hónapban • D - nap sorszáma a héten• DAY - nap teljes neve,
szövegesen
Konverzió – TO_CHAR
• TO_CHAR(érték,’formátum’): Számból, dátumból (mezőt adott formátumú dátummá) karaktert. Lekérdezéskor.
• SELECT TO_CHAR(sysdate,'MONTH') FROM DUAL;
• Select TO_CHAR(Szuletes,'YYYY MONTH DAY') from tEmber;
• SELECT TO_CHAR (TO_DATE('1979.sep.10','YYYY.mon.DD'),'YEAR MONTH DDD WW') FROM dual
Dátumkezelő függvények *
• MOTHS_BETWEEN(dátum1,dátum2): két dátum között eltelt hónapok száma
• ADD_MONTHS(dátum,n): n db naptári hónapot ad hozzá a dátumhoz. n negatív is lehet.
• NEXT_DAY(dátum,’nap’):Meghatározza a megadott dátum utáni első ‘nap’ nevű nap dátumát.SELECT NEXT_DAY(sysdate,'monday') FROM dual;
• LAST_DAY(dátum,’nap’): A megadott dátum hónapjának utolsó napját
Dátumkezelő függvények – 2. *
UPDATE tEmber SET Szuletes=ADD_MONTHS(Szuletes,-20)
WHERE EAzon=5;
Feladatok:• Hány olyan diák van, akit a 2-es azonosítójú tanár tanít?• Adjuk meg a tDiak táblában szereplők születési
évszámát!• Adjuk meg a 10 és 20 év közötti diákok tanárainak
nevét, abc sorrendben. (Minden név csak egyszer szerepeljen!)
• Listázzuk ki az összes diákot, akik 15 és 25 éves kor között vannak, vagy a vezetéknevük „Har”!
• Adjuk meg a tanított diákok száma alapján csökkenő sorrendbe rendezve, hogy az egyes tanárok hány diákot tanítanak!
Allekérdezés - subselect• Allekérdezés olyan SELECT utasítás, amely
értéke(ke)t ad át egy külső utasításnak.• WHERE-ben vizsgálandó értékeket másik
SELECT-ből hozzuk.Pl.: Ki idősebb, mint a 32-es azonosítójú diák?SELECT nevFROM tdiakWHERE kor> (SELECT kor
FROM tdiak WHERE DAzon=32);
Hogy is van ez?
Allekérdezés – subselect – 2.• Jelentőségük: ha egy külső utasítás eredménytáblájában
valamely sor kiválasztása egy teljes tábla kiértékelésétől függ.
• Tagadás esetén. Pl.: melyik tanár nem osztályfőnök• Először a belső SELECT hajtódik végre, ez lesz a külső
feltétel.• WHERE, HAVING, FROM utasításrészben• Mindig egy összehasonlító operátor jobb oldalán van!• Zárójelbe ( ) kell tenni• Nem tartalmazhat ORDER BY utasításrészt• Fajái:
– egysoros– többsoros
Egysoros subselect
• A belső SELECT egyetlen sort ad vissza• Néha a DISTINCT záradékkal segíthetünk!Példa:• Adjuk meg azon tanárokat, akik legalább
egy diákot tanítanak! (melyik tanár osztályfőnök?)
• Adjuk meg azon tanárokat, akik nem tanítanak egy diákot sem!
Többsoros subselect• Hibás, ha az előbbi alselect több sort ad vissza.Összehasonlító operátort használunk:• IN / NOT IN: a lista bármely elemével egyenlő – adott
érték előfordulása• ANY: listát ad vissza, ha van egy elem, ami kielégíti a
feltételt, akkor a WHERE feltétel teljesül – legalább 1.• ALL: listát ad vissza Teljesül a feltétel, ha a visszaadott
lista minden eleme minden tagja teljesíti – minden esetben igaz
• EXIST: a feltétel teljesül, ha az allekérdezés legalább egy sort ad vissza.
• NOT ALL: legyalább egy esetben nem igaz• NOT ANY: egyetlen esetben sem igaz
Subselect feladatok
• Adjuk meg a legidősebb diák nevét!• Kiket tanít még ‘Ka Pál’ tanára?• Listázzuk ki azokat a diákokat, akik legalább
kétszer olyan idősek, mint a legfiatalabb diák.• Írassuk ki azoknak a tanároknak a neveit, akik
nem tanítanak 20 évnél idősebb diákokat!• Listázzuk ki azoknak a diákoknak a nevét, akik
fiatalabbak minden olyan diáknál, akiknek az osztályfőnöke ‘Szlávi Péter’
Allekérdezés -2. INSERT INTO
INSERT INTO <táblanév> (<mezőnév1>, …, <mezőnévn>)(<al-select>)
• INSERT INTO tDiak (DAzon, Nev, Kor, TAzon)(SELECT DAzon, Nev, Kor, 1 FROM tOsztaly)
• INSERT INTO tDiak (DAzon, Nev, Kor, TAzon)(SELECT *, 1 FROM tOsztaly)
Allekérdezés -3. – UPDATE
• UPDATE <táblanév> SET <mezőnév1> = <érték1>, …, <mezőnévk> = <értékk> WHERE <feltétel al-select-ekkel>
• Változtassuk a kor mező értékét 30-ra azon diákoknál, akiket Zsakó László tanít!
UPDATE tDiak SET TAzon=3WHERE TAzon IN (SELECT TAzon FROM tTanar WHERE Nev like ’Zsakó László’)
Allekérdezés -3. – DELETE FROM
• DELETE FROM <táblanév> WHERE <feltétel al-select-ekkel>
• Töröljük azokat a tanárokat, akik egy diákot sem tanítanak!
DELETE FROM tTanar WHERE TAzon NOT IN (SELECT TAzon FROM tDiak)
Alkérdés CREATE TABLE-ben
CREATE table
(…
)
AS
SELECT …