ADATBÁZISOK
ISMÉTLÉS…
SELECT Záradékok sorrendje 1.INTO 2.FROM 3.WHERE 4.GROUP BY 5.HAVING 6.UNION/MINUS 7.INTERSECT 8.ORDER BY
EGYTÁBLÁS CSOPORTOSÍTÓ LEKÉRDEZÉSEK
Csoportosító függvények SUM - Összeg AVG - Átlag MIN - Minimum MAX - Maximum COUNT – Rekordok száma STDDEV - Szórás VARIANCE - Variancia
Nem-csoportosító használat select avg(sal) as "Átlag" from emp; select min(sal) from emp; select min(sal) from emp where sal>2000; select avg(distinct sal) as "Átlag" from emp; select count(sal) from emp; select count(comm) from emp where sal>2000; select comm from emp where sal>2000; select count(*) from emp where sal>2000;
Csoportosítás select distinct deptno from emp; select avg(sal) from emp where deptno=10; select avg(sal) from emp where deptno=20; select avg(sal) from emp where deptno=30; select deptno, avg(sal) from emp group by deptno; select deptno, avg(comm) from emp group by deptno; NULL nincs benne!
Csoportosítás A SZELEKCIÓS LISTÁBAN CSAK CSOPORTOSÍTOTT MEZŐ ÉS CSOPORTOSÍTÓ FÜGGVÉNYEK! (IGEN, MYSQL- BEN IS!!!) (ONLY_FULL_GROUP_BY) select deptno, avg(sal) as Atlag, min(sal) as Minimum, count(*) as Num from emp group by deptno;
Csoportosítás és záradékok select mgr, avg(sal) from emp group by mgr; select ifnull(mgr, "nincs") as boss, lpad(avg(sal), 15, '#') as "Átlagfiz" from emp group by mgr; HAVING vs. WHERE select mgr, avg(sal) from emp where ename like '%E%' group by mgr; select mgr, avg(sal) from emp where ename like '%E%' group by mgr having avg(sal)>1300; select mgr, avg(sal) as atl from emp where ename like '%E%' group by mgr having avg(sal)>1300 order by atl desc;
Komplikáltabb csoportosító lekérdezések select min(max(sal)), max(max(sal)), round(avg(max(sal))) from emp group by deptno; -- MySQL-ben „Invalid use of group function” select min(sal+ nvl(comm,0)), mod(empno,3) from emp group by mod(empno,3) having min(sal+nvl(comm,0)) > 800;
Komplikáltabb csoportosító lekérdezések select ename, hiredate, (to_char(sysdate, 'YYYY')-to_char(hiredate, 'YYYY')) as diff from emp; select count(*),(to_char(sysdate, 'YYYY')- to_char(hiredate, 'YYYY')) as diff from emp group by (to_char(sysdate, 'YYYY')- to_char(hiredate, 'YYYY')); select distinct depno, job from emp;
Komplikáltabb csoportosító lekérdezések select deptno, job, avg(sal), min(sal), max(sal) from emp group by deptno, job order by deptno, job; Grafikon: 2.23, 2.24 Oracle-specifikus „extrák” (MÉG nem tananyag): –GROUP BY GROUPING SETS –GROUP BY CUBE –GROUP BY ROLLUP
TÖBBTÁBLÁS LEKÉRDEZÉSEK
ELŐKÉSZÜLETEK create table emp1 as select * from emp; create table dept1 as select * from dept; update emp1 set deptno=50 where ename='WARD'; sérül a konzisztencia, de legalább tudunk tesztelni!
LEKÉRDEZÉS TÖBB TÁBLÁBÓL select * from emp1, dept1; select * from emp1, emp1; select * from emp1 a, emp1 b; select a.empno, a.ename, b.empno, b.ename from emp1 a, emp1 b; select a.ename, a.deptno, b.deptno, b.dname from emp1 a,dept1 b; „Cross Join” Descartes szorzat EMP1 DEPT1
"MANUAL JOIN" select a.ename, a.deptno, b.deptno, b.dname from emp1 a, dept1 b where a.deptno=b.deptno; Hova tűnt Ward??? select a.empno, a.ename, a.mgr, b.empno, b.ename, b.mgr from emp1 a, emp1 b where a.mgr=b.empno; Hova tűnt King???
JOIN A lekérdezés FROM záradékába kerül SELECT * FROM tábla1, tábla2 SELECT * FROM tábla1 JOIN_KIFEJEZÉS tábla2 JOIN_FELTÉTEL Táblák csatolása: Az idegen kulcs és az elsődleges kulcs összekapcsolása Az indexelt mezők kapcsolása gyorsít, nem- kulcsmezők csatolása nagyon lassú
NATURAL / INNER JOIN Az eredmény ugyanaz, mint "MANUAL JOIN"-nál alapértelmezetten csak azonos mezőnevek esetén működik ! (…) select * from emp1 natural inner join dept1; -- MySQL-ben nincs! select * from emp1 natural join dept1; select * from emp1 inner join dept1 using (deptno); select * from emp1 inner join dept1 on (emp1.deptno=dept1.deptno);
LEFT JOIN … ON … Akkor használt, ha a nem létező párokat is látni akarjuk select a.ename, a.deptno, b.deptno, b.dname from emp1 a LEFT JOIN dept1 b ON a.deptno=b.deptno; select a.empno, a.ename, a.mgr, b.empno, b.ename, b.mgr from emp1 a LEFT JOIN emp1 b ON a.mgr=b.empno;
LEFT/RIGHT JOIN … ON … select a.ename, a.deptno, b.deptno, b.dname from emp1 a RIGHT JOIN dept1 b ON a.deptno=b.deptno; select a.ename, a.deptno, b.deptno, b.dname from dept1 b LEFT JOIN emp1 a ON a.deptno=b.deptno; Inkább a LEFT JOIN terjedt el
JOIN / ORACLE SELECT * FROM emp1 d, emp1 f WHERE d.mgr=f.empno (+); SELECT * FROM emp1 d LEFT JOIN emp1 f ON (d.mgr=f.empno) SELECT * FROM emp1 d, emp1 f WHERE d.mgr(+)=f.empno; SELECT * FROM emp1 d RIGHT JOIN emp1 f ON (d.mgr=f.empno) SELECT level, empno, ename, mgr FROM emp START WITH empno=7839 CONNECT BY mgr=prior empno ORDER BY level desc;
FULL JOIN LEFT JOIN és RIGHT JOIN együtt select a.empno, a.ename, a.deptno, b. deptno, b.dname from emp1 a FULL JOIN dept1 b ON (emp1.deptno=dept1.deptno); [szabvány szerint UNION JOIN; MySQL-ben egyik sincs…] "MANUAL" JOIN és LEFT JOIN a leggyakrabban használt
TÉVES KAPCSOLÁS??? SELECT ename, sal, dname FROM emp, dept WHERE emp.deptno=dept.deptno; SELECT ename, sal, dname FROM emp, dept WHERE emp.deptno=dept.deptno AND ename like '%E%'; SELECT ename, sal, dname FROM emp, dept WHERE emp.deptno=dept.deptno AND ename like '%E%' OR sal<3000; SELECT ename, sal, dname FROM emp, dept WHERE emp.deptno=dept.deptno AND (ename like '%E%' OR sal<3000);
TÁBLÁK ÖSSZEKAPCSOLÁSA
TÁBLÁK ÖSSZEKAPCSOLÁSA
TÁBLÁK ÖSSZEKAPCSOLÁSA
TÁBLÁK ÖSSZEKAPCSOLÁSA SELECT * FROM emp1 dolgozo, emp1 fonok, dept1 dolg_reszl, dept1 fon_reszl WHERE dolgozo.mgr=fonok.empno AND dolgozo.deptno=dolg_reszl.deptno AND fonok.deptno=fon_reszl.deptno; Jó, ha a pár-nélküli rekordokra nem kérdez rá a feladat!
TÁBLÁK ÖSSZEKAPCSOLÁSA SELECT * FROM emp1 dolgozo LEFT JOIN emp1 fonok ON (dolgozo.mgr=fonok.empno), dept1 dolg_reszl, dept1 fon_reszl WHERE dolgozo.deptno=dolg_reszl.deptno AND fonok.deptno=fon_reszl.deptno; NEM ELÉG
TÁBLÁK ÖSSZEKAPCSOLÁSA SELECT * FROM emp1 dolgozo LEFT JOIN emp1 fonok ON (dolgozo.mgr=fonok.empno) LEFT JOIN dept fon_reszl ON (fonok.deptno=fon_reszl.deptno) LEFT JOIN dept dolg_reszl ON (dolgozo.deptno=dolg_reszl.deptno); TÖKÉLETES
TÁBLÁK ÖSSZEKAPCSOLÁSA A többtáblás lekérdezésben is ugyanúgy használható minden záradék, az eredmény- tábla ugyanúgy kezelhető (pl. felhasználható allekérdezésben), mint az egyszerű tábla/lekérdezés Gyakorlat és strukturált szervezés kell a lekérdezések átláthatóságához!!!
TÁBLÁK ÖSSZEKAPCSOLÁSA Jelenítsük meg az 1000 USD feletti fizetésű dolgozók átlagfizetését és a főnökük nevét a főnök neve szerint csoportosítva. Csak azok a rekordok jelenjenek meg, ahol az átlagfizetés kisebb mint 5000 USD.
TÁBLÁK ÖSSZEKAPCSOLÁSA SELECT avg(a.sal) as ATL, b.ename as BOSS FROM emp a, emp b WHERE (a.mgr=b.empno) AND (a.sal>1000) GROUP BY b.ename HAVING avg(a.sal)<5000 ORDER BY ATL desc;
TÁBLÁK ÖSSZEKAPCSOLÁSA SELECT avg(a.sal) as ATL, b.ename as BOSS FROM emp a LEFT JOIN emp b ON a.mgr=b.empno WHERE a.sal>1000 GROUP BY b.ename HAVING avg(a.sal)<5000 ORDER BY ATL desc;
TÖBBTÁBLÁS LEKÉRDEZÉSEK "CROSS-JOIN", "MANUAL JOIN" INNER JOIN / NATURAL JOIN LEFT JOIN, RIGHT JOIN FULL JOIN / UNION JOIN
SELECT Záradékok sorrendje 1.INTO 2.FROM 3.WHERE 4.GROUP BY 5.HAVING 6.UNION/MINUS 7.INTERSECT 8.ORDER BY