8. gyakorlat sql: create able,t aktualizálás (insert ...mkatona/dbgyak2015/adatb_egybe_02.pdf ·...
TRANSCRIPT
Adatbázisok8. 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 De�nition Language) - adatstruktúra de�niáló uta-sítások
• DML (Data Manipulation Language) - adatokon végezhet® uta-sí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 de�niá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 de�niá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ételformá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 de�niált kulcsfeltételek automatikusanellen®rzésre kerülnek
• Küls® kulcsok esetén szabályozható a rendszer viselkedése:• Legyen T1 a hivatkozó tábla, T2 a hivatkozott tábla• ON UPDATE CASCADE = ha T2 egy sorában változik a a
kulcs értéke, akkor a rá való T1-beli hivatkozások is megfelel®enmódosulnak
• ON DELETE CASCADE = ha T2-ben törlünk egy sort, akkorT1-ben is törl®dnek a rá hivatkozó sorok
• ON UPDATE SET NULL = ha T2 egy sorában változik a a kulcsértéke, akkor T1-ben a rá való küls® kulcs hivatkozások értékeNULL 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 REFERENCESDolgozo(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 adjukmegINSERT 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évSET oszlop1 = kifejezés1, ...,
oszlopn = kifejezésn[WHERE feltétel];
• Az értékadás minden olyan soron végrehajtódik, amely elegettesz 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';
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 WHEREfeltételnek (ennek hiányában pedig az összes sor törl®dik a táb-lában, de a séma megmarad!)
• Pl.: DELETE FROM Dolgozo WHERE adoszam = 1111;
2014. október 22. Adatbázisok 14 / 14
Adatbázisok9. 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öbbadattáblából egy eredménytáblát állít el®
• Szintaxis:SELECT [DISTINCT] oszloplistaFROM 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, ilyen-kor 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] oszlop1, ..., oszlopnFROM tábla1, ..., táblan[WHERE feltétel][GROUP BY oszlop1, ..., oszlopn][HAVING feltétel][ORDER BY oszlop1, ..., oszlopn]
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ánakleké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ésifeltételeket
• Pl.: az összes 50000 forintnál nagyobb �zetés¶ dolgozók nevé-nek kilistázása
• SELECT DISTINCT nev FROM DolgozoWHERE �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 * isszerepelhet, ilyenkor nem lehet DISTINCT)
• SUM (oszlop): adott oszlopban szerepl® értékek összegét adjavissza
• MIN (oszlop): adott oszlopban szerepl® értékek minimumát adjavissza
• MAX (oszlop): adott oszlopban szerepl® értékek maximumátadja vissza
• AVG (oszlop): adott oszlopban szerepl® értékek átlagát adjavissza
• 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 átlag�zeté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 megadottmintá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 DolgozoWHERE �zetes BETWEEN 50000 AND 70000;
• Az 1-es, 2-es vagy 5-ös osztályon dolgozók nevei• SELECT DISTINCT nev FROM DolgozoWHERE osztkod IN(1, 2, 5);
• Az összes "M" bet¶vel kezd®d® dolgozó kilistázása, akinek anevében a harmadik bet¶ "r" bet¶
• SELECT DISTINCT nev FROM DolgozoWHERE 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 osz-loplista parancs szolgál
• Egy csoportba azon sorok tartaóoznak, melyeknél az oszloplistaértéke azonos
• Pl.: Dolgozó táblában osztályonkénti átlag�zetés• SELECT osztkod, AVG(�zetes) FROM DolgozoGROUP BY osztkod;
• A SELECT után az összesít® függvényen kívül csak olyan osz-lopnév feltüntetésének van értelme, amely a GROUP BY-ban isszerepel
• A GROUP BY által leképezett csoportok között a HAVING fel-té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ókszámát! Csak azon osztályokat jelenítsük meg, amelyekenlegalább 2 ember dolgozik!
• SELECT osztkod, COUNT(adoszam) AS dolgozok_szamaFROM DolgozoGROUP BY osztkodHAVING 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ó amegfelel® oszlopnév után
• Pl.: Dolgozók és �zetéseik listája az osztálykódok növekv®, ezenbelül a �zetések csökken® sorrendjében:
• SELECT osztkod, nev, �zetesFROM DolgozoORDER 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 osz-tálykód szerepeljen a dolgozó adatai mellett, hanem az osztályneve
• SELECT adoszam, nev, lakcim, �zetes, osztalynevFROM Dolgozo, OsztalyWHERE Dolgozo.osztkod = Osztaly.osztalykod;
• A táblák Descartes szorzatából csak azok a sorok maradnakmeg, amelyek kapcsolódnak
• Ezt természetes összekapcsolásnak/bels® összekapcsolásnak (na-tural join/inner join) nevezzük
• SELECT adoszam, nev, lakcim, �zetes, osztalynevFROM OsztalyINNER 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, lis-tázzuk ki az osztály nevét és mellé az adott osztályon dolgozókszámát! Csak azokat az osztályokat jelenítsük meg, amelyekenlegalább 2 ember dolgozik!
• SELECT osztalynev, COUNT(adoszam) AS dolgozok_szamaFROM Dolgozo, OsztalyWHERE Dolgozo.osztkod = Osztaly.osztalykodGROUP BY osztkodHAVING 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 pont12. 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 osz-lopneveket, hanem tetsz®leges kifejezéseket is tartalmazhat, ésaz eredménytábla oszlopainak elnevezésére alias neveket adha-tunk 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ékFROM 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ó sze-
mé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ásszü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ések-nek/allekérdezéseknek, vagy bels® SELECT-eknek nevezzük
• Pl. Az átlagnál nagyobb �zetéssel rendelkez® dolgozók kiválasz-tása �zetés szerinti csökken® sorrendben
• SELECT adoszam, nev, �zetesFROM DolgozoWHERE �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 átlag�zetésnagyobb, mint 50000
• SELECT osztalykod, osztalynevFROM OsztalyWHERE (SELECT AVG(�zetes)
FROM DolgozoWHERE 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ó, aki60000 forint felett keres
• SELECT osztalynevFROM OsztalyWHERE osztalykod IN (SELECT osztkod
FROM DolgozoWHERE �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 egyet-len személy sem
• DELETE FROM OsztalyWHERE NOT EXISTS (
SELECT *FROM DolgozoWHERE Dolgozo.osztkod = Osztaly.osztalykod);
2014. november 5. Adatbázisok 10 / 11