170 likes | 261 Views
Adatbázisok 1. SQL ( alkérdések ). Az IN használata. SELECT nev FROM szeret WHERE LOWER( gyumolcs ) IN ('alma',' korte ');. SELECT felavatva FROM hajok WHERE nev IN (SELECT hajo FROM kimenetelek WHERE eredmeny = ' elsullyedt ');. Emlékezzünk vissza:.
E N D
Adatbázisok 1. SQL (alkérdések)
Az IN használata SELECT nev FROM szeret WHERE LOWER(gyumolcs) IN ('alma','korte'); SELECT felavatva FROM hajok WHERE nev IN (SELECT hajo FROM kimenetelek WHERE eredmeny = 'elsullyedt'); Emlékezzünk vissza: Az IN után szereplő multihalmaz elemei lekérdezéssel is megadhatók
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 multihalmazpontosan 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 = 'DenmarkStrait'); • Helyes SELECT nev FROM hajok WHERE felavatva > (SELECT TO_CHAR(datum, 'YYYY') FROM csatak WHERE datum > DATE '1943-01-01'); • 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 whereagyukSzama >= 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éseseté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. • Melyek azok az amerikai hajók, amelyek részt vettek 1942 utáni csatában? (Használjatok IN-t.) • Mi azon hajó neve, amelyik ABC sorrendben a legutolsó? • Adjátok meg a 'H' betűvel kezdődő hajók közül az ABC sorrendben legelsőt. • Adjátok meg azon hajók nevét, amelyekhez létezik olyan másik hajó, melyet korábban avattak fel. • Adjátok meg azon hajók nevét, amelyekhez két olyan hajó is létezik, melyeket korábban avattak fel.
Feladatok II. • Melyik az a hajó, amelyet a második legkorábban avattak fel? • Melyek azok a csaták, amelyekben nem vett részt japán hajó? (Használjatok NOT IN-t!) • Melyek azok a nemzetek, amelyeknek egy hajója sem süllyedt el? (Használjatok NOT EXISTS-et!) • Mely nemzeteknek süllyedt el az összes hajója? • Kik szeretnek minden gyümölcsöt? • Kik szeretik legalább azokat a gyümölcsöket, mint Ferenc?