Adatbázisok 1. SQL (alkérdések)
Az IN használata Emlékezzünk vissza: Az IN után szereplő multihalmaz elemei lekérdezéssel is megadhatók SELECT nev FROM szeret WHERE LOWER(gyumolcs) IN ('alma','korte'); SELECT felavatva FROM hajok WHERE nev IN (SELECT hajo FROM kimenetelek WHERE eredmeny = 'elsullyedt');
Mi a különbség? SELECT felavatva FROM hajok WHERE nev IN (SELECT hajo FROM kimenetelek WHERE eredmeny = 'elsullyedt'); SELECT felavatva FROM hajok, kimenetelek WHERE nev = hajo AND eredmeny = 'elsullyedt';
És itt? SELECT datum FROM csatak WHERE nev IN (SELECT csata FROM kimenetelek); SELECT felavatva FROM csatak, kimenetelek WHERE nev = csata;
Az IN és az = közötti különbség Szintaktikailag az alábbi lekérdezés is helyes SELECT datum FROM csatak WHERE nev = (SELECT csata FROM kimenetelek); Futási időben azonban hibát kapunk – egy érték és multihalmaz egyenlőségét csak abban az esetben vizsgálhatjuk, ha a multihalmaz pontosan egy értéket tartalmaz – azaz, az = jobboldalán szereplő lekérdezésnek pontosan egy sort kellene visszaadnia
A többi aritmetikai művelet Hasonló mondható el a többi aritmetikai összehasonlítás esetében is SELECT nev FROM hajok WHERE felavatva > (SELECT TO_CHAR(datum, 'YYYY') FROM csatak WHERE nev = 'Denmark Strait'); Helyes SELECT nev FROM hajok WHERE felavatva > (SELECT TO_CHAR(datum, 'YYYY') FROM csatak WHERE datum > DATE ' '); Helytelen
Az ALL és az ANY használata Alkérdések esetén az aritmetikai összehasonlításokat általában az ALL vagy ANY műveletekkel alkalmazzuk – az ALL a minden kvantornak felel meg – míg az ANY a létezik kvantornak
Példák SELECT osztaly FROM hajoosztalyok WHERE where agyukSzama >= ALL (SELECT agyukSzama FROM hajoosztalyok); SELECT nev FROM hajok WHERE felavatva > ANY (SELECT TO_CHAR(datum, 'YYYY') FROM csata);
Mi az alábbi lekérdezés jelentése? SELECT agyukSzama FROM hajoosztalyok MINUS SELECT agyukSzama FROM hajoosztalyok WHERE agyukSzama < ANY (SELECT agyukSzama FROM hajoosztalyok);
Az IN és az = ANY Vegyük észre SELECT nev FROM hajo WHERE nev IN (SELECT hajo FROM kimenetelek WHERE eredmeny = 'elsullyedt'); SELECT nev FROM hajo WHERE nev = ANY (SELECT hajo FROM kimenetelek WHERE eredmeny = 'elsullyedt'); A két lekérdezés ekvivalens egymással
Az EXISTS használata SELECT nev FROM hajo h WHERE EXISTS (SELECT * FROM kimenetelek WHERE hajo = h.nev); A hajó tábla minden sorára kiértékeljük a jobboldali lekérdezést, ahol az eredmény nem üres, a sor bekerül a végeredménybe.
Vegyük észre SELECT nev FROM hajok WHERE EXISTS (SELECT * FROM kimenetelek WHERE eredmeny = 'elsullyedt'); Mivel az alkérdésnek "semmi köze" a fő kérdéshez, az ilyen lekérdezések mindig vagy nem adnak vissza sort, vagy a teljes tábla lesz az eredmény.
Korrelált alkérdések Korrelált alkérdés esetén a fő kérdés egy táblájának legalább egy attribútuma összehasonlításra kerül az alkérdés egy táblájának attribútumával SELECT nev FROM hajo h WHERE EXISTS (SELECT * FROM kimenetelek WHERE hajo = h.nev); Az EXISTS használata esetén tehát mindig korrelált alkérdést kell használnunk
NOT EXISTS: példa Mit ad vissza az alábbi lekérdezés SELECT osztaly, agyukSzama FROM hajoosztalyok h1 WHERE NOT EXISTS (SELECT * FROM hajoosztalyok h2 WHERE h1.agyukSzama < h2.agyukSzama);
MINUS, NOT IN és NOT EXISTS SELECT nev FROM hajo MINUS SELECT hajo FROM kimenetelek; SELECT nev FROM hajo WHERE nev NOT IN (SELECT hajo FROM kimenetelek); SELECT nev FROM hajo WHERE NOT EXISTS (SELECT * FROM kimenetelek WHERE nev = hajo);
Feladatok I. 1.Melyek azok az amerikai hajók, amelyek részt vettek 1942 utáni csatában? (Használjatok IN-t.) 2.Mi azon hajó neve, amelyik ABC sorrendben a legutolsó? 3.Adjátok meg a 'H' betűvel kezdődő hajók közül az ABC sorrendben legelsőt. 4.Adjátok meg azon hajók nevét, amelyekhez létezik olyan másik hajó, melyet korábban avattak fel. 5.Adjátok meg azon hajók nevét, amelyekhez két olyan hajó is létezik, melyeket korábban avattak fel.
Feladatok II. 6.Melyik az a hajó, amelyet a második legkorábban avattak fel? 7.Melyek azok a csaták, amelyekben nem vett részt japán hajó? (Használjatok NOT IN-t!) 8.Melyek azok a nemzetek, amelyeknek egy hajója sem süllyedt el? (Használjatok NOT EXISTS-et!) 9.Mely nemzeteknek süllyedt el az összes hajója? 10.Kik szeretnek minden gyümölcsöt? 11.Kik szeretik legalább azokat a gyümölcsöket, mint Ferenc?