Adatbázisok 8. gyakorlat SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE) 2014. október 22. 2014. október 22. Adatbázisok 1 / 14
SQL nyelv Structured Query Language Struktúrált lekérdez nyelv A relációs adatbáziskezelés szabványos nyelve Két f csoportba sorolhatóak az utasításai DDL (Data Denition Language) - adatstruktúra deniáló utasítások DML (Data Manipulation Language) - adatokon végezhet utasítások 2014. október 22. Adatbázisok 2 / 14
SQL szintaxis Kisbet k és nagybet k egyenérték ek a nyelv alapszavaiban Az utasítások sorfolytonosan írhatóak, az utasítások végét a ; jelzi Változók nincsenek, tábla- és oszlopnevekre lehet hivatkozni Pl. tábla.oszlop Alias név megadása: régi_név AS új_név Szövegkonstansok a 'jelek között' Relációjelek, logikai m veletek lsd. el adás 2014. október 22. Adatbázisok 3 / 14
Adatbázis létrehozása CREATE DATABASE adatbazis_neve Az adatbázis használata pl. MySQL adatbáziskezel rendszernél mysql> use adatbazis_neve Innent l kezdve az összes SQL utasítás ezen az adatbázison lesz értelmezve 2014. október 22. Adatbázisok 4 / 14
Relációsémák deniálása CREATE TABLE táblanév ( oszlopnév adattípus [feltételek],......, oszlopnév adattípus [feltételek], [táblafeltételek] ); Az adattípushoz a DEFAULT érték megadásával alapértelmezett érték deniáható (egyébként alapértelmezetten NULL) 2014. október 22. Adatbázisok 5 / 14
Adattípusok INT(n): egész szám, n darab szzámjegy CHAR(hossz): hossz hosszú karaktersorozat, x hosszú VARCHAR(hossz): változó hosszú, de maximálisan hossz hosszú karaktersorozat DATE: dátum: pl. '1988-12-21' TIME: id pont (óra, perc, másodperc) pl. 8:18:22 REAL: valós szám BIT(hossz): hossz darab bit 2014. október 22. Adatbázisok 6 / 14
Feltételek Egy adott oszlopra vonatkozó feltételek: PRIMARY KEY: els dleges kulcs UNIQUE: kulcs REFERENCES tábla(oszlop)[on-feltételek]: küls kulcs Táblafeltételek: PRIMARY KEY: els dleges kulcs UNIQUE: kulcs FOREIGN KEY(oszloplista) REFERENCES tábla(oszloplista): küls kulcs Ha a (küls ) kulcs több oszlopból áll, akkor csak táblafeltétel formájában adható meg! 2014. október 22. Adatbázisok 7 / 14
Példa Feladat: Hozzuk létre az OSZTÁLY(osztálykód, osztálynév, vezadószám) DOLGOZÓ(adószám, név, lakcím, osztálykód) CREATE TABLE Osztaly( osztalykod CHAR(3) PRIMARY KEY, osztalynev CHAR(20), vezadoszam DECIMAL(10) ); CREATE TABLE Dolgozo( adoszam DECIMAL(10) PRIMARY KEY, nev CHAR(30), lakcim CHAR(40) DEFAULT 'ismeretlen', osztalykod CHAR(3) REFERENCES Osztaly(osztalykod), ); 2014. október 22. Adatbázisok 8 / 14
ON-feltételek A tábla módosításakor a deniált kulcsfeltételek automatikusan ellen rzésre kerülnek Küls kulcsok esetén szabályozható a rendszer viselkedése: Legyen T 1 a hivatkozó tábla, T 2 a hivatkozott tábla ON UPDATE CASCADE = ha T 2 egy sorában változik a a kulcs értéke, akkor a rá való T 1 -beli hivatkozások is megfelel en módosulnak ON DELETE CASCADE = ha T 2 -ben törlünk egy sort, akkor T 1 -ben is törl dnek a rá hivatkozó sorok ON UPDATE SET NULL = ha T 2 egy sorában változik a a kulcs értéke, akkor T 1 -ben a rá való küls kulcs hivatkozások értéke NULL lesz ON DELETE SET NULL = mint a CASCADEm csak NULL-ra állítja 2014. október 22. Adatbázisok 9 / 14
Táblák módosítása Új oszlop hozzáadása ALTER TABLE táblanév ADD(oszlopnév típus[táblafeltétel]); Oszlop módosítása ALTER TABLE táblanév MODIFY(oszlopnév típus[táblafeltétel]); Oszlopok törlése ALTER TABLE táblanév DROP(oszlop, oszlop,..., oszlop); Tábla törlése DROP TABLE táblanév; 2014. október 22. Adatbázisok 10 / 14
Példa ALTER TABLE Dolgozo ADD (szuldatum DATE); ALTER TABLE Dolgozo MODIFY (lakcim VARCHAR(60)); ALTERTABLE Osztaly MODIFY (vezadoszam REFERENCES Dolgozo(adoszam)); 2014. október 22. Adatbázisok 11 / 14
Új rekord felvétele INSERT INTO táblanév[(oszloplista)] VALUES (értéklista); Két fajtája: Ismerünk minden adatot és abban a sorrendben adjuk meg, ahogy a táblában a mez nevek egymás után következnek: INSERT INTO Dolgozo VALUES(1111, 'Tóth Aladár', 'Szeged, Kálvária tér 2.', '12'); A mez k számától függetlenül, csak néhány mez t kitöltve adjuk meg INSERT INTO Dolgozo(nev, adoszam) VALUES ('Tóth Aladár', 1111); (a mez k értéke, melyek nem szerepelnek, NULL lesz) 2014. október 22. Adatbázisok 12 / 14
Adatok módosítása UPDATE táblanév SET oszlop 1 = kifejezés 1,..., oszlop n = kifejezés n [WHERE feltétel]; Az értékadás minden olyan soron végrehajtódik, amely eleget tesz a WHERE feltételnek (ennek hiányában az össze sorra) Pl.:UPDATE Dolgozo SET lakcim = 'Szeged', Rózsa u. WHERE nev = 'Tóth Aladár'; 5.' 2014. október 22. Adatbázisok 13 / 14
Adatok törlése DELETE FROM táblanév [WHERE feltétel]; Hatására azon sorok törl dnek, amelyek eleget tesznek a WHERE feltételnek (ennek hiányában pedig az összes sor törl dik a táblában, de a séma megmarad!) Pl.: DELETE FROM Dolgozo WHERE adoszam = 1111; 2014. október 22. Adatbázisok 14 / 14
Adatbázisok 9. gyakorlat SQL: SELECT 2014. október 29. 2014. október 29. Adatbázisok 1 / 14
SQL SELECT Lekérdezésre a SELECT utasítás szolgál, mely egy vagy több adattáblából egy eredménytáblát állít el Szintaxis: SELECT [DISTINCT] oszloplista FROM táblanévlista [WHERE feltétel]; Ha a SELECT utáni oszloplista helyére *-ot írunk, akkor az összes oszlop értéke lesz lekérdezhet A FROM utáni táblanév listában több tábla is szerepelhet, ilyenkor ezek Descartes-szorzata képz dik WHERE feltétellel a számunkra relevánsak kiválasztása 2014. október 29. Adatbázisok 2 / 14
SQL SELECT Kib vített szintaxis: SELECT [DISTINCT] oszlop 1,..., oszlop n FROM tábla 1,..., tábla n [WHERE feltétel] [GROUP BY oszlop 1,..., oszlop n ] [HAVING feltétel] [ORDER BY oszlop 1,..., oszlop n ] 2014. október 29. Adatbázisok 3 / 14
El z órai példa módosítása CREATE TABLE Osztaly( osztalykod INT(3) PRIMARY KEY, osztalynev CHAR(20), vezadoszam DECIMAL(10) ); CREATE TABLE Dolgozo( adoszam DECIMAL(10) PRIMARY KEY, nev CHAR(30), lakcim CHAR(40) DEFAULT 'ismeretlen', zetes INT(6), osztalykod INT(3) REFERENCES Osztaly(osztalykod) ); 2014. október 29. Adatbázisok 4 / 14
Példák Legegyszer bb SELECT utasítás egy tábla teljes tartalmának lekérdezése: SELECT * FROM Dolgozo; Ha csak bizonyos adatokra vagyunk kíváncsiak (adószám, név, zetés): SELECT adoszam, nev, zetes FROM Dolgozo; A WHERE feltétel megadásával a sorokra adhatunk meg sz rési feltételeket Pl.: az összes 50000 forintnál nagyobb zetés dolgozók nevének kilistázása SELECT DISTINCT nev FROM Dolgozo WHERE zetes > 50000; DISTINCT - az azonos sorok közül csak egyet jelenít meg 2014. október 29. Adatbázisok 5 / 14
Függvények Összesít függvények COUNT (oszlop): sorok számát adja vissza (oszlop helyett * is szerepelhet, ilyenkor nem lehet DISTINCT) SUM (oszlop): adott oszlopban szerepl értékek összegét adja vissza MIN (oszlop): adott oszlopban szerepl értékek minimumát adja vissza MAX (oszlop): adott oszlopban szerepl értékek maximumát adja vissza AVG (oszlop): adott oszlopban szerepl értékek átlagát adja vissza Az oszlopnév el tt szerepelhet a DISTINCT kulcsszó 2014. október 29. Adatbázisok 6 / 14
Példák Dolgozók számának lekérdezése SELECT COUNT(*) FROM Dolgozo; Hány osztályon vannak dolgozók? SELECT COUNT(DISTINCT osztkod) FROM Dolgozo; A dolgozók átlagzetése SELECT AVG(zetes) FROM Dolgozo; A dolgozók zetésének összege SELECT SUM(zetes) FROM Dolgozo; 2014. október 29. Adatbázisok 7 / 14
Függvények Logikai függvények: AND - és kapcsolat OR - vagy kapcsolat NOT - negáció, tagadás Speciális logikai függvények: 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 halmaz egy elemével x LIKE minta - igaz, ha az x karaktersorozat megfelel a megadott mintának _ : egy tetsz leges karakter % : tetsz leges szám tetsz leges karakter 2014. október 29. Adatbázisok 8 / 14
Példák Az 50000 és 70000 forint között keres k dolgozók neve SELECT DISTINCT nev FROM Dolgozo WHERE zetes BETWEEN 50000 AND 70000; Az 1-es, 2-es vagy 5-ös osztályon dolgozók nevei SELECT DISTINCT nev FROM Dolgozo WHERE osztkod IN(1, 2, 5); Az összes "M" bet vel kezd d dolgozó kilistázása, akinek a nevében a harmadik bet "r" bet SELECT DISTINCT nev FROM Dolgozo WHERE nev LIKE 'M_r%'; 2014. október 29. Adatbázisok 9 / 14
Összesítés, csoportosítás A tábla sorainak oszloponkénti összesítésére a GROUP BY oszloplista parancs szolgál Egy csoportba azon sorok tartaóoznak, melyeknél az oszloplista értéke azonos Pl.: Dolgozó táblában osztályonkénti átlagzetés SELECT osztkod, AVG(zetes) FROM Dolgozo GROUP BY osztkod; A SELECT után az összesít függvényen kívül csak olyan oszlopnév feltüntetésének van értelme, amely a GROUP BY-ban is szerepel A GROUP BY által leképezett csoportok között a HAVING feltétel alparancs segítségével válogathatunk 2014. október 29. Adatbázisok 10 / 14
Példa Kérdezzük le, hogy hány dolgozó van az egyes osztályokon, listázzuk ki az osztály kódját és mellé az osztályon dolgozók számát! Csak azon osztályokat jelenítsük meg, amelyeken legalább 2 ember dolgozik! SELECT osztkod, COUNT(adoszam) AS dolgozok_szama FROM Dolgozo GROUP BY osztkod HAVING dolgozok_szama 2; 2014. október 29. Adatbázisok 11 / 14
Rendezés Az eredménytábla sorait rendezhetjük az ORDER BY segítségével Alapértelmezés szerint a rendezés növekv sorrendben történik (ASC), ha fordítva szerenénk, akkor a DESC kulcsszó írandó a megfelel oszlopnév után Pl.: Dolgozók és zetéseik listája az osztálykódok növekv, ezen belül a zetések csökken sorrendjében: SELECT osztkod, nev, zetes FROM Dolgozo ORDER BY osztkod, zetes DESC; 2014. október 29. Adatbázisok 12 / 14
Két tábla összekapcsolása Tfh. a dolgozók listáját úgy szeretnénk kiíratni, hogy ne az osztálykód szerepeljen a dolgozó adatai mellett, hanem az osztály neve SELECT adoszam, nev, lakcim, zetes, osztalynev FROM Dolgozo, Osztaly WHERE Dolgozo.osztkod = Osztaly.osztalykod; A táblák Descartes szorzatából csak azok a sorok maradnak meg, amelyek kapcsolódnak Ezt természetes összekapcsolásnak/bels összekapcsolásnak (natural join/inner join) nevezzük SELECT adoszam, nev, lakcim, zetes, osztalynev FROM Osztaly INNER JOIN Dolgozo ON Dolgozo.osztkod = Osztaly.osztalykod; 2014. október 29. Adatbázisok 13 / 14
Továbbfejlesztett példa Kérdezzük le, hogy hány dolgozó van az egyes osztályokon, listázzuk ki az osztály nevét és mellé az adott osztályon dolgozók számát! Csak azokat az osztályokat jelenítsük meg, amelyeken legalább 2 ember dolgozik! SELECT osztalynev, COUNT(adoszam) AS dolgozok_szama FROM Dolgozo, Osztaly WHERE Dolgozo.osztkod = Osztaly.osztalykod GROUP BY osztkod HAVING dolgozok_szama 2; 2014. október 29. Adatbázisok 14 / 14
Adatbázisok 10. gyakorlat SQL: Táblák összekapcsolása, allekérdezések 2014. november 5. 2014. november 5. Adatbázisok 1 / 11
Néhány gondolat... A végleges dokumentáció leadási határideje: 2014. november 16. 23:55:00 Végleges EK-diagram Relációs adatbázisséma Normalizálás 3 nemtriviális lekérdezés Az alkalmazás szolgáltatásai A rendszer megvalósítása (fejleszt eszköz) Kötelez program beadási határideje (CooSpace): 2014. november 23. 23:55:00 Kötelez program bemutatása a 11. héten: +2 pont 12. héten: +1 pont 2014. november 5. Adatbázisok 2 / 11
További ALIAS példa A SELECT után megadott oszloplista valójában nem csak oszlopneveket, hanem tetsz leges kifejezéseket is tartalmazhat, és az eredménytábla oszlopainak elnevezésére alias neveket adhatunk meg: Legyen: Raktár(cikkszám, név, egységár, mennyiség) SELECT név AS áru, egységár * mennyiség AS érték FROM Raktár; 2014. november 5. Adatbázisok 3 / 11
Táblák összekapcsolása El z órai természetes összekapcsolás: SELECT adoszam, nev, lakcim, zetes, osztalynev FROM Osztaly INNER JOIN Dolgozo ON Dolgozo.osztkod = Osztaly.osztalykod; Probléma: ha összesít függvényeket akarunk használni táblaösszekapcsolással, kihagyhat sorokat 2014. november 5. Adatbázisok 4 / 11
Példa Kérdezzük le, hogy az egyes osztályokon hány ember dolgozik, és megjeleníteni az osztály nevét, valamint az ott dolgozó személyek számát SELECT osztalynev, COUNT(adoszam) AS dolgozok_szama FROM Osztaly INNER JOIN Dolgozo ON Dolgozo.osztkod = Osztaly.osztalykod GROUP BY osztalynev; Nem jó megoldás az adott feladatra! Küls összekapcsolás szükséges. LEFT [OUTER] JOIN - bal küls összekapcsolás RIGHT [OUTER] JOIN - jobb küls összekapcsolás FULL [OUTER] JOIN - teljes küls összekapcsolás 2014. november 5. Adatbázisok 5 / 11
Bal oldali összekapcsolással: SELECT osztalynev, COUNT(adoszam) AS dolgozok_szama FROM Osztaly LEFT OUTER JOIN Dolgozo ON Dolgozo.osztkod = Osztaly.osztalykod GROUP BY osztalynev; Jobb oldali összekapcsolással: SELECT osztalynev, COUNT(adoszam) AS dolgozok_szama FROM Dolgozo RIGHT OUTER JOIN Osztaly ON Dolgozo.osztkod = Osztaly.osztalykod GROUP BY osztalynev; 2014. november 5. Adatbázisok 6 / 11
Allekérdezések - Példa I. Az olyan lekérdezéseket, melyek egy másik lekérdezés WHERE vagy HAVING feltételeibe beágyazva találhatóak, alkérdéseknek/allekérdezéseknek, vagy bels SELECT-eknek nevezzük Pl. Az átlagnál nagyobb zetéssel rendelkez dolgozók kiválasztása zetés szerinti csökken sorrendben SELECT adoszam, nev, zetes FROM Dolgozo WHERE zetes > (SELECT AVG(zetes) FROM Dolgozo) ORDER BY DESC; 2014. november 5. Adatbázisok 7 / 11
Allekérdezések - Példa II. Lista azon osztályok kódjáról és nevér l, ahol az átlagzetés nagyobb, mint 50000 SELECT osztalykod, osztalynev FROM Osztaly WHERE (SELECT AVG(zetes) FROM Dolgozo WHERE Dolgozo.osztkod = Osztaly.osztalykod) > 50000 2014. november 5. Adatbázisok 8 / 11
Allekérdezések - Példa III. Lista azon osztályokról, amelyekben létezik olyan dolgozó, aki 60000 forint felett keres SELECT osztalynev FROM Osztaly WHERE osztalykod IN (SELECT osztkod FROM Dolgozo WHERE zetes > 60000); 2014. november 5. Adatbázisok 9 / 11
Allekérdezések - Példa IV. Töröljük azokat az osztályokat, amelyeken nem dolgozik egyetlen személy sem DELETE FROM Osztaly WHERE NOT EXISTS ( SELECT * FROM Dolgozo WHERE Dolgozo.osztkod = Osztaly.osztalykod); 2014. november 5. Adatbázisok 10 / 11