Adatbázisok I 1 SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER Módosítás: DML: - rekord felvitel INSERT - rekord törlés DELETE - rekord módosítás UPDATE Lekérdezés: DQL: - lekérdezés SELECT Vezérlés DCL: - védelem GRANT,.. - tranzakció kezelés COMMIT,.. 2
SQL nyelv Táblák összekapcsolása Descartes szorzat: SELECT * FROM táblanév1, táblanév2 Vagy SELECT * FROM táblanév1 CROSS JOIN táblanév2 Az eredményhalmaz sorainak száma= táblanév1.sorainakszama*táblanév2.sorainakszama Belső összekapcsolás (Theta összekapcsolás) INNER JOIN művelet SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.attribútum1 = tabla2.attribútum2; 3 INNER JOIN Táblák összekapcsolása Egy vagy több mezőegyezése alapján kapcsolja össze a rekordokat, de csak azokat, amelyben a JOIN operátorban megadott mezők egyeznek. 4
Reláció aliasok Táblák összekapcsolása SELECT alias.attribútum FROM relació[as] alias; Tábla összekapcsolása önmagával SELECT alias1.attribútum1, alias2.attribútum2, FROM reláció[as] alias1, reláció AS alias2; 5 SQL SELECT - a join megadása SELECT mlista FROM tabla1, tabla2,.. WHERE feltétel; AUTÓ rsz tulaj r1 3 r4 1 r6 4 EMBER id név 1 Laci 2 Ágota 3 János 4 Zoltán összekapcsolás rsz tulaj id név r1 3 1 Laci r4 1 1 Laci r6 4 1 Laci r1 3 2 Ágota r4 1 2 Ágota r6 4 2 Ágota r1 3 3 János r4 1 3 János r6 4 3 János r1 3 4 Zoltán r4 1 4 Zoltán r6 4 4 Zoltán Ha a feltétel elmarad Descartes szorzatot kapunk Kettőnél több tábla is összekapcsolható 6
SQL Szelekciós join: SELECT * FROM AUTO, EMBER WHERE TULAJ = ID; Ha több táblában is azonos elnevezésű mező van, akkor a kibővített mezőnevet használjuk: tábla.mező SELECT * FROM AUTO, EMBER WHERE AUTO.TULAJ = EMBER.ID; Ha hosszú a táblanév alias nevet használhatunk: tábla alias SELECT * FROM AUTO A, EMBER E WHERE A.TULAJ = E.ID; 7 Alkalmazott tábla (emp) Fizetési kategóriák (Salgrade tábla) Részlegek (osztályok; department) 8
Descartes szorzat Listázzuk ki az egyes részlegeken dolgozó alkalmazottakat! SELECT emp.ename as név, dept.dname "Részleg neve" FROM emp, dept Vagy : SELECT emp.ename as név, dept.dname "Részleg neve" FROM EMP Cross JOIN DEPT... NEM ÍGY GONDOLTUK! Eredmény sorainak száma 14*5=70 9 Egy feltétel megadásával már jó eredményt kapunk! SELECT emp.ename As név, dept.dname As "Részleg neve" FROM emp, dept WHERE emp.deptno=dept.deptno; 10
Azoknak az alkalmazottaknak a neve, részlegük neve, és a részleg telephelye, akiknek a nevében R betű van. SELECT emp.empno As Azonosító, emp.ename As név, dept.dname As "Részleg neve", dept.loc As telephely FROM emp, dept WHERE emp.deptno=dept.deptno AND emp.ename LIKE '%R%'; 11 Az egyes alkalmazottak milyen fizetési kategóriába esnek? SELECT emp.ename As név, emp.sal As fizetes, salgrade.grade As "fizetési besorolás" FROM emp, salgrade WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal; 12
Tábla összekapcsolása saját magával Adjuk meg a dolgozók és főnökeik nevét! SELECT dolgozo.ename As dolgozó, fonok.ename AS Főnök FROM emp dolgozo, emp fonok WHERE dolgozo.mgr=fonok.empno; 13 Táblák összekapcsolása Külső összekapcsolás SELECT * FROM reláció1 LEFT RIGHT JOIN reláció2 ON reláció1.attribútum1 = reláció2.attribútum2; Külsőösszekapcsolásnál fontos szerepe van annak, hogy a FROM kulcsszóután melyik tábla szerepel. Ezt bal oldali táblának hívjuk. A JOIN operátorban megadott tábla lesz a jobb oldali tábla. A LEFT OUTER JOIN a bal oldali tábla minden sorát, a RIGHT OUTER JOIN a jobb oldali tábla minden sorát tartalmazza, akkor is, ha nem talál illeszkedést a másik táblában. 14
Számoljuk meg részlegenként az alkalmazottak számát! SELECT d.dname As részlegnév, count(e.ename) AS létszám FROM emp e, dept d WHERE e.deptno=d.deptno GROUP BY d.dname; De hol a Operations és a Kereskedes részleg? Ezen segít a külső összekapcsolás SELECT d.dname As részlegnév, count(e.ename) AS létszám FROM dept d LEFT OUTER JOIN emp e ON e.deptno=d.deptno GROUP BY d.dname; 15 Adjuk meg részlegenként a dolgozók nevét! SELECT e.ename As név, d.deptno As kód, d.dname As részlegnév FROM emp e Right OUTER JOIN dept d ON e.deptno=d.deptno; 16
Táblák összekapcsolása FULL OUTER JOIN művelet Eredménye a jobb és bal oldali táblák minden sorát fogja tartalmazni, azokat is, amelyekhez nincs illeszkedés a másik oldalon. 17 SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER Módosítás: DML: - rekord felvitel INSERT - rekord törlés DELETE - rekord módosítás UPDATE Lekérdezés: DQL: - lekérdezés SELECT Vezérlés DCL: - védelem GRANT,.. - tranzakció kezelés COMMIT,.. 18
Módosítás Rekord felvitele: INSERT INTO tabla VALUES (mezo=ertek, ); Az érték lehet NULL is. Nem maradhat ki mező. Fontos a mezősorrend INSERT INTO AUTO VALUES ( bju564,234, FIAT ); INSERT INTO AUTO VALUES ( bju564,234,null); INSERT INTO AUTO VALUES (RSZ= bju564,...); 19 Módosítás Rekord törlése: DELETE FROM tabla WHERE feltétel; A feltételnek eleget tevő rekordok törlődnek Ha elmarad a WHERE tag, minden rekord törlődik DELETE FROM AUTO WHERE AR<1200000; Rekord módosítása: UPDATE tabla SET mezo= érték,... WHERE feltétel; A feltételnek eleget tevő rekordok módosulnak Ha elmarad a WHERE tag, minden rekord módosul UPDATE AUTO SET AR = AR * 1.2 WHERE AR<1200000; 20
SQL mintapéldák BOROK(kod, nev, gyarto, fajta, ar) VEVO(vkod, nev, cim) RENDELES(vevo, bor, mennyiseg,datum) 1. azon vevők, akik rendeltek Bikavért SELECT V.NEV FROM VEVO V, RENDELES R, BOROK B WHERE V.VKOD = R.VEVO AND R.BOR = B.KOD AND B.NEV LIKE BIKAVER% ; 2. Melyik gyártó termel 5-nél több vörös bort SELECT GYARTO FROM BOROK WHERE FAJTA = VOROS GROUP BY GYARTO HAVING COUNT(*) > 5; 21