Adatbázisok gyakorlat SQL (alap) Adatbázisok gyakorlat
Relációs adatmodell Egy reláció sémája: Sör (név, ország). Az adatbázis sémája: Sör (név, ország), Bár (név, város, tulaj), Felszolgál (sör, bár, ár). Sör Bár attribútumok név ország Soproni Magyar Kozel Cseh Dreher Német név város tulaj Makk 7-es Budapest Géza Lórúgás Győr Ica Felszolgál előfordulás sör bár ár Kozel Makk 7-es 320 Dreher 400 Soproni Lórúgás 280 sorok
SQL Structured Query Language Legfontosabb részei Deklaratív nyelv SELECT FROM WHERE Deklaratív nyelv Multihalmaz szemantikát használ Azaz a relációkban (táblázatokban) ismétlődhetnek a sorok
SQL szintaktika Nem érzékeny a kis- és nagybetű különbségre kivétel sztringek: "kakas" ≠ "Kakas" Minden lekérdezést ; zár. Egysoros megjegyzés --, többsoros megjegyzés /* */
Adatbázisunk Szeret (nev, gyumolcs) Hajoosztalyok (osztaly, tipus, orszag, agyukSzama, kaliber, vizkiszoritas) Hajok (nev, osztaly, felavatva) Csatak (nev, datum) Kimenetelek (hajo, csata, eredmeny)
FROM záradék Megadása kötelező A lekérdezésben használt táblákat adhatjuk meg itt A táblaneveket , választja el egymástól Az egyes táblák a lekérdezés erejéig átnevezhetők a tábla neve az adatbázisban nem változik meg, csak az adott lekérdezésben hivatkozhatunk rá a megadott névvel
SELECT záradék Megadása kötelező Az eredményben szereplő attribútumokat sorolhatjuk itt fel Az attribútumokat , választja el egymástól Az attribútumok kifejezésben is szerepelhetnek aritmetikai műveletek sorfüggvények Az attribútumok és a kifejezések átnevezhetők
Példák SELECT nev FROM szeret; SelEct NeV FROm szereT; SELECT nev, gyumolcs SELECT * SELECT gyumolcs AS gyumi FROM szeret; SELECT gyumolcs gyumi SELECT gyumolcs FROM szeret sz; SELECT (3+2)/7 AS pelda FROM DUAL;
WHERE záradék A kiválasztandó sorokra fogalmazhatunk meg szűrő feltételt A megadható kifejezések: aritmetikai összehasonlítások (=, <, >, <>, !=, <=, >=) (sztringek és dátumok esetén is értelmezhetőek) AND, OR, NOT (logikai ÉS, VAGY, NEM) BETWEEN (egy érték beleesik-e egy zárt intervallumba) LIKE (lásd később) IS NULL (egy mező értéke NULL vagy sem, tagadása NOT IS NULL) IN (egy érték eleme-e egy halmaznak, tagadása NOT IN) stb.
Példák I. SELECT nev FROM szeret WHERE gyumolcs = 'ALMA'; WHERE gyumolcs = 'ALMA' OR gyumolcs = 'KORTE'; SELECT nev FROM szeret WHERE gyumolcs IN ('ALMA', 'KORTE'); WHERE nev > 'PETER';
Példák II. SELECT nev FROM szeret WHERE gyumolcs IS NULL; FROM csatak WHERE datum BETWEEN DATE '1941-12-07' AND DATE '1944-06-06'; SELECT nev FROM szeret WHERE gyumolcs = 'alma'; Üres eredmény. Miért?
LIKE használata A LIKE segítségével mintát illeszthetünk A minták két speciális karaktert tartalmazhatnak _ tetszőleges karaktert helyettesít % tetszőleges karaktersorozatot helyettesít (akár 0 hosszúságút is) SELECT nev FROM szeret WHERE nev LIKE 'E%E%' AND gyumolcs LIKE '_L_A';
Megjegyzés SELECT nev FROM szeret WHERE gyumolcs LIKE 'ALMA'; WHERE gyumolcs = 'ALMA'; A két lekérdezés eredménye mindig ugyanaz. Ám ha nem szeretnénk mintát illeszteni, ne a LIKE utasítást használjuk.
Összekapcsolás Érdemes megnézni mi lesz az alábbi lekérdezés eredménye SELECT * FROM kimenetelek, hajok; Az eredményben a kimenetelek tábla minden sora "párban áll" a hajok tábla minden sorával A legtöbb lekérdezésben csak azok a sorpárok érdekesek számunkra, ahol a sorok ugyanarra a hajóra vonatkoznak.
Példa SELECT felavatva FROM hajok, kimenetelek WHERE nev = hajo AND eredmeny = 'elsullyedt'; SELECT h.nev, h.osztaly FROM hajok h, hajoosztalyok ho WHERE ho.osztaly = h.osztaly AND agyukszama >= 7;
Halmazműveletek A halmazműveletek a szokásosak UNION (unió) INTERSECT (metszet) MINUS (különbség) Az eredményben az ismétlődő sorok kiküszöbölésre kerülnek A SELECT záradékokban az attribútumok típusa páronként meg kell, hogy feleljen egymásnak az első attribútumok típusa vagy megegyezik, vagy automatikus konverzióval egymásba alakítható, a második attribútumokra ugyanez teljesül stb. az attribútumnevek különbözhetnek
Példa SELECT nev FROM hajok MINUS SELECT hajo FROM kimenetelek WHERE eredmeny = 'elsullyedt';
Multihalmaz műveletek UNION ALL, INTERSECT ALL, MINUS ALL Ha egy t sor k-szor szerepel R-ben és s-szer S-ben, akkor k+s-szer szerepel R UNION ALL S-ben, min(k, s)-szer R INTERSECT ALL S-ben és min(0, k-s)-szer R MINUS ALL S-ben. Az Oracle csak a UNION ALL-t implementálta.
Ismétlődések kiküszöbölése Az eredményből az ismétlődő sorok a DISTINCT utasítással küszöbölhetők ki. DISTINCT utasítás csak a SELECT záradékban szerepelhet később látni fogjuk, hogy máshol is Példa: SELECT DISTINCT nev FROM szeret;
Sztring kezelése (alapok) A szeret táblában minden érték csupa nagybetűvel szerepel, a többi táblában nem Ha ezzel nem szeretnénk foglalkozni, a sztringeket csupa nagy- vagy kisbetűssé alakíthatjuk át UPPER LOWER
Példák SELECT nev FROM szeret WHERE LOWER(gyumolcs) = 'alma'; WHERE gyumolcs = UPPER('alma'); Ez helyes lekérdezés, de vegyük észre: UPPER('alma') = 'ALMA'
Feladatok I. Milyen gyümölcsöket szeret Anna? Milyen csaták voltak 1943-ban és 1944-ben? Mely hajók vettek részt 1944-es csatában? Az elsüllyed hajók hány ágyúval rendelkeztek (hajo_nev, agyuk_szama)? Milyen gyümölcsöket nem szeret Anna? Melyek azok a hajók, amelyeket nem Japánban gyártottak? Melyek azok a hajóosztályok, amelyből minden hajó épen maradt?
Feladatok II. Kik szeretnek legalább két gyümölcsöt? Kik szeretnek legfeljebb egy gyümölcsöt? Mely csatában vett részt legalább két hajóosztályból való hajó?