Adatbázis-kezelés Harmadik előadás 39
Műveletek csoportosítása DDL adat definiálás Objektum létrehozás CREATE Objektum törlés DROP Objektum módosítás ALTER DML adat módosítás Rekord felvitel INSERT Rekord törlés DELETE Rekord módosítás UPDATE DQL adat lekérdezés: az SQL fő erőssége Adatlekérdezés SELECT DCL adat vezérlés Hozzáférés-szabályozás GRANT, REVOKE Tranzakció-kezelés COMMIT 40
Adatdefiníció (DDL) Data Definition Language Adatbázis-objektumok meghatározása: létrehozása, módosítása, törlése CREATE, ALTER, DROP A táblázatok fejléceinek meghatározása táblák, indexek, kapcsolatok definiálása 4
Adatdefiníció (DDL) Létrehozás: CREATE objektumtípus paraméterek Nevek: angol AC, _, számok CREATE TALE táblanév (mező típus megszorítás, ); CREATE TALE dolgozo ( id INT PRIMARY KEY, nev VARCHAR(0), munkakor CHAR() ); CREATE INDEX munkakor ON dolgozo (munkakor); CREATE USER név IDENTIFIED Y jelszó; Módosítás: ALTER objektumtípus paraméterek ALTER TALE dolgozo ALTER/MODIFY nev VARCHAR(40) NOT NULL; ALTER TALE dolgozo ADD lakcim VARCHAR(40); Törlés (eldobás): DROP objektumtípus paraméterek DROP INDEX munkakor; DROP TALE dolgozo; 4
Adatdefiníció tábla létrehozása CREATE TALE A tábla fejlécének meghatározása CREATE TALE táblanév ( mezőnév típus integritásifeltétel, mezőnév típus integritásifeltétel, ) CREATE TALE auto ( rsz CHAR(6) PRIMARY KEY, szinkod INT UNSIGNED NOT NULL, vonohorog OOLEAN ) rsz szinkod vonohorog MEH-00 5 FALSE IGA-00 777 TRUE 43
Kapcsolatok definiálása A táblák közötti kapcsolatok tárolhatók az adatbázisban A kapcsolatok adatértékeken keresztül valósulnak meg Azonos típusú mezők 44
Kapcsolatok definiálása CREATE TALE táblanév ( mező definíció, mező definíció, ) Mező definíció: data_type [NOT NULL NULL] [DEFAULT alapértelmezett érték] [AUTO_INCREMENT] [UNIQUE [KEY] [PRIMARY] KEY] [COMMENT 'string'] [Kapcsolat definíció] Kapcsolat definíció: REFERENCES táblanév (mezőnév,...) [MATCH FULL MATCH PARTIAL MATCH SIMPLE] [ON DELETE Kapcsolat opció] [ON UPDATE Kapcsolat opció] Kapcsolat opció: RESTRICT CASCADE SET NULL NO ACTION 45
Kapcsolatok definiálása ALTER TALE jarmu ADD FOREIGN KEY(tulajdonos) REFERENCES napsugár (id); ALTER TALE jarmu ADD FOREIGN KEY(tulajdonos) REFERENCES napsugár (id) ON DELETE CASCADE; 46
Kapcsolatok definiálása A szülő tábla kulcsának változása esetén: CASCADE: a gyermekben a kapcsolókulcsok is módosulnak, vagy törlésnél a kapcsolódó rekordok törlődnek SET NULL: A külső kulcs értéke NULL értéket vesz fel RESTRICT: A szülő tábla kulcsa nem módosítható 47
Adattípusok Adatbáziskezelőtől függően más és más adattípusok vannak, de ezek között természetesen nagy a hasonlóság. Tipikus példák: Szöveges típusok CHAR [(hossz)] megadott hosszúságú karakterlánc VARCHAR (n) 4 bájt csak a karakterláncnak megfelelő hosszúságú területet foglalja el. Maximum n, illetve 55 karakterig. TEXT (m) nagyméretű szöveges karakterlánc mérete mértékegységekkel adható meg: K, M, G például TEXT(700M) Érték CHAR(0) Helyfoglalás VARCHAR(0) Helyfoglalás '' ' ' 0 bájt '' bájt 'ab' 'ab ' 0 bájt 'ab' 3 bájt 'abcdefghij' 'abcdefghij' 0 bájt 'abcdefghij' bájt 'abcdefghijkl' 'abcdefghij' 0 bájt 'abcdefghij' bájt 48
Adattípusok. ináris adattípusok INARY / VARINARY (n) fix/ változó méretű bináris adat LO (méret) INARY LARGE OJECT (méret) nagyméretű adat: az adatok értelmezésére nincs semmilyen megkötés, így segítségükkel tetszőleges adatokat, például fotókat tárolhatunk. A méret megadása mértékegységgel: K, M, G pl: LO(G) 49
Adattípusok 3. Szám típusok NUMERIC, DECIMAL [(szélesség [, tizedes)] ] pontos értékű (fixpontos) tizedestörtek tárolására, a szélesség mellett a tizedespont utáni jegyek száma is megadható REAL, FLOAT, DOULE lebegőpontos szám tárolására Dátum/idő típusok TINYINT, SMALLINT, MEDIUMINT, INTEGER/INT, IGINT egész értékek, különböző értéktartománnyal (8, 6, 4, 3, 64 bit) DATE, TIME, DATETIME, TIMESTAMP Dátum és/vagy időpont tárolására DATE: '0-05-0' DATETIME '04-05-0 6:0:05' Logikai típus OOLEAN TRUE, FALSE, UNKNOWN érték 50
Adatrekord elérési módszerek Soros elérés Minden megelőző adatot végig kell olvasni Véletlen elérés Azonnal a szükséges adathoz ugrunk 5
Véletlen adatelérés Véletlen elérés Hova ugorjunk? Kell valami segédinformáció (tartalomjegyzék)... pl. a számunkra fontos információ a 7. és 5. helyen található Segédinformáció arról, hogy az adatainkat hol találjuk meg = index. 5
Indexek 53
Indexek Index: az egyes táblákhoz kapcsolódó, a gyors keresést lehetővé tevő segédtáblázat Fájlszervezés, adatelérés: Soros: az egyes adatok megtalálásához a fájlt végig kell olvasni (regény) Indexelt: meta-adatok használata ahhoz, hogy mely adat hol található. (szakkönyvek) SQL: egy vagy több mező alapján történő keresést is támogatja A tipikus keresési szempontokhoz készítsünk indexet Gyakorlatilag azt jelezzük vele, hogy később milyen tipikus keresésekkel fogunk az adatbázishoz fordulni, és így a rendszer felkészül a kérdéseinkre 54
Indexek. Alapvető célja: Az adatelérési sebesség növelése További célja (illetve hasznos mellékhatás): izonyos szabályok betartását is kikényszeríti: Egyediség (UNIQUE) Kitöltöttség (NOT NULL) Létre kell hozni, de utána a használata teljesen automatikus eszúráskor, módosításkor, törléskor is! (időszükséglet...) Jelentős helyfoglalása lehet, az elemszámtól és a kulcstól függően Megválasztása alapjaiban határozza meg a rendszer teljesítményét. 55
Index létrehozása Valójában már korábban is definiáltunk indexet (PRIMARY KEY, UNIQUE) Elsődleges kulcs hozzáadása: ALTER TALE jarmu ADD PRIMARY KEY(rsz) CREATE INDEX indexnev ON táblanév (mező ASC DESC,.); DROP INDEX inev; 56
Megszorítások NULL az adat megadása nem kötelező (alapértelmezett) NOT NULL az adat megadása kötelező (pl. csoport név, a csoporthoz rendelt dajka) PRIMARY KEY az adott mező a tábla elsődleges kulcsa UNIQUE csak egyedi értékek vihetők fel bele (pl. adószám, rendszám) CHECK (feltétel) a MySQL nem támogatja csak a feltételnek megfelelő adatok kerülhetnek az oszlopba CREATE TALE díszpolgár CHECK (lakcim_varos= Győr AND kor>50) FOREIGN KEY (mező) REFERENCES tábla(mező) Idegen kulcs 57
Adatmódosítás (DML) Data Manipulation Language eszúrás, módosítás, törlés: INSERT, UPDATE, DELETE eszúrás: INSERT INSERT INTO tabla VALUES (érték, érték, ) INSERT INTO tabla VALUES (mezoi=erteki, mezoj=ertekj, ) INSERT INTO tabla SELECT INSERT INTO dolgozo VALUES (NULL,'Sári néni','o') INSERT INTO dolgozo VALUES (nev= Ancsa néni, munkakor= o ); INSERT INTO dolgozo SELECT * from masikovi.dolgozo; Az érték lehet NULL is. 58
Adatmódosítás (DML) Adatmódosítás: UPDATE UPDATE dolgozo SET nev='sári néne' WHERE id=3; WHERE feltétel megadása nem kötelező! UPDATE dolgozo SET nev='sári néne'; Kétféle módosítás : adatstruktúra vagy adat ALTER vs. UPDATE! Adat törlése: DELETE WHERE feltétel megadása nem kötelező! DELETE FROM dolgozo; Adatstruktúra vagy adat törlése: DELETE vs DROP! 59
Adatlekérdezés (DQL) Data Query Language Az adatbázisban tárolt adatok kinyerése Alapvető forma: SELECT mit FROM honnan WHERE feltételek mit: legtöbbször mezőlista: mező_i, mező_j, mező_k SELECT rsz, szin FROM auto *: az összes mező SELECT * from AUTO függyvények is használhatók SELECT nev, DAYNAME(szulido) FROM gyerek 60
Adatlekérdezés SELECT: a legösszetettebb utasítás, a lekérdezések ráadásul más utasításokba is ágyazhatók: Táblakészítés Hozzáfűzés Frissítés Törlés Tábla másolása (létrehozás meglévő alapján): CREATE TALE uj AS SELECT * from regi CREATE TALE fiu AS SELECT * FROM gyerek WHERE nem= f ; A nők autói: SELECT * FROM auto WHERE tulajdonos in (SELECT id FROM emberek WHERE nem= nő ); Nagy elemszámnál van ennél hatékonyabb megoldás is! (JOIN) 6
SELECT utasítás A tábladefiníciókor megadott sorrend nem fontos, az attribútumok a felsorolás sorrendjében jelennek meg (halmaz vö. lista) A parancs több további szemponttal bővíthető A modellből adódóan kitalálhatunk olyan lekérdezést, amit nem tudunk egyetlen SELECT paranccsal megvalósítani Projekció M Szelekció M M3 M4 SELECT M, M4 FROM táblanév WHERE szelekciós feltétel 6
Szelekció A szelekció eredményhalmazába a megadott feltételnek megfelelő rekordok kerülnek ID Márka Szín Üa ID Márka Szín Üa Opel kék fehér fehér 5 ezüst 3 Audi fekete D 7 zöld 4 Dacia barna 5 ezüst 6 sárga D 7 zöld 8 Kia piros SELECT * FROM táblanév WHERE szelekciós feltétel Szelekció Szelekciós feltétel: legyen benzines és ford SELECT * FROM auto WHERE márka='' AND üa= 63
Szelekciós feltételek = < > <= >= <>!= IN ('a','b','c') ETWEEN a AND b LIKE 'minta' _ karakter % akárhány karakter LIKE 'a_' LIKE 'a%' LIKE '%a%' NOT LIKE CLIKE a betűvel kezdődő kétbetűs a betűvel kezdődő a betűt tartalmazó a mintával nem egyező a mintaillesztésnél nem különbözteti meg a kis- és nagybetűket AND, OR, NOT (m<5 AND (m=3 OR m>8)) 64
Projekció A projekció eredményhalmazába a megadott mezők kerülnek Lehetőség van az összes mezőt választani (*) azok felsorolása nélkül SELECT mező, mező... FROM táblanév SELECT id, márka, szín FROM auto ID Márka Szín Üa Opel kék fehér 3 Audi fekete D 4 Dacia barna 5 ezüst 6 sárga D 7 zöld 8 Kia piros Projekció ID Márka Szín Opel kék fehér 3 Audi fekete 4 Dacia barna 5 ezüst 6 sárga 7 zöld 8 Kia piros 65
Szelekció és projekció A szelekció és projekciót sokszor együtt alkalmazzuk ID Márka Szín Üa Opel kék fehér 3 Audi fekete D 4 Dacia barna 5 ezüst 6 sárga D 7 zöld 8 Kia piros SELECT mező, mező... FROM táblanév WHERE szelekciós feltétel Projekció Szelekció ID Márka Szín fehér 5 ezüst 7 zöld SELECT id, márka, szín FROM auto WHERE márka='' AND üa= 66
SELECT példák Névsor kilistázása: SELECT nev, anyjaneve FROM gyerek Minden adat: SELECT * FROM gyerek Lista rendezése születési dátum szerint: SELECT * FROM gyerek ORDER Y szulido ított sorrend: SELECT * FROM gyerek ORDER Y szulido DESC 009-ben született gyerek: SELECT * FROM gyerek WHERE szulido >= '009-0-0' AND szulido <= '009--3' 67
SELECT utasítás SELECT [DISTINCT] oszloplista FROM táblanévlista [alias] [WHERE feltételek] [GROUP Y oszloplista ] [HAVING feltételek] [ORDER Y oszloplista] projekció Descartes-szorzat szelekció csoportosítás csoport szelekció rendezés M A Rendezés Z Projekció M M3 M4 Szelekció Csoport szelekció Csoportosítás 68
SELECT végrehajtási sorrend FROM Descartes-szorzat WHERE szelekció GROUP Y csoportosítás HAVING csoport szelekció SELECT projekció ORDER Y A Rendezés Z Projekció M rendezés M M3 M4 Szelekció Csoport szelekció Csoportosítás 69
Csoportosítás GROUP Y Adott szempont szerint csoportosítja a szelekcióval kiválasztott sorokat HAVING A létrehozott csoportokon végez szelekciót Projekció M A Rendezés Z M M3 M4 Szelekció Csoport szelekció Csoportosítás 70
Csoportosítás és aggregáció SELECT aggregációs lista FROM tábla GROUP Y csoportképző kifejezés Az autók márkánkénti átlagára: SELECT marka, AVG(ar) FROM auto GROUP Y marka rsz marka tipus ILI-00 opel Corsa. JAJ-3 opel JUK-007 ar marka avg(ar) 600000 ford 456666.6667 Astra 600000 opel 533333.3333 ford Mondeo 3000000 LOL-999 opel Calibra 400000 LIK-887 ford focus 970000 CIA-707 ford focus 400000 Márka Átlag ford 457000 opel 533000 SELECT marka AS Márka, ROUND(AVG(ar),-3) AS Átlag FROM auto GROUP Y marka; 7
Szűrés a csoportosítás után SELECT marka AS Márka, ROUND(AVG(ar),-3) AS Átlag FROM auto GROUP Y marka; Márka Átlag ford 457000 opel 533000 HAVING a csoportképzés utáni szelekció: SELECT aggregációs lista FROM tábla GROUP Y csoportképző kifejezés HAVING feltétel; milliónál magasabb átlagárú autók: SELECT marka AS Márka, ROUND(AVG(ar),-3) AS Átlag FROM auto Márka Átlag GROUP Y marka ford 457000 HAVING Átlag>000000; 7
SELECT példák Csoportosítás márkák szerint Megszámoljuk, melyik márkából hány jármű szerepel a táblában: SELECT marka, count(*) FROM jarmu GROUP Y marka Csak az F betűvel kezdődő márkák érdekelnek: SELECT marka, COUNT(*) FROM jarmu GROUP Y marka HAVING marka LIKE 'F%'; SELECT marka, count(*) FROM jarmu WHERE marka LIKE 'F%' GROUP Y marka; Csak az a márka érdekel, amiből legalább 0 szerepel: SELECT marka, COUNT(*) FROM jarmu GROUP Y marka HAVING COUNT(*) >=0; SELECT marka, COUNT(*) darabszám FROM jarmu GROUP Y marka HAVING darabszám >=0; 73
Az eredmény rendezése Halmazokkal dolgozunk, de a listák szükségszerűen valamely sorrenddel rendelkeznek. SELECT ORDER Y mező irány, mező irány, SELECT * FROM emberek ORDER Y nev A rendezés iránya: ASC: növekvő (ascending) alapértelmezett, nem fontos kiírni DESC: csökkenő (descending) A mezőkre sorszámmal is hivatkozhatunk: SELECT * FROM táblanév ORDER by, 4 DESC SELECT leanykori_nev, szuletesi_hely, adoazonosito_jel FROM emberek ORDER by, ; 74
Alap összekapcsolás (JOIN) Halmazelmélet : Az A és halmaz Descartes-szorzatán azt a halmazt értjük, melynek azon rendezett párok az elemei, amiknek első eleme A-beli, második eleme pedig -beli és a szorzat minden lehetséges párt tartalmaz. Azonosító Név Ádám Éva Lakcím Adószám Magasság Márka... Típus... Rendszám... Opel... Astra.4... EFF-36... JAU-75 Kettőnél több tábla összekapcsolható LOL-96 Tulaj Focus.0 MW X5 Rendszám Márka Típus Tulajdonos Azonosító Név Lakcím Adószám Magasság EFF-36 Opel Ádám EFF-36 Opel Éva JAU-75 Ádám JAU-75 Éva LOL-96 MW Ádám LOL96 MW Éva SELECT * FROM auto, ember 75
Alap összekapcsolás (JOIN) A teljes Descartes-szorzatra általában nincs szükség Óriási adatmennyiségek! n*m elemű reláció Segédinformációk szükségessége Azonosító Név Ádám Éva Lakcím Adószám Magasság Márka... Típus... Rendszám... Opel... Astra.4... EFF-36... Összekapcsolási feltétel: auto.tulajdonos = ember.azonosító Tulaj JAU-75 Focus.0 LOL-96 MW X5 Rendszám Márka Típus Tulajdonos Azonosító Név Lakcím Adószám Magasság EFF-36 Opel Ádám EFF-36 Opel Éva JAU-75 Ádám JAU-75 Éva LOL-96 MW Ádám LOL96 MW Éva SELECT * FROM auto, ember WHERE auto.tulajdonos=ember.azonosító 76
Alap join példa Keressük meg az autók tulajdonosait! Összekapcsolási feltétel: auto.tulajdonos = ember.azonosító Azonosító Név Ádám Éva Lakcím Adószám Magasság... Rendszám... EFF-36... Márka... Opel... Típus... Astra.4 Tulajdonos JAU-75 Focus.0 LOL-96 MW X5 Rendszám Márka Típus Tulajdonos Azonosító Név Lakcím Adószám Magasság EFF-36 Opel Ádám JAU-75 Éva LOL-96 MW Ádám SELECT rendszám, név FROM auto, ember WHERE auto.tulajdonos=ember.azonosító Rendszám Név EFF-36 Ádám JAU-75 Éva LOL-96 Ádám 77
Alap join példa Kibővített mezőnevek: akkor kötelező, ha több táblában is szerepel ugyanaz a mezőnév: ember.azonosító Hosszú táblaneveknél érdemes rövidíteni: SELECT FROM auto a,... Azonosító Név Ádám Éva Lakcím Adószám Magasság... Rendszám... EFF-36... Márka... Opel... Típus... Astra.4 Tulajdonos JAU-75 Focus.0 LOL-96 MW X5 Rendszám Márka Típus Tulajdonos Azonosító Név Lakcím Adószám Magasság EFF-36 Opel Ádám JAU-75 Éva LOL-96 MW Ádám SELECT rendszám, név FROM auto a, ember e WHERE a.tulajdonos=e.azonosító Rendszám Név EFF-36 Ádám JAU-75 Éva LOL-96 Ádám 78
SELECT példák A SELECT parancs képes műveletek végzésére, és függvények kiértékelésére is, pl: SELECT ; SELECT SIN(PI()/4), (3+)*5; Véletlenszám generálása: SELECT RAND() SELECT FLOOR(min+RAND()*(max-min)) 3 rekord véletlenszerű kiválasztása: SELECT név, jel FROM napsugár ORDER Y RAND() LIMIT 3 79