SELECT Ri1.A1, .. Rir.Ar FROM R1, .. , Rk WHERE ? ; Ahol R1, .. , Rk : alaprelációk R.A : R reláció A attribútuma ? : DRC formula A lekérdezéssel ekvivalens relációs algebrai kifejezés : ? Ri1.A1, .. Rir.Ar(??` (R1X .. XRk)) A kiértékelés menete a relációs algebrai kifejezés szerint történik. Az attribútumok felsorolása helyetti * karakter az összeset helyettesesíti. Pl. - a negatív egyenlegű vásárlók neve SELECT Vnév FROM Vásárló WHERE Egyenleg<0 ; - azon szállítók neve, akik árujából Ló Béla rendelt már valaha SELECT Szállító.SzNév FROM Rendelés, Tétel, Szállító WHERE Rendelés.VNév='Ló Béla' AND Rendelés.Rsz=Tétel.Rsz AND Tétel.Termék=Szállító.Termék ; Az egyedi attribútumok neve előtti minősítés elhagyható. A FROM utáni felsorolásban a relációknak alias nevet adhatunk. ... FROM Rendelés R, Tétel T, Szállító Sz ... Az eredményben levő ismétlődések kiszűrése : SELECT DISTINCT ..... Feladat : - Azon vevők neve és címe, akik vásároltak egyszerre legalább 5 patareszelőt - Ló Béla által rendelt, 1200 piculánál olcsóbb termékek neve - Azon vásárlók neve és címe, akik egyenlege kisebb, mint Ló Béla egyenlege Speciális operátorok a WHERE klauzában 1. LIKE - összehasonlítás karakter-stringgel <karakteres kifejezés> LIKE <minta> Z betűvel kezdődő termékek listája SELECT Termék FROM Szállító WHERE Termék LIKE 'Z' OR Termék LIKE 'z' ; A mintába tehető speciális karakterek : % : tetszőleges számú karaktert helyettesíthet _ : egy karaktert helyettesíthet 2. IN, ANY, ALL - Halmaz operátorok Az összehasonlítás operandusaként szereplő halmazokat létrehozhatjuk felsorolással vagy belső SELECT utasítással (beágyazott select, sub-query). a., IN - halmazba tartozás Azon rendelések listája, amelyek tartalmaznak Nyerget, Zablát, Lókötőt SELECT Rsz FROM Tétel WHERE Termék IN ('Nyereg', 'Zabla', 'Lókötő') Ló Béla által rendelt termékek listája SELECT DISTINCT Termék FROM Tétel WHERE Rsz IN ( SELECT Rsz FROM Rendelés WHERE VNév='Ló Béla' ); b., <kifejezés> ? ALL <halmaz> - a halmaz minden elemére történő megkötés Jelentése : A ? ANY S : (?X)(X?S ? A?X) <kifejezés> ? ANY <halmaz> - létezésre történő megkötés Jelentése : A ? ANY S : (?X)(X?S ? A?X) Pl. A legdrágább termék neve SELECT Termék FROM Szállító WHERE Ár > ALL ( SELECT Ár FROM Szállító ); Feladat : - Azon vevők neve, akik rendeltek a legdrágább termékből - Azon szállítók neve, akik szállítanak olyan terméket, amit a Nyerges Ktsz is szállít - Azon vevők neve és címe, akik rendeltek olyan terméket, amit már Ló Béla is rendelt A beágyazott select A beágyazott select általában nem tartalmazhat minden klauzát, csak SELECT-FROM-WHERE felépítésű lekérdezés lehet. Ha eredménye egy érték, akkor úgy kezelhetjük a külső lekérdezésben, mint egy konstanst. Ha eredménye több érték (halmaz), akkor a halmazoperátorokkal kezelhetjük őket. A beágyazott select fajtái : - független - korrelált Ha független, akkor a kiértékeléskor először a belső lekérdezést értékeljük ki, aminek eredménye nem függ a külső lekérdezéstől. Ha korrelált, akkor a belső lekérdezés eredménye függ a külső lekérdezéstől. Ez akkor jöhet létre, ha a belső lekérdezésben hivatkozunk a külső lekérdezésben szereplő valamely attribútumra. Ekkor a külső lekérdezés FROM után szereplő relációinak minden sorára végrehajtódik a belső lekérdezés. Pl. CSAPOLJA (Kocsma, Sör) SZERETI (Korhely, Sör) ODAJÁR (Korhely, Kocsma) Azon korhelyek listája, akik látogatnak olyan kocsmát, ahol csapolnak olyan sört, amit szeret. SELECT DISTINCT Szereti.Korhely FROM Szereti, Csapolja WHERE Szereti.Sör=Csapolja.Sör AND Csapolja.Kocsma IN ( SELECT Odajár.Kocsma FROM Odajár WHERE Odajár.Korhely=Szereti.Korhely ); Feladat : - Azon korhelyek listája, akik látogatnak olyan kocsmát, ahol csapolnak olyan sört, amit szeret. - belső lekérdezés nélkül - Hova menjen Ló Béla ? Azon kocsmák listája, ahol csapolnak olyan sört, amit Ló Béla szeret. - Kiket listáz ki a következő lekérdezés ? SELECT Korhely FROM Odajár WHERE Kocsma NOT IN ( SELECT Kocsma FROM Csapolja WHERE Sör IN ( SELECT Sör FROM Szereti WHERE Szereti.Korhely=Odajár.Korhely ) ); Összesítő operátorok Operátorok : AVG, COUNT, SUM, MIN, MAX Szintaktika : aggr_op(<kifejezés>) aggr_op(DISTINCT <kifejezés>) Pl. - A vásárlók egyenlegének átlaga SELECT AVG(Egyenleg) FROM Vásárló ; - A zablát gyártók száma SELECT COUNT(*) #ZablaGyártók FROM Szállító WHERE Termék = 'Zabla' ; - Azok száma, akik rendeltek már Nyerget SELECT COUNT(DISTINCT Rendelés.Vnév) FROM Rendelés, Tétel WHERE Tétel.Termék = 'Nyereg' AND Tétel.Rsz = Rendelés.Rsz ; Az összesítő művelet a WHERE -el kiválasztott összes rekordra számítódik ki. Ebben az esetben az eredménylistában csak konstansok szerepelhetnek és összesítő operátorok. Az összesítés elvégezhető csoportosítás alapján is : GROUP BY A1,A2, ... Ak Két rekord akkor kerül egy csoportba az összesítéshez, ha A1, ... Ak attribútumaikban megegyeznek. Ezeknek az attribútumoknak az eredménylistában is szerepelniük kell, hogy az eredmény értelmezhető legyen. Pl. - a termékek és azok átlagos árának listája SELECT Termék, AVG(Ár) Átlagár FROM Szállító GROUP BY Termék ; A csoportokat is szűrhetjük a jellemzőik alapján : GROUP BY A1,A2, ... Ak HAVING ? ? : logikai kifejezés, amely a csoportokra értékelődik ki Pl. - azon termékek neve, szállítóinak száma és átlagára, amelyet legalább ketten szállítanak SELECT Termék, COUNT(*) Darab, AVG(Ár) Átlagár FROM Szállító GROUP BY Termék HAVING COUNT(*) > 1 ; Pl. Azon korhelyek listája, akik csak olyan kocsmába járnak, ahol csapolnak olyan sört, amit szeret. SELECT Korhely FROM Szereti WHERE 0 = (SELECT Count (*) FROM Odajár WHERE Odajár.Korhely = Szereti.Korhely AND NOT Szereti.Sör = ANY ( SELECT Sör FROM Csapolja WHERE Csapolja.Kocsma=Odajár.Kocsma ) ) ; Feladat : - Azon vásárlók száma, akik még nem rendeltek Lókötőt - Lista a termékekről és azok számáról, akik már rendeltek belőle Adatmódosítás 1. Új rekord beszúrása egy táblázatba INSERT INTO R [(<oszloplista>)] VALUES (<értéklista>) ; Ha nem adunk meg oszloplistát, akkor minden oszlopnak értéket kell adni, a definiálásnál megadott sorrend szerint. Pl. -egy új vevő beszúrása, ismeretlen cím esetén INSERT INTO Vásárló (Vnév, Egyenleg) VALUES ('Kiss Béla', 0 ) ; Egy táblázathoz hozzáfűzhetjük egy lekérdezés eredményét is, természetesen az oszlopok adattípusának figyelembevételével. NYERGES (Termék, Ár) - A Nyerges KTSZ. árúinak adatait tartalmazó létező táblázat INSERT INTO Nyerges SELECT Termék, Ár FROM Szállító WHERE SzNév='Nyerges KTSZ' ; 2. Rekord törlése táblázatból DELETE FROM R WHERE ? ; Pl. - A 42-es nyerget tartalmazó rendelések törlése DELETE FROM Rendelés WHERE Rsz IN ( SELECT Rsz FROM Tétel WHERE Termék = 'Nyereg / 42' ) ; 3. Rekord módosítása a táblázatban UPDATE R SET <attr1=érték1>, .... , <attrn=értékn> WHERE ? ; Pl. A nyerges KTSZ 10% -al leértékelte a termékeit UPDATE Szállító SET Ár=0.9*Ár WHERE SzNév='Nyerges KTSZ' ; DDL utasítások az SQL -ben 1. Adatbázis létrehozása, törlése A valós adatbázis-kezelő rendszereknél eltérő megoldás DBASE IV : CREATE DATABASE <adatbázisnév> ; DROP DATABASE <adatbázisnév> ; ORACLE : mivel az adatbázis-kezelő rendszer a saját adminisztrációját is az adatbázisban végzi, ezért installáláskor létre kell hozni. 2.a. Táblázat létrehozása CREATE TABLE R ( <attr1 Név1 Típus1 [constraint] > , ..... ) ; Pl. - A Rendelés táblázat létrehozása CREATE TABLE Rendelés ( Rsz Number(6) PRIMARY KEY, Dátum Date , Termék CHAR(20) NOT NULL ) ; 2.b. Táblázat törlése DROP TABLE R ; 4.a Látvány (VIEW) létrehozása CREATE VIEW V(A1,A2,....An) AS <lekérdezés> ; V virtuális táblázat létrehozása. A látvány definícióját tárolja a rendszer, minden hivatkozáskor kiértékeli, tehát mindig az aktuális adatokat tartalmazza. Pl. - A rendelések minden adatát tartalmazó látvány CREATE VIEW REN_TET(Név,Dátum,Termék,Mennyiség) AS SELECT Vnev, Dátum, Termék, Mennyiség FROM Rendelés, Tétel WHERE Rendelés.Rsz=Tétel.Rsz ; Ha a látvány oszlopneveinek a SELECT eredménylistájának fejléce megfelelő, akkor nem szükséges megadni. Definiálás után a látvány a lekérdezésekben úgy kezelhető, mint az alaptáblázatok. Az adatmódosítás csak megkötésekkel lehetséges. 3.b. Látvány törlése DROP VIEW V ; Látvány törlésekor az alaptáblázatok nem törlődnek. Feladat - A vásárlók nevét és az általuk leadott rendelések számát tartalmazó lista - A vásárlók nevét és az általuk rendelt termékek értékét tartalmazó lista Az SQL használata - prompt (dBase IV SQL mode, SqlPlus ...) - az adatbázis-kezelő rendszer segédprogramjaival (sqlquery, sqldba ...) - saját programokból Saját programból való használat Relációs adatbázisban tárolt adatokat (is) használó, valamely gazdanyelven írt program. A program olyan Sql hívásokat tartalmaz, amely az adatbázist kezeli. A program saját adatterülete és a relációs adatbázis közti adatcsere biztosított. Gazdanyelv lehet : C , Pascal , Fortran, Ada .... ( prog.pc ) Sql hívások PRECOMPILER ( prog.c ) Sql library hívások COMPILER LOADER/LINKER SQL Library ( prog ) Adatcsere a program és az adatbázis között : a., közös változókon keresztül, amelyek az Sql hívásokban konstansként szerepelhetnek. Külön deklarációjuk van. Hivatkozás az sql utasításokban - :<változónév> EXEC SQL BEGIN DECLARE SECTION ; ....... EXEC SQL END DECLARE SECTION ; b., kommunikációs területen keresztül Az adatbázis-kezelő üzenetei itt tárolódnak, kezelésére saját hibakezelő rutinok léteznek. A végrehajtás ideje alapján megkülönböztethetünk : a., Azonnal végrehajtásra kerülő utasítás EXEC SQL EXECUTE IMMEDIATE S ; ahol S nem lekérdezés Pl. EXEC SQL EXECUTE IMMEDIATE INSERT INTO Rendeles VALUES (:rendsz, :nap , :nev) ; b., előkészítés után végrehajtásra kerülő utasítás EXEC SQL PREPARE U FROM < S | :t > ; .... EXEC SQL EXECUTE U USING :a1, :a2 ..., :ak ; ahol U - hivatkozás az utasításra S - SQL utasítás, EXECUTE végrehajtás esetén nem lehet SELECT :t - karakteres változó, amely az utasítást mint string tartalmazza. EXECUTE végrehajtás esetén nem lehet SELECT :a1, :a2 ..., :ak : az utasításban használt változók listája Hatékony többször is végrehajtásra kerülő utasítások esetén, mert ebben az esetben csak egyszer kell értelmezni az utasítást, míg azonnali végrehajtás esetén minden alkalommal. Lekérdezés (SELECT) beágyazott használata A lekérdezés eredményére történő hivatkozás változók használatával történik. A több eredménysort adó lekérdezések kezelése un. CURSOR -okon keresztül. A cursor használatával "végig tudunk lépkedni" az eredmény sorain, az egyes sorok mezőit változókba beolvasni. Használatának lépései : 1. EXEC SQL PREPARE U FROM S ; 2. EXEC SQL DECLARE C CURSOR FOR U ; 3. EXEC SQL OPEN C ; 4. EXEC SQL WHENEVER NOTFOUND GOTO cimke ; 5. WHILE (1) { EXEC SQL FETCH C INTO :a1, ... ak; } 6. EXEC SQL CLOSE C ; ahol 1. a lekérdezés előkészítése, S egy lekérdezés 2. a cursor deklarálása, C a cursor neve 3. a cursor megnyitása, a lekérdezés végrehajtása 4. a cursor kezeléséhez a "nincs több adat" deklarálása. Cursor vége esetén ugrás a cimkére 5. az adatok ciklikus kiolvasására k mezős eredménylista esetén 6. a cursor bezárása
egy 1.sql állomámy tartalma
-- CEGNEV VAROS IRSZAM UTCA TELEFON FAX ALKALMAZOTTAK ALAPTOKE VEZETO DROP DATABASE IF EXISTS ceginfo; CREATE DATABASE ceginfo; USE ceginfo; CREATE TABLE ceglista ( cegnev varchar(60), varos varchar(15), irszam int, utca varchar(60), telefon varchar(20), fax int, alkalmazottak int, alaptoke int, vezeto varchar(50) ); LOAD DATA INFILE 'c:\\kriszttamas.csv' INTO TABLE ceglista FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'; SELECT cegnev as "Listázd ki a NEM budapesti cégeket." from ceglista where varos not like '%Budapest%'; SELECT cegnev as "Listázd ki azokat a cégeket, amelyek kevesebb, mint 100 alkalmazottat foglalkoztatnak és alaptőkéjük kevesebb, mint 10 millió Ft." from ceglista where alkalmazottak<100 and alaptoke<10000000; SELECT cegnev as "Melyek azok a cégek, amelyeknek a telefon és faxszáma megegyezik?" from ceglista where telefon=fax; SELECT cegnev as "Listázd ki a 3 legnagyobb tőkével rendelkező céget alaptőke szerint csökkenő sorrendben!" from ceglista order by alaptoke desc limit 0,3; SELECT cegnev as "Melyik cég székhelye van a Kékvirág utcában?" from ceglista where utca like '%Kékvirág%'; SELECT count(cegnev) as "Hány cég telephelye van a Bécsi úton?" from ceglista where utca like '%Bécsi%'; -- A "BBB Bank Rt." cég vezetője "Dr. Nagy László" legyen. UPDATE ceglista set vezeto='Dr. Nagy László' where cegnev='BBB Bank Rt.'; -- Cseréld le az elírt "Budapets" városneveket "Budapest"-re. UPDATE ceglista set varos='Budapest' where varos='Budapets'; -- Megszűnt a "ZAZASZINT Kft.". Töröld az adatbázisból! DELETE from ceglista where cegnev like '%ZAZASZINT Kft.%'; -- Töröld azokat a cégeket, akiknek nincs alkalmazottjuk! DELETE from ceglista where alkalmazottak=0;
Nincsenek megjegyzések:
Megjegyzés küldése