Adatbázis rendszerek 1. 4. Ea: Eskúel Structured Query Language 1/83 B ITv: MAN 2017.10.24
Témakörök SQL alapok DDL utasítások DML utasítások DQL utasítás DCL utasítások Gyakorló feladatok Ellenőrző kérdések 2/83
Az SQL jellemzése Az SQL a relációs adatbázis-kezelők szabványosított adatmanipulációs és lekérdező nyelve A relációs algebrára épül Nem algoritmikus: Parancsnyelv jellegű, megfogalmazhatjuk, mit akarunk csinálni, de a megoldási algoritmust nem kell megadni. Nincsenek benne ciklusok, feltételes elágazások, stb. Mintaillesztéses, halmazorientált: A táblákat mint a sorok (rekordok) halmazát tekintjük. Az adott utasításban megfogalmazott feltételnek eleget tevő összes sor részt vesz a műveletben Adatok keresésekor nem azok helyét, hanem azok tulajdonságát adjuk meg, így általában több adatot 3/83kapunk eredményül
Az SQL jellemzése 2. Szabványos: Illeszkedik az SQL szabványhoz. A szabványban van egy SQL utasításcsoport, amelyet minden SQL alapú szoftver implementációnak meg kell valósítani, de mindegyik implementáció plusz lehetőséget is nyújt a standard SQLhez képest, felülről kompatibilis a szabvánnyal Fontosabb használati módjai: Önállóan, fejlesztő eszközökben: pl.: SQL*Plus, Beágyazva procedurális programozási nyelvekbe. pl.: C/C++, Pascal Az SQL nem DBMS! 4/83
Az SQL jellemzése 3. Az SQL által lefedett területek: DDL: Data Definition Language adatstruktúra definiáló utasítások adatbázisok, táblák létrehozása, módosítása és törlése DML: Data Manipulation Language adatokon műveletet végző utasítások adatok rögzítése, módosítása, törlése DQL: Data Query Language adat lekérdező utasítás DCL: Data Control Language adatvezérlő, felügyelő utasítások tranzakciók kezelése, jogosultságok menedzselése 5/83
Az SQL használata Tipikus műveleti sorrend: Objektumok, táblák létrehozása, adatok felvitele, adatok lekérdezése, adatok módosítása, szerkezetek módosítása, működési környezet beállítása. Rendszám Típus Szín Kor Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 JED-123 Nissan Ezüst 5 ABC-765 Opel Fehér 6 6/83 AKT-392 Trabant Kék 32
Szintaxis Kisbetű és nagybetű a nyelv alapszavaiban egyenértékű. Utasítások sorfolytonosan írhatók, lezárás pontosvesszővel. Szövegkonstans: 'szöveg' Változó nincs, csak tábla- és oszlopnevekre lehet hivatkozni. Kifejezésben hivatkozás egy tábla adott oszlopára: tábla.oszlop (ha a tábla egyértelmű, akkor elhagyható). Logikai műveletek: AND, OR, NOT Az utasítások szintaxisának leírásánál az elhagyható részleteket szögletes zárójelek között vannak. 7/83
Az SQL utasítások csoportosítása DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER DML: - rekord felvitel INSERT - rekord törlés DELETE - rekord módosítás UPDATE DQL: - lekérdezés SELECT DCL: - védelem GRANT, REVOKE - tranzakció kezelés COMMIT, ROLLBACK 8/83
Témakörök SQL alapok DDL utasítások DML utasítások DQL utasítás DCL utasítások Gyakorló feladatok Ellenőrző kérdések 9/83
DDL Adatstruktúra definiáló utasítások DDL Data Definition Language Adatszerkezetek (elsősorban táblák) létrehozása, módosítása, törlése Egy tábla szerkezete, sémája a táblához tartozó mezőkkel egyértelműen megadható A mezők megadása a mező nevének és a mező adattípusának, valamint az integritási feltételeknek a kijelölésével történik Több tábla is létezhet ugyanazzal a szerkezettel, de a nevük nem lehet egyforma 10/83
Tábla (vagy más objektum) létrehozása CREATE objektumtípus objektumnév paraméterek; CREATE TABLE táblanév ( mezőnév adattípus [integritási feltétel], mezőnév adattípus [integritási feltétel], mezőnév adattípus [integritási feltétel] [,további integritási feltételek] ); CREATE TABLE Autó ( Rendszám char(7) PRIMARY KEY, Típus char(25) NOT NULL, Szín char(15) DEFAULT 'Fehér', Kor number(3) CHECK (Kor >= 0) ); 11/83 Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 JED-123 Nissan Ezüst 5 AKT-392 Trabant Kék 32
Tábla (vagy más objektum) létrehozása Kód 1 2 3 Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék CREATE SEQUENCE k_s; insert into Autó values (k_s.nextval, CREATE INDEX RIndex ON Autó (Rendszám); Rendszám AKT-392 GBC-765 JED-123 Kód 3 1 2 CREATE VIEW OpelAutó AS Select Kód, Rendszám, Szín FROM Autó Where Tipus='Opel'; Kód 1 Rendszám GBC-765 Szín Fehér 12/83
Adattípusok Alap adattípusok: Char(n) n hosszúságú karaktersorozat, Number(n,m) n jegyű decimális szám, ebből m tizedes jegy; Number(8,2) 12345,12 Date dátum. További típusok (DBMS függő!): INTEGER egész szám (röviden INT) REAL valós (lebegőpontos) szám Time időpont Boolean logikai 13/83
Integritási feltételek megadása Primary key elsődleges kulcs References hivatkozás másik táblára Foreign key (mezőlista) References táblanév(mezőlista) idegen kulcs megadása ha a kulcs több mezőből áll Not null nem maradhat üresen a mező, kötelező kitölteni Unique a mező egyedi, nem kerülhet bele két egyforma érték Default alapérték megadása Check értékellenőrzés 14/83
Adattáblák létrehozása Megszorítások Create table Melós( IDM int, IDM int Primary key, Check (IDM > 1000), IDM int Default '29', Unique (IDM), Index (IDM), Foreign key (IDM) references Munkakör(Mkód), ); 103/15
Példák MySQL! CREATE TABLE pld1 ( id INT PRIMARY KEY, nev VARCHAR(100), datum DATE, suly FLOAT(8,5)); CREATE TABLE pld2 ( az INT PRIMARY KEY, hely VARCHAR(100), darab INT(10) UNSIGNED, Foreign key (az) references pld1(id)); CREATE TABLE pld3 ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, nev VARCHAR(50) NOT NULL, darab INT(10) unsigned not null default '0', idopont TIMESTAMP(8) DEFAULT NOW(), Unique (nev) ) TYPE=innodb; 103/16
Példák Oracle! CREATE TABLE pld1 ( id INT PRIMARY KEY, nev VARCHAR(100), datum DATE, suly FLOAT(8)); CREATE TABLE pld2 ( az INT PRIMARY KEY, hely VARCHAR(100), darab NUMBER(10), Foreign key (az) references pld1(id)); CREATE SEQUENCE id_seq; CREATE TABLE pld3 ( id INT default id_seq.nextval PRIMARY KEY, nev VARCHAR(50) NOT NULL, darab NUMBER(10) default '0' NOT NULL, idopont TIMESTAMP DEFAULT SYSDATE, Unique 103/17 (nev)); Fontos a sorrend!
Tábla módosítása ALTER TABLE táblanév [ADD (újelem,..., újelem)] [MODIFY (módosítás,..., módosítás)] [DROP (oszlop,..., oszlop)]; újelem: egy "oszlopnév adattípus [feltétel] csoport módosítás: "oszlopnév adattípus [feltétel] ALTER TABLE Autó ADD Tulaj varchar(35); Fontos: a mezők mérete általában csak növelhető! RENAME táblanév TO újtáblanév 18/83 Tábla átnevezése
Tábla módosítása create table személy( id number(4), név varchar(30)); ALTER TABLE személy ADD szülév number(4); ALTER TABLE személy RENAME COLUMN szülév TO szüldátum; ALTER TABLE személy MODIFY szüldátum date; ALTER TABLE személy MODIFY id primary key; DESC személy; ALTER TABLE személy DROP primary key; ALTER TABLE személy DROP COLUMN szüldátum; RENAME személy TO person; 19/83
Tábla módosítása comment on column person.id is '100 és 300 közötti adatok'; ALTER TABLE person MODIFY név default 'Kis Béla'; ALTER TABLE person MODIFY NÉV DEFAULT NULL; 20/83
Tábla módosítása: megszorítások Javaslat ALTER TABLE person ADD CONSTRAINT cn1 PRIMARY KEY(id); ALTER TABLE person ADD CONSTRAINT cn2 UNIQUE (név) ALTER TABLE person ADD CONSTRAINT cn3 CHECK (id > 200) create table department( dpno int, dpname varchar(30)); ALTER TABLE department ADD CONSTRAINT cn4 primary key(dpno); ALTER TABLE person ADD dp int; ALTER TABLE person ADD CONSTRAINT cn5 FOREIGN KEY (dp) REFERENCES department(dpno); ALTER TABLE person DROP CONSTRAINT cn1; 21/83
Megszorítások listázása SELECT * FROM user_constraints WHERE table_name = 'PERSON' 22/83 C check constraint on a table P primary key U unique key R referential integrity V with check option, on a view O with read only, on a view Csupa nagybetű!
Tábla törlése DROP TABLE táblanév; Azok a táblák amelyekre más tábla hivatkozik, nem törölhetők! DROP TABLE Autó; 23/83
Vedd észre! Táblák létrehozási sorrendje 1. Először azokat a táblákat kell létrehozni, amelyekből nem hivatkozunk más táblákra 2. Azután azokat, amelyekből hivatkozunk más táblákra 1 Kategoria Termek 2 Kkod Nev Kategoria Tkod Nev Ar Leiras Vasarlas Tkod Sorszam Idopont Darab VID 5 4 Vasarlo VID Nev Cim Fizmod FizModok Fkod Leiras 3 24/83
Vedd észre! Táblák törlési sorrendje 1. Először azokat a táblákat lehet törölni, amelyekből hivatkozunk más táblákra 2. Azután azokat, amelyekből nem hivatkozunk más táblákra 5 Kategoria Termek 4 Kkod Nev Kategoria Tkod Nev Ar Leiras Vasarlas Tkod Sorszam Idopont Darab VID 1 2 Vasarlo VID Nev Cim Fizmod FizModok Fkod Leiras 3 25/83
Lehetőségek Tábla létrehozása másolással (új táblanévvel) CREATE TABLE Személyek AS SELECT * FROM Person; Person ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Személyek ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Üres tábla létrehozása másolással Create table Személyek as select * from Person WHERE 1=0; 26/83 Person ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Személyek ID Név Dp
Lehetőségek Üres tábla létrehozása másolással, eltérő szerkezettel CREATE TABLE Személyek AS SELECT id, név FROM Person WHERE 1=0; Person ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Személyek ID Név 27/83
Lehetőségek Tábla létrehozása több táblából create table Személyek as select ID, Név as NAME, DPNAME from Person join Department on dp=dpno Person ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Department DpNo 10 11 DpName Designer Programmer 28/83 Személyek ID Name DpName 1 2 3 Kis Béla Kő Dezső Hó Jenő Designer Programmer Designer
Témakörök SQL alapok DDL utasítások DML utasítások DQL utasítás DCL utasítások Gyakorló feladatok Ellenőrző kérdések 29/83
DML adatokon műveletet végző utasítások DML Data Manipulation Language Rekordok (sorok) beszúrása (felvitele) Mezők értékének módosítása Rekordok törlése 30/83
Rekordok beszúrása INSERT INTO táblanév [(oszloplista)] VALUES (értéklista); INSERT INTO Autó VALUES ('AKT-392', 'Trabant', 'Kék', 32); Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 JED-123 Nissan Ezüst 5 Az oszloplista elhagyható, de ekkor az összes mező értékét meg kell adni, a megfelelő sorrendben! INSERT INTO Autó (Rendszám, Típus, Kor) VALUES ('ASD-602', 'Mazda', 7); INSERT INTO Autó VALUES ('ALM-332', 'Renault', Null, 8); INSERT INTO Autó VALUES ('IJK-222', 'Lada', Default, 25); 31/83
Mezők értékének módosítása UPDATE táblanév SET mező = kifejezés,..., mező = kifejezés [ WHERE feltétel ]; A feltételnek eleget tevő mezők módosulnak, Where feltétel nélkül minden mezőt módosít! UPDATE Autó SET Kor=10 WHERE Rendszám='JED-123'; UPDATE Autó SET Szín= 'Barna'; UPDATE Autó SET Kor=10, Szín='Kék' WHERE Rendszám='JED-123'; A mezőben lévő aktuális érték is felhasználható: 32/83 UPDATE Autó SET Ár = Ár * 1.2 WHERE Ár<1000000;
Rekordok törlése DELETE FROM táblanév [ WHERE feltétel ]; Where feltétel nélkül minden sor törlődik! DELETE FROM Autó WHERE Kor>15; 33/83
Témakörök SQL alapok DDL utasítások DML utasítások DQL utasítás DCL utasítások Gyakorló feladatok Ellenőrző kérdések 34/83
DQL utasítások Projekció Szelekció Feltételek megfogalmazása Rendezés a lekérdezésben Aggregáció a lekérdezésben Csoportképzés a lekérdezésben Join Halmazműveletek Al-select 35/83
DQL Adat lekérdező utasítás Az SQL nyelvben egyetlen parancs, a SELECT parancs szolgál az adatok lekérdezésére Alkalmas a relációs algebra minden műveletének a leképzésére Feladata: Egy vagy több adattáblából egy eredménytábla előállítása, amely a képernyőn listázásra kerül, vagy más módon használható fel. SELECT [DISTINCT] oszloplista FROM táblanévlista [WHERE feltétel]; DISTINCT: Az eredménytáblában az ismétlődő rekordokból csak egy jelenik meg. 36/83
Projekció (vetítés) Projekció: csak a kijelölt mezők jelennek meg az eredmény relációban. Jele: mezőlista (r) Megvalósítása: SELECT mezőnévlista FROM táblanév; Rendszám Típus Szín Kor Ár GBC-765 Opel Fehér 6 1200000 JED-123 Nissan Ezüst 5 1500000 AKT-392 Trabant Kék 32 25000 SELECT Rendszám, Típus FROM autó; SELECT * FROM autó; SELECT Típus, Ár/280 As EuroÁr FROM autó; Típus Opel Nissan Trabant EuroÁr 4285 5357 89 37/83
Szelekció (kiválasztás) Szelekció: a megadott feltételnek eleget tévő rekordok kerülnek át az eredmény relációba. Jele: felt (r) Megvalósítása: SELECT [DISTINCT] * FROM táblanév WHERE feltétel; SELECT * FROM autó WHERE Kor<10; Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 JED-123 Nissan Ezüst 5 Ár 1200000 1500000 38/83
Feltételek megfogalmazása Használható operátorok: Relációs operátorok (=,!=, <, >,!<,!>, <>, <=, >=) Algebrai operátorok (+,-,*,/) Logikai operátorok (AND, OR, NOT) Speciális logikai kifejezések: x IS NULL: igaz, ha az x mező értéke NULL. x BETWEEN a AND b: igaz, ha a x b. x IN halmaz: igaz, ha x megegyezik a megadott halmaz egy elemével. x LIKE minta: igaz, ha az x karaktersorozat megfelel a megadott mintának. Helyettesítő karakterek: _ - egy karakter, % - tetszőleges számú karakter 39/83
Példák szelekciós feltételekre Ember: Név Cím Szül_Év Kis Géza Eger 1983 Autó: Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 Ár 1200000 SELECT * FROM Ember WHERE Szül_Év BETWEEN 1975 AND 1980; SELECT * FROM Ember WHERE Cím IS NULL; SELECT * FROM Ember WHERE Név LIKE 'B%'; SELECT * FROM Ember WHERE Név LIKE %_Géza%'; SELECT Rendszám FROM Autó WHERE Szín IN ('piros', 'kék', 'fehér'); SELECT Rendszám,Típus FROM Autó WHERE Ár < 1000000 AND Szín NOT LIKE '%lila%'; SELECT Rendszám FROM Autó WHERE Rendszám LIKE '_ER-6%'; SELECT Rendszám FROM Autó WHERE Rendszám LIKE '%0' or Rendszám LIKE '%2' or Rendszám LIKE '%4' or Rendszám LIKE '%6' or Rendszám LIKE '%8'; 40/83
Szelekciós függvények Oracle! ABS(n): abszolút é'rték Példa: ABS(-15) = 15 LOWER(char): konverzió kisbetűsre. Példa: LOWER('Kovács') = 'kovács' UPPER(char): konverzió nagybetűsre. Példa: UPPER('Kovács') = 'KOVÁCS' INITCAP(char): konverzió nagy kezdőbetűsre. Példa: INITCAP('kovács') = 'Kovács' LTRIM(char): balról szóközök eltávolítása. Példa: LTRIM(' alma ') = 'alma ' RTRIM(char): jobbról szóközök eltávolítása. 41/83 Példa: RTRIM(' alma ') = ' alma'
Szelekciós függvények 2. Oracle! SUBSTR(char, m[, n]): a char string m-edik karakterétől n hosszú részstringet ad vissza. (Ha n nem szerepel, akkor a végéig.) Az első karakter 1-es sorszámú. Példa: SUBSTR('ABCDEFG',2,3) = 'BCD' TO_CHAR(n): konverzió numerikusról vagy dátumról karakteresre. Példa: TO_CHAR(123) = '123' TO_DATE(char): konverzió karakteresről dátumra. Példa: TO_DATE('15-JAN-06') TO_NUMBER(char): konverzió karakteresről numerikusra. Példa: TO_NUMBER('123') = 123 SQRT(kifejezés): Négyzetgyök, numerikus kifejezésre vonatkozik. Példa: SQRT(16) = 4 42/83
A függvények kipróbálása Oracle! select upper('kiskutya') from dual KISKUTYA select substr('kiskutya',3,2) from dual sk select to_date('2016.12.31', 'YYYY.MM.DD') from dual 12/31/2016 select sqrt(17) from dual 4.1231056256176605498214098 select power(2, 4) from dual 16 43/83
Rendezés a lekérdezésben Nem szerepel az eredeti modellben, ugyanis az halmazorientált, ahol nem értelmeztük a rendezettséget. A gyakorlatban adatainkat listákban tároljuk, ahol rendszerint valamilyen rendezettséget valósítunk meg (akár több szempont szerint is). SELECT... FROM... [WHERE...] ORDER BY oszlopnév [DESC], oszlopnév [DESC],...; ASC (ascending) : növekvő sorrend - alapértelmezés DESC (descending) : csökkenő sorrend Alapértelmezésben növekvő, ha fordítva akarjuk akkor DESC! SELECT * FROM autó ORDER BY Típus, Ár DESC; 44/83
Aggregáció a lekérdezésben Aggregáció: a reláció rekordjaira összesítő érték(ek)et tartalmazó rekordot ad vissza Aggregációs függvények: SUM(x) - összeg AVG(x) - átlagérték MAX(x) legnagyobb érték MIN(x) legkisebb érték COUNT(x) elemek száma x: numerikus mező vagy kifejezés értéke *: minden rekordot érint SELECT avg(ár) FROM Autó; SELECT count(*) FROM Autó; SELECT count(kor) FROM Autó Where Kor > 10; SELECT Sum(Ár), Avg(Kor) FROM Autó; 45/83
Csoportképzés a lekérdezésben SELECT... FROM... [WHERE...] GROUP BY oszloplista; Az egyes csoportba azok a rekordok kerülnek, melyeknél oszloplista értéke azonos. Az eredménytáblában egy csoportból egy rekord jelenik meg Az összesítő függvények csoportonként hajtódnak végre. SELECT Típus, avg(ár) FROM Autó GROUP BY Típus; SELECT Típus, count(*) FROM Autó WHERE Szín='Piros' GROUP BY Típus ORDER BY Típus; SELECT Szín, min(ár), max(ár) FROM Autó GROUP BY Szín; 46/83
Csoportok szűrése SELECT... FROM... [WHERE...] GROUP BY oszloplista HAVING feltétel; A csoportképzés után a kapott eredményreláció szűkítése bizonyos rekordokra. A WHERE szelekciós opció nem alkalmazható, mert az az alapreláció rekordjain értelmezett szelekcióra vonatkozik! SELECT Típus, avg(ár) FROM Autó GROUP BY Típus HAVING avg(ár) > 500000; SELECT Típus, count(*) FROM Autó WHERE Szín='Piros' GROUP BY Típus HAVING count(*) > 3 ORDER BY Típus; 47/83
Join (szorzat, illesztés) Ha az eredménytábla két (vagy több) táblából akarjuk az adatokat megjeleníteni, akkor a táblák összekapcsolására a JOIN parancsot kell használni. SQL-ben a következő típusokat alkalmazhatjuk: Cross join (Descartes szorzet, teljes illesztés) Theta join Feltételes illesztés Equijoin Egyenlőségen alapuló illesztés Natural join Természetes illesztés Outer join Külső illesztés, Self join (tábla összekapcsolása önmagával). 48/83
Cross join (Descartes szorzat, teljes illesztés) Relációs algebrában: r 1 x r 2 SELECT mezőlista FROM táblanév1, táblanév2; Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér 1200000 114 114 Kis Géza Eger 20-9555666 JED-123 Nissan Ezüst 1500000 178 178 Jó Éva Miskolc 30-8765432 select Név,Típus, Ár from Autó, Ember; 49/83 Név Kis Géza Típus Opel Ár 1200000 Jó Éva Opel 1200000 Kis Géza Nissan 1500000 Jó Éva Nissan 1500000
Theta join Feltételes illesztés Relációs algebrában: r 1 felt r 2 SELECT mezőlista FROM tábla1, tábla2 WHERE feltétel; Tetszőleges feltétel megadható, nemcsak egyenlőség! Nem szükséges kapcsolat (idegen kulcs, azonos mező) a működéshez! Autó: Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék Ár 120000 150000 25000 Ember: Ekód Név Összeg 114 Kis Géza 180000 178 Jó Éva 100000 Telefon 20-9555666 30-8765432 select rendszám,ár,név,összeg from Autó,Ember where összeg > ár; 50/83 Rendszám GBC-765 JED-123 Ár 120000 150000 Név Kis Géza Kis Géza Összeg 180000 180000 AKT-392 25000 Kis Géza 180000 AKT-392 25000 Jó Éva 100000
Equijoin Egyenlőség alapú illesztés Relációs algebrában: r 1 =felt r 2 SELECT mezőlista FROM tábla1 INNER JOIN tábla2 ON join_feltétel WHERE feltétel; A szelekciós feltétel és a join feltétele külön-külön megadható! Az ON részben csak egyenlő feltétel adható meg! A táblákban nem kell megegyezniük a kapcsolattartó mezők nevének! Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 select rendszám,név from autó inner join ember on tulaj=ekód where ár > 500000; 51/83 Rendszám GBC-765 JED-123 Név Kis Géza Jó Éva
Equijoin Egyenlőség alapú illesztés (2) Relációs algebrában: r 1 =mező r 2 SELECT mezőlista FROM tábla1 INNER JOIN tábla2 USING (mező); A táblákban meg kell egyezniük a kapcsolattartó mezők nevének! Irányítható a kapcsolat a megfelelő mezőnevek megadásával! Rendszám Típus Szín Kor Tulaj Tulaj Név Kor Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 29 14 38 114 178 102 114 Kis Géza 29 178 Jó Éva 41 102 Kék Béla 36 20-9555666 30-8765432 70-3355440 155 Bő Jenő 18 70-6655429 select rendszám,név from autó inner join ember using (tulaj); 52/83 Rendszám GBC-765 JED-123 AKT-392 Név Kis Géza Jó Éva Kék Béla
Natural join Természetes illesztés Relációs algebrában: r 1 * r 2 SELECT mezőlista FROM tábla1 NATURAL JOIN tábla2; A táblákban meg kell egyezniük a kapcsolattartó mezők nevének! Irányíthatatlan a kapcsolat, minden azonos nevű mező kapcsolódik! Rendszám Típus Szín Kor Tulaj Tulaj Név Kor Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 29 14 38 114 178 102 114 Kis Géza 29 178 Jó Éva 41 102 Kék Béla 36 20-9555666 30-8765432 70-3355440 155 Bő Jenő 18 70-6655429 select rendszám,név from autó natural join ember; 53/83 Rendszám GBC-765 Név Kis Géza
Outer join (külső illesztés) SELECT FROM tábla1 [LEFT RIGHT FULL] OUTER JOIN tábla2 ON join_feltétel [WHERE feltétel] ; Az illeszkedő pár nélküli rekordok is bekerülnek az eredménybe. Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 199 102 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 SELECT Rendszám,Név FROM Autó RIGHT OUTER JOIN Ember ON Tulaj=Ekód Where Cím='Ózd'; 54/83 Rendszám AKT-392 Név Kék Béla Bő Jenő RIGHT: A jobb oldali táblából jönnek a pár nélküli rekordok is, üres értékkel kiegészítve.
Outer join (külső illesztés) Példa Hány darab autója van az egyes embereknek? Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 SELECT Név, count(tulaj) As Darab FROM Autó RIGHT OUTER JOIN Ember ON Tulaj=Ekód Group By Név; Név Kis Géza Jó Éva Kék Béla Bő Jenő Darab 2 1 1 0 55/83
Self join önillesztés :-) SELECT FROM tábla t1, tábla t2 [WHERE feltétel] ; A tábla kétszer szerepel, különböző álnevekkel. Autó: Rendszám Típus Kor Ár Tulaj GBC-765 Opel 5 JED-123 Nissan 8 HGZ-392 Nissan 7 1200000 1000000 900000 114 178 102 LOG-416 Opel 6 1300000 115 Azon autók rendszáma, melyek idősebbek, mégis drágábbak saját típustársuknál: select a1.rendszám from autó a1, autó a2 where a1.típus=a2.típus and a1.kor>a2.kor and a1.ár>a2.ár); Rendszám JED-123 LOG-416 56/83
Halmazműveletek Unió: Metszet: Különbség: SELECT UNION [ALL] SELECT ; SELECT INTERSECT SELECT ; SELECT MINUS SELECT ; Csak azonos szerkezetű táblák esetén alkalmazhatók! Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék Ár 1200000 1500000 25000 Tulaj 114 178 102 LOG-416 Volvó Kék 2825000 114 Ekód Név Cím 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd Telefon 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Azok az emberek, akiknek nincs autójuk: SELECT név FROM ember MINUS SELECT név FROM ember WHERE Ekód IN (SELECT Tulaj FROM autó); 57/83 Név Kis Géza Jó Éva Kék Béla Bő Jenő Név Kis Géza Jó Éva Kék Béla Név Bő Jenő
AL-SELECT Az SQL támogatja azt a lehetőséget, hogy a szelekciós feltételben nemcsak létező, letárolt adatelemekre hivatkozzunk, hanem számított kifejezéseket is alkalmazhassunk. A számítást egy másik SELECT utasítással tudjuk megadni. Tehát az egyik lekérdezés szelekciós feltételében hivatkozunk egy másik lekérdezés eredményére. Az al-lekérdezést mindig zárójelben kell megadni, hogy elemei elkülönüljenek. Formailag megegyezik a normál SELECT utasítással (kivétel:al-select-ben nem lehet rendezni) 58/83
Az AL-SELECT operátorai Az al-lekérdezés eredményétől függően különböző operátorokat kapcsolhatunk az AL-SELECT-hez: Ha az eredmény egy rekord: skalár operátorok (relációs operátorok) használhatók. Ha az eredmény több rekord: halmazoperátorok (IN, ANY, ALL, EXISTS) használhatók. SELECT FROM WHERE mező IN (al-select); SELECT FROM WHERE mező θ ANY (al-select); SELECT FROM WHERE mező θ ALL (al-select); SELECT FROM WHERE EXISTS (al-select); θ: tetszőleges relációs operátor 59/83
Az AL-SELECT operátorai 2. ANY: a halmaz minden eleméhez hasonlít, ha egyet talál, akkor igazzal tér vissza ALL: a halmaz minden eleméhez hasonlít, ha akár egyre nem teljesül, akkor hamisat ad vissza EXISTS: az eredményhalmaz üres-e (ha üres, akkor hamissal tér vissza) 60/83
Példák AL-SELECT-re Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Piros JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Az egri tulajdonosok autóinak árát növeljük meg 20%-al: UPDATE Autó SET Ár=Ár*1.2 WHERE Tulaj IN (SELECT Ekód FROM Ember WHERE Cím='Eger'); Töröljük azokat az embereket, akiknek több mint 2 autójuk van: DELETE FROM Ember WHERE Ekód IN (SELECT Ekód, count(*) FROM Ember, Autó WHERE Ekód=Tulaj GROUP BY Ekód HAVING count(*) > 2); 61/83
Példák AL-SELECT-re Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Bármely piros autó áránál olcsóbb autók rendszámai: SELECT Rendszám FROM Autó WHERE Ár < ANY (SELECT Ár FROM Autó WHERE Szin='piros'); Minden piros autó áránál olcsóbb autók rendszámai: SELECT rsz FROM autó WHERE ár < ALL (SELECT ár FROM autó WHERE szin= piros ); Rendszám GBC-765 JED-123 AKT-392 Rendszám AKT-392 62/83
Példák AL-SELECT-re Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Azok az emberek, akiknek nincs autójuk (1. változat): SELECT Név FROM Ember WHERE Ekód NOT IN (SELECT Tulaj FROM Autó); Azok az emberek, akiknek nincs autójuk (2. változat): SELECT E.Név FROM Ember E WHERE NOT EXISTS (SELECT * FROM Autó A WHERE A.Tulaj=E.Ekód); 63/83
Témakörök SQL alapok DDL utasítások DML utasítások DQL utasítás DCL utasítások Gyakorló feladatok Ellenőrző kérdések 64/83
DCL Userek kezelése User létrehozása: CREATE USER usernev @ host IDENTIFIED BY jelszó ; User törlése: DROP USER usernev @ host ; Userek kezelése a sajátgépen: Create user breki @ localhost identified by breki ; Drop user breki @ localhost ; 65/83
DCL Jogosultságok kezelése Jogosultság adása: GRANT művelet ON objektum TO felhasználó PUBLIC [ WITH GRANT OPTION ]; Jogosultság visszavonása: REVOKE művelet ON objektum FROM felhasználó PUBLIC; Jogok visszavonása: Minden felhasználó A megszerzett jog tovább adható. Csak attól a felhasználótól vonható vissza jog, akinek kiadtuk a jogot. Ha ez a felhasználó időközben továbbadta a jogot, az is automatikusan visszavonásra kerül. 66/83
DCL Jogosultságok kezelése 2. Engedélyezhető műveletek: CREATE: tábla létrehozása DROP: tábla törlése INSERT: tábla rekordjainak bővítése DELETE: tábla rekordjainak törlése UPDATE: tábla rekordjainak módosítása SELECT: tábla lekérdezése ALL: minden művelet 67/83
DCL Jogosultságok kezelése 2. Jogok engedélyezése: GRANT SELECT ON Autó TO Jenő; GRANT SELECT,UPDATE(Szín) ON Autó TO PUBLIC; GRANT DELETE ON Autó TO Jenő WITH GRANT OPTION; Jogok visszavonása: REVOKE ALL ON Autó FROM Jenő; REVOKE UPDATE ON Autó FROM Public; 68/83
w3school.com/sql 69/83
Adatbázis rendszerek 1. Ellenőrző kérdések 70/83
Ellenőrző kérdések 1. 1. Melyik paranccsal lehet létrehozni adatbázis táblát? A: BUILD B: CONSTRUCT C: CREATE D: MAKE E: PREPARE 2. Melyik paranccsal lehet törölni adatbázis táblát? A: CLOSE B: DELETE C: CLEAR D: DROP E: KILL 71/83
Ellenőrző kérdések 2. 3. Helyes az alábbi parancs? Séma: Termék [ Kód, Név, Ár, Leírás ] insert into termek ('A0123', 'Sál',1500,null); A: Igen B: Nem 4. Melyik kulcsszó hiányzik a parancsból? UPDATE termék SET ár=ár*1.1; A: TO B: SET C: WHERE D: FOR E: Nem hiányzik semmi a parancsból! 72/83
Ellenőrző kérdések 3. 5. Melyik kulcsszó hiányzik a parancsból? SELECT név, ár FROM termék ORDER BY név; A: Egy vessző (,) hiányzik. B: SHOT BY C: WHERE D: ORDER BY E: Nem hiányzik semmi a parancsból! 6. Helyes az alábbi parancs? SELECT név, lakcím FROM vásárló WHERE fizmód= 'bankkártya' OR 'utánvét'; A: Igen B: Nem 73/83
Ellenőrző kérdések 4. 7. Melyik paranccsal lehet kiíratni azokat a termékeket, melyeknek üres a leírás mezője? A: select név from termék where leírás =' '; B: select név from termék where leírás = NULL; C: select név from termék where leírás IS NULL; D: select név from termék where leírás EMPTY; E: select név from termék where leírás LIKE ' '; 8. Helyes az alábbi parancs? SELECT terméknév FROM termék WHERE ár > 200 and < 500; A: Igen B: Nem 74/83
Ellenőrző kérdések 5. 9. Melyik kulcsszó hiányzik a parancsból? SELECT név FROM termék WHERE ár > 1000; A: TO B: SET C: WHERE D: FROM E: GROUP BY E: SHORT BY 10. Helyes az alábbi parancs? SELECT count(*) FROM vásárló; A: Igen B: Nem 11. Helyes az alábbi parancs? SELECT count(*) FROM vásárló WHERE az='az'; A: Igen B: Nem 75/83
Ellenőrző kérdések 6. 12. Melyik paranccsal lehet módosítani az adatbázis tábla szerkezetét? A: ALTER B: CHANGE C: MODIFY D: AMEND E: REVISED 13. Melyik a kakukktojás? A: DDL B: DQL C: DML D: DBL E: DCL 76/83
Ellenőrző kérdések 7. 14. Adja meg a feladatokat megvalósító SQL parancsokat! Típus Kor A: Hozza létre a táblát: B: Vigyen fel egy rekordot: C: Írassa ki a kék autók rendszámát: D: Írassa ki az átlagkort: E: Hány darab piros autó van? F: Írassa ki azokat a rendszámokat, melyekben van B betű. G: Írassa ki azokat a rendszámokat, melyekben nincs B betű. H: Törölje ki az Opeleket. I: Írassa a 4 és 8 év közötti korú autók rendszámát. 77/83 Rendszám Autó Szín
Ellenőrző kérdések 8. 15. Alakítson kategóriákat, és sorolja az alábbi parancsokat az egyes kategóriákba! Kategóriák: Parancsok: A: insert B: select C: grant D: create E: update F: modify G: drop H: delete I: revoke 78/83
Ellenőrző kérdések 9. 16. Igaz vagy Hamis az állítás? 79/83 Az SQL utasításaiban a kisbetű és a nagybetű egyenértékű. A DDL parancsok az adatokon műveleteket végeznek. A szöveg konstansokat aposztrófok " " közé kell tenni. Az SQL-ben a * (csillag) csak a count paramétereként használható: count(*). A projekciót a select paranccsal lehet megvalósítani. Az AVG(ár) from termék; parancs kiírja az átlagárat. A delete termék; parancs kitörli az összes terméket. Az inner join-nak létezik left típusa. A having parancs csak a group by paranccsal együtt használható.
Ellenőrző kérdések 10. 17. Az adott séma alapján adja meg az SQL parancsokat! A: Mely termékek leírásában szerepel a női szó? B: Mely raktárhelyeken van 100-nál több termék? C: Mely raktárhelyeken van bikini nevű termék? D: Mennyi a termékek átlagára? E: Összesen hány darab bikini van a raktárban? F: Összesen mennyi értékű bikini van a raktárban? G: Növelje meg a kesztyű nevű, bőr leírású termékek árát 1000 forinttal. H: Törölje ki a nulla darabszámú raktárhelyeket! 80/83 Termék [ Tkód, Név, Ár, Leírás ] Raktár [ RaktHely, Tkód, Darab ]
81/83 Gratulálok! Ön átvette a tananyagot, és letesztelte a tudását!
Felhasznált irodalom Kovács László elektronikus jegyzetei Szelezsán János: Adatbázisok, LSI Oktatóközpont, 1999 Baksáné Varga Erika elektronikus jegyzetei IHM: Adatbázis-kezelés, elektronikus jegyzet Stolniczki Gyula: SQL kézikönyv 82/83
VÉGE VÉGE 83/83