Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

2014. 07. ADATBÁZISOK

Hasonló előadás


Az előadások a következő témára: "2014. 07. ADATBÁZISOK"— Előadás másolata:

1 ADATBÁZISOK

2 ISMÉTLÉS…

3 SELECT Záradékok sorrendje 1.INTO 2.FROM 3.WHERE 4.GROUP BY 5.HAVING 6.UNION/MINUS 7.INTERSECT 8.ORDER BY

4 EGYTÁBLÁS CSOPORTOSÍTÓ LEKÉRDEZÉSEK

5 Csoportosító függvények SUM - Összeg AVG - Átlag MIN - Minimum MAX - Maximum COUNT – Rekordok száma STDDEV - Szórás VARIANCE - Variancia

6 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;

7 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!

8 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;

9 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;

10 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;

11 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;

12 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

13 TÖBBTÁBLÁS LEKÉRDEZÉSEK

14 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!

15 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

16 "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???

17 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ú

18 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);

19 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;

20 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

21 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;

22 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

23 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);

24 TÁBLÁK ÖSSZEKAPCSOLÁSA

25 TÁBLÁK ÖSSZEKAPCSOLÁSA

26 TÁBLÁK ÖSSZEKAPCSOLÁSA

27 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!

28 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

29 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

30 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!!!

31 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.

32 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;

33 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;

34 TÖBBTÁBLÁS LEKÉRDEZÉSEK "CROSS-JOIN", "MANUAL JOIN" INNER JOIN / NATURAL JOIN LEFT JOIN, RIGHT JOIN FULL JOIN / UNION JOIN

35 SELECT Záradékok sorrendje 1.INTO 2.FROM 3.WHERE 4.GROUP BY 5.HAVING 6.UNION/MINUS 7.INTERSECT 8.ORDER BY


Letölteni ppt "2014. 07. ADATBÁZISOK"

Hasonló előadás


Google Hirdetések