WHERE záradék (további lehetıségek) SQL specialitások, amelyek könnyen átírhatóak relációs algebrai kifejezésre (összetett kiválasztási feltételre) BETWEEN.. AND.. intervallumba tartozás IN (értékhalmaz) egyszerű értékek halmaza SQL specialitások, nem írhatók át relációs algebrába: (--- ezek jönnek a köv.lapon ) Karakterláncok LIKE összehasonlítása mintákkal IS NULL összehasonlítás LIKE Karakterláncok összehasonlítása mintákkal: <attribútum> LIKE <minta> vagy <attribútum> NOT LIKE <minta> Minta egy olyan karakterlánc, amelyben használhatjuk a speciális % és _ karaktereket. A mintában % megfelel bármilyen karakterláncnak és _ bármilyen karakternek. Azokat a bárokat keressük, amelynek a nevében van s (mint például Joe s Bar) SELECT név FROM Bár WHERE név LIKE '%''s% ; NULL értékek Az SQL lehetővé teszi, hogy a relációk soraiban az attribútum értéke egy speciális NULL nullérték legyen. A nullérték értelmezésére több lehetőségünk is van: Ismeretlen érték : például tudom, Joe s Bár -jának van valamilyen címe, de nem tudom, hogy mi az. Nem-definiált érték : például a házastárs attribútumnak egyedülálló embereknél nincs olyan értéke, aminek itt értelme lenne, nincs házastársa, ezért nullérték. Where záradékban a nullérték vizsgálata: IS NULL IS NOT NULL NULL értékek használata Where záradékban a nullérték használata: Amikor egy aritmetikai műveletben az egyik tag NULL, akkor az eredmény is NULL. Amikor egy NULL értéket hasonlítunk össze bármely más értékkel (beleértve a NULL-t is) az összehasonlítási operátorok (=, <>, <, <=, >, >=) segítségével, akkor az eredmény UNKNOWN(ismeretlen). Az ismeretlen (unknown) igazságérték Az SQL-ben szereplő logikai feltételek valójában háromértékű logika: TRUE, FALSE, UNKNOWN (magyarban igaz, hamis, ismeretlen rövidítése miatt inkább meghagyjuk az angol T, F, U rövidítéseket). A WHERE záradékban szereplő logikai feltételt a rendszer minden egyes sorra ellenőrzi és a logikai érték TRUE, FALSE vagy UNKNOWN valamelyike lehet, de az eredménybe csak azok a sorok kerülnek, amelyeknek a feltétel kiértékelése TRUE értéket adott.
A 3-értékő logika Hogyan működnek az AND, OR, és NOT logikai műveletek a 3-értékű logikában? A szabályt könnyű megjegyezni, ha úgy tekintjük, hogy TRUE = 1, FALSE = 0, és UNKNOWN = ½. Ekkor AND = MIN, OR = MAX, NOT(x) = 1-x. TRUE AND (FALSE OR NOT(UNKNOWN)) = MIN(1, MAX(0, (1 - ½ ))) = MIN(1, MAX(0, ½ )) = MIN(1, ½ ) = ½ = UNKNOWN A 3-értékű logika AND, OR és NOT igazságtáblázatát lásd a Tk. 6.2.ábráját (vagy kitöltése a fenti szabállyal) Alkérdések A FROM listán és a WHERE záradékban (valamint később lesz a HAVING záradékban) zárójelezett SELECTFROM-WHERE utasításokat(alkérdéseket) is használhatunk. Szintaktikus alakja: zárójelbe kell tenni a lekérdezést Hol használható? Ott, ahol relációnevet használunk: (1) FROM listában: új listaelem (rel.név változó SQL-ben)(lekérdezés) [AS] sorváltozó Ez felel meg annak, ahogyan a relációs algebrában tetsz.helyen használhattuk a lekérdezés eredményét. (2) WHERE záradékban: kifejezésekben, feltételekben Alkérdések használata FROM listán I. FROM záradékbanalkérdéssel létrehozott ideiglenes táblát is megadhatunk. Ilyenkor a legtöbb esetben meg kell adnunk a sorváltozó nevét. Szintaktikus alakja: (lekérdezés) [AS] sorváltozó Szemantikája: A FROM záradékban kiértékelődik az alkérdés, utána a sorváltozót ugyanúgy használjuk, mint a közönséges adatbázis relációkat. FROM záradékban alkérdéssel létrehozott ideiglenes táblát is megadhatunk. Ilyenkor a legtöbb esetben meg kell adnunk a sorváltozó nevét. Alkérdések használata WHERE záradékban: (i) Az alkérdés eredménye egyetlen skalárérték, vagyis az alkérdés olyan, mint a konstans, ami egy új elemi kifejezésként tetszőleges kifejezésben használható. (ii) Skalár értékekből álló multihalmaz logikai kifejezésekben használható: [NOT] EXISTS (lekérdezés)kifejezés [NOT] IN (lekérdezés)kifejezés Θ[ANY ALL] (lekérdezés) (iii) Teljes, többdimenziós tábla a visszatérő érték: [NOT] EXISTS (lekérdezés)(kif1, kifn) [NOT] IN (lekérdezés)
Skalár értékekbıl álló multihalmaztvisszaadó alkérdések: Az ANY művelet x= ANY(alkérdés) akkor és csak akkor igaz, ha x egyenlő az alkérdés legalább egy sorával. = helyett bármilyen aritmetikai összehasonlítás szerepelhet. x> ANY(alkérdés) akkor igaz, ha x nem az alkérdés legkisebb elemével azonos. Itt az alkérdés sorai egy mezőből állnak. Skalár értékekbıl álló multihalmazt visszaadó alkérdések: Az ALL mővelet x<> ALL(alkérdés) akkor és csak akkor igaz, ha x az alkérdés egyetlen sorával sem egyezik meg. <> helyett tetszőleges összehasonlítás szerepelhet. x>= ALL(alkérdés) x az alkérdés eredményének maximum értékével azonos. Az IN mővelet a WHERE záradékban sor IN (alkérdés) akkor és csak akkor igaz, ha a sor eleme az alkérdés eredményének. Tagadás: sor NOT IN (alkérdés). Az IN-kifejezések a WHERE záradékban jelenhetnek meg SELECT *FROM Sörök WHERE név IN (SELECT sör FROM Kedvel WHERE név = Fred ); = Az összes olyan sör adata, melyeket Fred kedvel. Az EXISTS mővelet a WHERE-ben EXISTS (alkérdés) akkor és csak akkor igaz, ha az alkérdés eredménye nem üres. Tagadása: NOT EXISTS (alkérdés) A Sörök(név, gyártó)táblában keressük meg azokat a söröket, amelyeken kívül a gyártójuk nem gyárt másikat. Ez korrelált alkérdés, többször kerül kiértékelésre, a külső tábla minden sorára kiértékeljük az alkérdést. A korrelált lekérdezések használata közben figyelembe kell vennünk a nevek érvényességi körére vonatkozó szabályokat.
Oszlopok másodnevének megadása: Az oszlop másodneve: az oszlop fejlécét is átnevezi, számított oszlop esetén különösen hasznos, az oszlopnevet (szóközzel elválasztva) követi (opcionálisan az AS kulcsszó is használható). Dupla idézıjelbe kell tenni, ha szóközt vagy speciális karaktert (#, $, ) használunk, illetve ha nem csupa nagybetőbıl áll. Összesítések (aggregálás) SELECT listán: <Aggregáló mővelet>(kifejezés) [[AS] onév], SUM, COUNT, MIN, MAX aggregáló mőveleteket, AVG (bevezették ezt is, mivel gyakran kell AVG) a SELECT záradékban alkalmazhatjuk egy oszlopra. COUNT(*) az eredmény sorainak számát adja meg. Itt is fontos a halmaz, multihalmaz megkülönböztetés. pl. SUM(DISTINCT R.A) csak a különbözı értékőeket veszi figyelembe. NULL értékek használata, pl. SUM nem veszi figyelembe (implementáció függı, ellenırizzük le a COUNT-ra gyak.) Ismétlődések kiküszöbölése összesítésben Az összesíti függvényen belül DISTINCT. hány különféleáron árulják a Bud sört? SELECT COUNT(DISTINCT ár)from Felszolgál WHERE sör = Bud ; NULL értékek nem számítanak az összesítésben NULL nem számít a SUM, AVG, COUNT, MIN, MAX függvények kiértékelésekor. De ha nincs NULL értéktıl különbözı érték az oszlopban, akkor az összesítés eredménye NULL. Kivétel: COUNT az üres halmazon 0-t ad vissza.
Csoportosítás SELECT FROM [WHERE ][GROUP BY kif1, kifk] Egy SELECT-FROM-WHERE kifejezést GROUP BY záradékkal folytathatunk, melyet attribútumok listája követ. A SELECT-FROM-WHERE eredménye a megadott attribútumok értékei szerint csoportosítódik, az összesítéseket ekkor minden csoportra külön alkalmazzuk. Csoportok szőrése: HAVING záradék A GROUP BY záradékot egyhaving <feltétel> záradék követheti. Ebben az esetben a feltétel az egyes csoportokra vonatkozik, ha egy csoport nem teljesíti a feltételt, nem lesz benne az eredményben. HAVING A Felszolgál(bár, sör, ár) és Sörök(név, gyártó) táblák felhasználásával adjuk meg az átlagos árát azon söröknek, melyeket legalább három bárban felszolgálnak, vagy Pete a gyártójuk. A HAVING feltételére vonatkozó megszorítások Az alkérdésre nincs megszorítás. Az alkérdésen kívül csak olyan attribútumok szerepelhetnek, amelyek: 1. vagy csoportosító attribútumok, 2. vagy összesített attribútomok. (Azaz ugyanazok a szabályok érvényesek, mint a SELECT záradéknál).
Adatbázis tartalmának módosítása Beszúrás: Ha egyetlen sort szúrunk be: INSERT INTO <reláció>values( <attribútum lista> ); a Kedvel(név, sör) táblában rögzítjük, hogy Zsu szereti a Bud sört. INSERT INTO Likes VALUES( Zsu, Bud ); Több sor beszúrása: Egy lekérdezés eredményét is beszúrhatjuk a következı módon alkérdéssel: INSERT INTO <reláció>( <alkérdés> ); A Látogat (név, bár) tábla felhasználásával tábla felhasználásávaladjuk hozzá a LehetBarát(név) táblához Zsu lehetséges barátait, vagyis azokat a sörivókat, akik legalább egy olyan bárt látogatnak, ahova Zsu is szokott járni. Attribútumok megadása A reláció neve után megadhatjuk az attribútumait. Ennek alapvetıen két oka lehet: 1. elfelejtettük, hogy a reláció definíciójában, milyen sorrendben szerepeltek az attribútumok. 2. Nincs minden attribútumnak értéke, és azt szeretnénk, ha a hiányzó értékeket NULL vagy default értékkel helyettesítenék. INSERT INTO Kedvel(sör, név)values( Bud, Zsu ); Default értékek megadása A CREATE TABLE utasításban az oszlopnevetdefaultkulcsszó követheti és egy érték. Ha egy beszúrt sorban hiányzik az adott attribútum értéke, akkor a default értéket kapja.
Törlés A törlendı sorokat egy WHERE feltétel segítségével adjuk meg: DELETE FROM <reláció> WHERE <feltétel>; DELETE FROM Kedvel WHERE nev = Zsu AND sör = Bud ; Az összes sor törlése: DELETE FROM Kedvel; A törlés szemantikája Tegyük fel, hogy az Anheuser-Busch csak Bud és Bud Lite söröket gyárt. Tegyük fel még, hogy s sorai közt a Bud fordul elı elıször. Az alkérdés nem üres, a késıbbi Bud Lite sor miatt, így a Bud törlıdik. Kérdés, hogy a Bud Lite sor törlődik-e? Válasz: igen, a Bud Lite sora is törlődik. A törlés ugyanis két lépésben hajtódik végre. 1. Kijelöljük azokat a sorokat, amelyekre a WHERE feltétele teljesül. 2. Majd töröljük a kijelölt sorokat. Módosítás Bizonyos sorok bizonyos attribútumainak módosítása. Fecó telefonszámát 555-1212-re változtatjuk (Fecó itt egy sörivó neve): UPDATE Sörivók SET telefon = 555-1212 WHERE név = Fecó ; Több sor módosítása Legfeljebb 4 dollárba kerülhessenek a sörök: UPDATE Felszolgál SET ár = 4.00 WHERE ár > 4.00; Olcsó sörök árát duplázzuk: UPDATE Felszolgál SET ár = 2 * ár WHERE ár < 1.00;