SQL 1 SEQUEL, Structured English Query Language: SQL ANSI, ISO: SQL86, SQL89, SQL92. Alap (entry), közbenső (intermediate), teljes (full) szint. A DDL nyelvi komponenssel létrehozhatók és módosíthatók a különböző relációk, domainek és integritási feltételek. DML csoport utasításaival elvégezhető a táblázatokban tárolt adatok módosítása, törlése és az új adatok felvitele. Lekérdező utasítások: Query. Az SQL: - relációs RDBMS kezelő nyelv szabvány, nem RDBMS, - relációs algebrán alapszik, - szöveges, nem algoritmikus, előíró jellegű utasításokat tartalmaz, - halmazorientált, - négy utasításcsoportot tartalmaz: - adatdefiníciós, DDL, - adatlekérdező, Query, - adatkezelő, DML, - adatvezérlő, DCL, - kiadható interaktívan és algoritmikus környezetbe építve.
SQL DDL 2 A példáknál használt táblák: AUTO TULRSZTIPSZINEVJAR bkx720Opelbordo cmt111Golfpiros aaa156Trabifeher lui999Opelkek kjs234Ladakek EMBER IDNEVSZULEVCIM Bela1975Budapest 2Geza1979Miskolc 3Feri1974Pecs
SQL DDL 3 Táblák létrehozása: CREATE TABLE táblanév (m1 t1 [i1][,..., mi ti [ii]],[ig]); ii integritási feltétel: UNIQUE, NOT NULL UNIQUE (m1 [,m2..,mi]) Adattípusok: CHAR (n) : n hosszúságú szöveg NUMBER (n [,m]) : n hosszú számjegy, melyből m a tizedesjegyek hossza DATE : dátum CREATE TABLE AUTO (TUL NUMBER(3) NOT NULL, RSZ CHAR(7) NOT NULL UNIQUE, TIP CHAR(10), SZIN CHAR(10), EVJ NUMBER(4), AR NUMBER(8)); CREATE TABLE EMBER (ID NUMBER(3) NOT NULL UNIQUE, NEV CHAR(20), SZULEV NUMBER(4), CIM CHAR(20));
SQL DDL 4 Tábla törlése: DROP TABLE táblanév; Pl. DROP TABLE auto; View létrehozása: CREATE VIEW viewnév [(m1 [,m2...,mi])] AS műveletsor; Pl. CREATE VIEW auto2 AS SELECT rsz FROM auto WHERE tip LIKE 'Fiat%'; View törlése: DROP VIEW viewnév;
SQL DML 5 Rekordok felvitele: INSERT INTO táblanév VALUES (e1 [,e2...,ei]); Pl. INSERT INTO auto VALUES (3,'bhk546','Fiat','kek',1989,NULL); INSERT INTO táblanév műveletsor; A művelet egy SELECT lekérdezési utasítás lehet.
SQL DML 6 Rekordok törlése: DELETE FROM táblanév [ WHERE feltétel]; A feltételben logikai műveletek: AND, OR, NOT és relációs operátorok: =, >, =,, BETWEEN, IN, LIKE, IS NULL o1 BETWEEN o2 AND o3 o1 IN (o2 [,o3...,oi]) o1 LIKE 'sssss' [ESCAPE 'x'] Az 'sssss' mintában: % : egy tetszőleges karaktersorozatot helyettesít _ : egyetlen egy karaktert helyettesít o1 LIKE 'DOS^_%' ESCAPE '^'
SQL DML 7 o1 IS NULL o1 NOT BETWEEN o2 AND o3 o1 NOT IN (o2 [,o3...,oi]) o1 NOT LIKE 'sssss' [ESCAPE 'x'] o1 IS NOT NULL Az relációs operátorok operandusai, az o1,o2,..., oi értékei jelenthetnek konstansokat, és jelenthetnek mezőket is. Az operátorok nagy része különböző rendszerspecifikus függvényben valósul meg. Pl. DELETE FROM auto WHERE tip LIKE 'Trabant%' OR ar < ; DELETE FROM auto; (Minden rekordot töröl!)
SQL DML 8 Rekordok módosítása: UPDATE táblanév SET m1=e1 [,m2=e2...,mi=ei] [WHERE feltétel]; Pl. UPDATE auto SET ar = 1.25*ar WHERE tip LIKE 'Fiat%';
SQL SELECT 9 Projekció: SELECT m1 [,m2...,mi] FROM táblanév; Pl. SELECT rsz FROM auto; RSZ bkx-720 cmt-111 aaa-156 lui-999 kjs-234 SELECT nev,cim FROM ember; NEV CIM Bela Budapest Geza Miskolc Feri Pecs
SQL SELECT 10 SELECT * FROM auto; ID NEV SZULEV CIM Bela 1975 Budapest 2 Geza 1979 Miskolc 3 Feri 1974 Pecs SELECT DISTINCT tip FROM auto; TIP Golf Lada Opel Trabi Kiterjesztés: SELECT rsz, tip, ar/ FROM auto;
SQL SELECT 11 Szelekció: SELECT.... FROM... WHERE feltétel; Pl. SELECT rsz FROM auto WHERE szin = 'piros'; RSZ cmt-111 SELECT nev FROM ember WHERE szulev<1977; NEV Bela Feri
SQL SELECT 12 SELECT * FROM auto WHERE szin<>'piros'; TUL RSZ TIP SZIN EVJ AR bkx-720 Opel bordo aaa-156 Trabi feher lui-999 Opel kek kjs-234 Lada kek SELECT * FROM ember WHERE szulev BETWEEN 1975 AND 1980; ID NEV SZULEV CIM Bela 1975 Budapest 2 Geza 1979 Miskolc
SQL SELECT 13 SELECT rsz FROM auto WHERE szin IN ('piros','kek','zold'); RSZ cmt-111 lui-999 kjs-234 SELECT * FROM ember WHERE cim IS NULL; ID NEV SZULEV CIM SELECT * FROM ember WHERE nev LIKE 'G%'; ID NEV SZULEV CIM Geza 1979Miskolc
SQL SELECT 14 SELECT * FROM ember WHERE nev LIKE '_eza%'; ID NEV SZULEV CIM Geza 1979 Miskolc SELECT * FROM ember WHERE nev LIKE '%ez%'; ID NEV SZULEV CIM Geza 1979 Miskolc SELECT nev,2004-szulev FROM ember; NEV 2004-SZULEV Bela 29 Geza 25 Feri 30
SQL SELECT 15 SELECT tip, ar/150 FROM auto; TIP AR/ Opel Golf Trabi Opel 3000 Lada SELECT... FROM... [WHERE...] ORDER BY k1 [ASC|DESC][,k2 [ASC|DESC]...,ki[ASC|DESC]]; Pl. SELECT * FROM auto WHERE szin<>'piros' ORDER BY szin DESC, tip; TUL RSZ TIP SZIN EVJ AR kjs-234 Lada kek lui-999 Opel kek aaa-156 Trabi feher bkx-720 Opel bordo
SQL SELECT 16 Csoportképzés: MIN(k) : minimumérték MAX(k) : maximumérték AVG(k) : átlagérték SUM(k) : összeg COUNT(k): darabszám SELECT... FROM... [WHERE...] GROUP BY k [ORDER BY..]; Pl. SELECT tip, AVG(ar) FROM auto GROUP BY tip; SELECT... FROM... [WHERE...] GROUP BY... HAVING feltétel [ORDER BY..]; Pl. SELECT tip, AVG(ar) FROM auto GROUP BY tip HAVING AVG(ar) < ;
SQL SELECT 17 SELECT AVG(evj) FROM auto; AVG(EVJ) SELECT MIN(evj) FROM auto; MIN(EVJ) SELECT SUM(ar) FROM auto; SUM(AR)
SQL SELECT 18 SELECT tip, COUNT(tip) FROM auto GROUP BY tip; TIP COUNT(TIP) Golf 1 Lada 1 Opel 2 Trabi 1 SELECT tip, AVG(ar) FROM auto GROUP BY tip; TIP AVG(AR) Golf Lada Opel Trabi
SQL SELECT 19 SELECT tip,AVG(evj) FROM auto GROUP BY tip HAVING AVG(evj)>1986; TIP AVG(EVJ) Lada 1989 Opel 1991 SELECT tip FROM auto WHERE szin='kek' GROUP BY tip HAVING AVG(evj)>1990; TIP Opel
SQL SELECT 20 SELECT tip FROM auto GROUP BY tip ORDER BY COUNT(*); TIP Golf Lada Trabi Opel
SQL SELECT 21 Join: SELECT * FROM táblanév1, táblanév2; CREATE TABLE ember (kod NUMBER(4), nev CHAR(30), cim CHAR(30)); (az ember tábla kissé módosítva) SELECT rsz, nev, cim FROM auto, ember WHERE tulaj = kod; SELECT auto.rsz, ember.nev, ember.cim FROM auto, ember WHERE auto.tulaj = ember.kod; SELECT a.rsz, e.nev, e.cim FROM auto a, ember e WHERE a.tulaj = e.kod;
SQL SELECT 22 Példák: SELECT a.rsz, e.nev FROM auto a,ember e WHERE a.tul = e.id; RSZ NEV bkx-720 Bela cmt-111 Bela kjs-234 Bela aaa-156 Geza lui-999 Feri SELECT a.rsz,e.nev FROM auto a,ember e WHERE a.evj < 1991 AND a.tul = e.id; RSZ NEV cmt-111 Bela kjs-234 Bela aaa-156 Geza
SQL SELECT 23 SELECT e.nev,COUNT(*) FROM ember e, auto a WHERE a.tul = e.id GROUP BY e.nev; NEV COUNT(*) Bela 3 Feri 1 Geza 1 SELECT e.nev FROM ember e, auto a WHERE a.tul = e.id GROUP BY e.nev HAVING COUNT(*)>1; NEV Bela
SQL SELECT 24 Allekérdezés (subquery): Egy lekérdezés szelekciós feltételében hivatkozhatunk egy másik lekérdezés eredményére, amit allekérdezésnek (subquery) neveznek. Az allekérdezést mindig zárójelben kell megadni. Az allekérdezés formailag megegyezik a normál SELECT utasítás alakjával, de az allekérdezésben nem használható a rendezett kiírást előíró ORDER BY opció. Az allekérdezés eredménye több rekordot is tartalmazhat, ezért csak a halmazokat kezelő operátorokat és logikai kvantorokat használhatunk a feltételekben: IN, EXISTS, NOT EXISTS, ANY, ALL. EXISTS (allekérdezés) Ha az allekérdezés eredménytáblája nem üres, akkor a fenti kifejezés igaz értéket ad vissza. Tagadása: NOT EXISTS (allekérdezés) Pl. SELECT e.nev FROM ember e WHERE NOT EXISTS (SELECT * FROM auto a WHERE a.tulaj=e.kod); SELECT e.nev FROM ember e WHERE e.kod NOT IN (SELECT a.tulaj FROM auto a); {optimalizálható!}
SQL SELECT 25 kif reláció_operátor ANY (halmaz) akkor igaz értékű, ha a halmaznak legalább egy elemére igaz értékű a kif reláció_operátor halmezelem kifejezés. kif reláció_operátor ALL (halmaz) akkor ad igaz értéket, ha a halmaznak minden elemére teljesül a kif reláció_operátor halmezelem kifejezés. Pl. SELECT nev, cim FROM ember WHERE id IN (SELECT tul FROM auto WHERE szin = 'kek'); NEV CIM Bela Budapest Feri Pecs
SQL SELECT 26 SELECT nev,cim FROM ember WHERE id NOT IN (SELECT tul FROM auto); NEV CIM SELECT * FROM auto WHERE ar < (SELECT AVG(ar) FROM auto); TUL RSZ TIP SZIN EVJ AR cmt-111 Golf piros aaa-156 Trabi feher kjs-234 Lada kek SELECT * FROM auto a WHERE a.ar > ANY (SELECT b.ar FROM auto b); TUL RSZ TIP SZIN EVJ AR bkx-720 Opel bordo cmt-111 Golf piros lui-999 Opel kek kjs-234 Lada kek
SQL SELECT 27 Két azonos felépítésű tábla egymáshoz fűzhető: SELECT... UNION SELECT...; A bemutatott opciók, lehetőségek bizonyítják, hogy milyen rugalmasan használható az SQL SELECT utasítása, és kellő kreativitással szinte minden lehetséges lekérdezési igény kielégíthető. Az SQL prescriptív jellege miatt ismernünk kell az elvégzendő műveleteket, mielőtt kiadnánk a megfelelő SQL utasítást. Összetettebb esetekben különböző utakon is el lehet jutni az eredménytáblákhoz, de ezek a végrehajtás hatékonyságában esetleg különbözhetnek egymástól.
SQL DCL 28 Az adatbázis több felhasználó információit együttesen tárolja, ezért az RDBMS-nek kell gondoskodnia arról, hogy mindenki csak a jogosult műveleteket végezhesse el, csak a jogosult adatokhoz férhessen hozzá. A SQL rendszerekben minden objektumnak van egy tulajdonosa, mégpedig az a felhasználó, aki azt létrehozta. A táblákon elvégezhető műveleteket jogosultság ellenőrzése szempontjából az alábbi csoportokba bontjuk: SELECT : tábla lekérdezése INSERT : tábla bővítése DELETE : tábla rekordjainak törlése UPDATE(m1 [,m2...,mi]) : tábla rekordjainak módosítása ALL { az előző négyet jelenti } Az jogosultságok megadása a GRANT utasítással történik, melyben meg kell adni, hogy mely táblára, mely műveleteket és kinek engedélyezünk: GRANT művelet ON táblanév TO felhasználó [WITH GRANT OPTION];
SQL DCL 29 A kiadott jogosultságok megszüntetése a REVOKE utasítással végezhető, melyben meg kell adni a felhasználót, a visszavont műveleteket és a vonatkozó táblát is. Az utasítás alakja: REVOKE művelet ON táblanév FROM felhasználó; Az a felhasználó vonhatja vissza a jogosultságokat, akinek joga van azt adományozni, azaz a tulajdonos. Pl. GRANT SELECT ON auto TO gi476; REVOKE ALL FROM gi476;
SQL DCL 30 A vezérlő utasításokhoz tartoznak a műveletvégrehajtást szabályozó, úgynevezett tranzakció kezelő utasítások is. A tranzakció sikeres befejezésének utasítása: COMMIT; Hatására a korábban végrehajtott tevékenységek véglegesítődnek, megőrződnek az adatbázisban. A ROLLBACK; utasítás hatására a korábbi tevékenységek érvénytelenítődnek, mintha ki sem adtuk volna őket. Ezzel hibával félbeszakadt vagy hibás műveletsort lehet töröltetni.
SQL VIEW példák 31 CREATE VIEW embaut AS SELECT a.rsz, a.tip, e.nev FROM auto a, ember e WHERE a.tul = e.id; SELECT * FROM embaut; RSZ TIP NEV bkx-720 Opel Bela cmt-111 Golf Bela aaa-156 Trabi Geza lui-999 Opel Feri kjs-234 Lada Bela SELECT nev FROM embout WHERE tip LIKE ‘O%’; NEV Bela Feri DROP VIEW embaut;