Adatbázisok 2. gyakorlat SQL 2016. november 12. 2016. november 12. Adatbázisok 1 / 31
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 2016. november 12. Adatbázisok 2 / 31
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 2016. november 12. Adatbázisok 3 / 31
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 2016. november 12. Adatbázisok 4 / 31
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) 2016. november 12. Adatbázisok 5 / 31
Adattípusok INT(n): egész szám, n darab szá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 2016. november 12. Adatbázisok 6 / 31
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! 2016. november 12. Adatbázisok 7 / 31
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 2016. november 12. Adatbázisok 8 / 31
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; 2016. november 12. Adatbázisok 9 / 31
Ú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) 2016. november 12. Adatbázisok 10 / 31
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. 5.' WHERE nev = 'Tóth Aladár'; 2016. november 12. Adatbázisok 11 / 31
Adatok törlése DELETE FROM táblanév [WHERE feltétel]; Hatására azon sorok törl dnek, amelyek eleget tesznek a WHE- RE 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; 2016. november 12. Adatbázisok 12 / 31
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 2016. november 12. Adatbázisok 13 / 31
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 ] 2016. november 12. Adatbázisok 14 / 31
Példák Legegyszer bb SELECT utasítás egy tábla teljes tartalmának lekérdezése: SELECT * FROM Fuvar; Ha csak bizonyos adatokra vagyunk kíváncsiak (sofor_id, cel_cim, utvonal_ideje): SELECT sofor_id, cel_cim, utvonal_ideje FROM Fuvar; A WHERE feltétel megadásával a sorokra adhatunk meg sz rési feltételeket Pl.: az összes sof r id kiliestázása, ahol a tarifa azonosító nagyobb, mint 1 SELECT DISTINCT sofor_id FROM Fuvar WHERE tarifa_azon > 1; DISTINCT - az azonos sorok közül csak egyet jelenít meg 2016. november 12. Adatbázisok 15 / 31
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ó 2016. november 12. Adatbázisok 16 / 31
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 2016. november 12. Adatbázisok 17 / 31
Függvények Összesít függvények - Ismétlés 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ó 2016. november 12. Adatbázisok 18 / 31
Példák Sof rök számának lekérdezése SELECT COUNT(*) FROM Sofor; Hány járm volt már használatban? SELECT COUNT(DISTINCT rendszam) FROM Fuvar; Tarifa átlagos ára SELECT AVG(km_ara) FROM Tarifa; Az eddig megtett km-ek SELECT SUM(utvonal_hossza) FROM Fuvar; 2016. november 12. Adatbázisok 19 / 31
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 2016. november 12. Adatbázisok 20 / 31
Példák A 2 és 4 közötti azonosítóval rendelkez sof rök neve SELECT sofor_id FROM Sofor WHERE nev BETWEEN 2 AND 4; Az 1-es, 3-as vagy 5-ös azonosítójú sof rök nevei SELECT nev FROM Sofor WHERE sofor_id IN(1, 3, 5); Az összes "M" bet vel kezd d sof r kilistázása, akinek a nevében a harmadik bet "g" bet SELECT nev FROM Sofor WHERE nev LIKE 'M_g%'; 2016. november 12. Adatbázisok 21 / 31
Ö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 tartoznak, melyeknél az oszloplista értéke azonos Pl.: Sof r táblában összútvonal sof rönként listázva SELECT sofor_id, SUM(utvonal_hossza) FROM Fuvar GROUP BY sofor_id; 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 2016. november 12. Adatbázisok 22 / 31
Példa Kérdezzük le, hogy hány sof r van, listázzuk a sof r kódját és mellé az az összesen megtett km-t! Csak azon sof rök kódját jelenítsük meg, akik legalább 6 km-t megtettek! SELECT sofor_id, SUM(utvonal_hossza) AS osszutvonal FROM Sofor GROUP BY sofor_id HAVING osszutvonal 6; 2016. november 12. Adatbázisok 23 / 31
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.: A települések és irányítószámaik kilistázása az irányítószámuk szerinti csökken sorrendben: SELECT * FROM Telepules ORDER BY irsz DESC; 2016. november 12. Adatbázisok 24 / 31
Két tábla összekapcsolása Tfh. a rendszámok mellé nem a sof r azonosítóját szeretnénk kiíratni, hanem a nevét SELECT rendszam, nev FROM Sofor, Jarmu WHERE Sofor.sofor_id = Jarmu.sofor_id; 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 rendszam, nev FROM Jarmu INNER JOIN Sofor ON Sofor.sofor_id = Jarmu.sofor_id; 2016. november 12. Adatbázisok 25 / 31
Továbbfejlesztett példa Kérdezzük le, hogy a sof rök neveit és hogy hány km utat tettek meg összesen! Csak azokat a neveket és összutakat jelenítsük meg, amik elérik a 6 km-t! SELECT nev, SUM(utvonal_hossza) AS osszut FROM Sofor, Fuvar WHERE Sofor.sofor_id = Fuvar.sofor_id GROUP BY nev HAVING osszut 6; 2016. november 12. Adatbázisok 26 / 31
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: SELECT sofor_id, utvonal_hossza * megtett_km AS ár FROM Fuvar, Tarifa WHERE Fuvar.tarifa_azon = Tarifa.tarifa_azon; 2016. november 12. Adatbázisok 27 / 31
Természetes összekapcsolás T 1 T 2 Példa: SELECT olvaso.olvasoszam, nev, lakcim, cim, konyvszam, szerzo, kivetel FROM konyvtar, olvaso WHERE konyvtar.olvasoszam = olvaso.olvasoszam SELECT olvaso.olvasoszam, nev, lakcim, cim, konyvszam, szerzo, kivetel FROM olvaso INNER JOIN konyvtar ON konyvtar.olvasoszam = olvaso.olvasoszam 2016. november 12. Adatbázisok 28 / 31
Küls összekapcsolás - Bal oldali küls összekapcsolás T 1 (+) T 2 SELECT olvaso.olvasoszam, nev, lakcim, cim, konyvszam, szerzo, kivetel FROM olvaso LEFT OUTER JOIN konyvtar ON konyvtar.olvasoszam = olvaso.olvasoszam 2016. november 12. Adatbázisok 29 / 31
Küls összekapcsolás - Jobb oldali küls összekapcsolás T 1 (+)T 2 SELECT olvaso.olvasoszam, nev, lakcim, cim, konyvszam, szerzo, kivetel FROM olvaso RIGHT OUTER JOIN konyvtar ON konyvtar.olvasoszam = olvaso.olvasoszam 2016. november 12. Adatbázisok 30 / 31
Küls összekapcsolás - "Teljes küls összekapcsolás" T 1 (+) (+)T 2 SELECT olvaso.olvasoszam, nev, lakcim, cim, konyvszam, szerzo, kivetel FROM olvaso RIGHT OUTER JOIN konyvtar ON konyvtar.olvasoszam = olvaso.olvasoszam UNION SELECT olvaso.olvasoszam, nev, lakcim, cim, konyvszam, szerzo, kivetel FROM olvaso LEFT OUTER JOIN konyvtar ON konyvtar.olvasoszam = olvaso.olvasoszam 2016. november 12. Adatbázisok 31 / 31