adatbÁzisok hasznÁlata i. nik.uni-obuda.hu/szabozs
DESCRIPTION
ADATBÁZISOK HASZNÁLATA I. http://nik.uni-obuda.hu/szabozs/. ISMÉTLÉS…. ISMÉTLÉS. DDL: CREATE TABLE, DROP TABLE DDL: RENAME, ALTER TABLE DDL: NOT NULL, UNIQUE, PRIMARY KEY, REFERENCES DDL: PRIMARY KEY, FOREIGN KEY, CHECK DML: INSERT INTO, UPDATE, DELETE FROM - PowerPoint PPT PresentationTRANSCRIPT
04/21/23 [email protected] 2
ISMÉTLÉS…
04/21/23 [email protected] 3
ISMÉTLÉS
• DDL: CREATE TABLE, DROP TABLE• DDL: RENAME, ALTER TABLE• DDL: NOT NULL, UNIQUE, PRIMARY
KEY, REFERENCES• DDL: PRIMARY KEY, FOREIGN KEY,
CHECK• DML: INSERT INTO, UPDATE, DELETE
FROM• TRANZAKCIÓK: SAVEPOINT,
ROLLBACK, COMMIT
04/21/23 [email protected] 4
NÉZETEK
04/21/23 [email protected] 5
NÉZETEK
• CREATE VIEW {NÉV} AS {ALLEKÉRDEZÉS};
• CREATE [OR REPLACE] …; DROP VIEW;
• Allekérdezések elkerüléséhez, illetve rövidítéséhez használható áttekinthetőbb
• Ugyanúgy használható, mint egy egyszerű tábla, főleg SELECT utasítással használt (DE lehetséges UPDATE, DELETE FROM, INSERT is)
04/21/23 [email protected] 6
NÉZETEK
• create view NumOfBeoszt AS select mgr, count(*) as num from emp group by mgr;
• select ename, num from emp, NumOfBeoszt where empno=mgr;
• drop view NumOfBeoszt;
• Ha változik az emp változik a nézet is
• Create table vs Create view
04/21/23 [email protected] 7
"KONZISZTENS MÓDON"
• create or replace view dolgnezet as SELECT * FROM emp WHERE mod(empno, 2)=0;
• Konzisztens=nem lehet sérült hivatkozás
• Vagyis: nem lehet olyan főnök az MGR oszlopban, aki nem szerepel a táblában
04/21/23 [email protected] 8
"KONZISZTENS MÓDON"
• CREATE TABLE dolgozo AS SELECTempno, ename, job,CASE WHEN mgr IN (SELECT empno FROM dolgnezet) THEN mgr ELSE NULL END AS mgr,hiredate, sal, comm, deptnoFROM dolgnezet;
04/21/23 [email protected] 9
"KONZISZTENS MÓDON"Egyszerűbben:• CREATE TABLE dolgozo AS
SELECT * FROM dolgnezet;• UPDATE dolgozo
SET mgr=nullWHERE mgr NOT IN
(select empno from dolgozo);Legegyszerűbben (worst case):• CREATE TABLE dolgozo AS SELECT *
FROM EMP;
04/21/23 [email protected] 11
ROWNUM
• Az Oracle minden eredmény-sorhoz sorszámot rendel, ez a ROWNUM mező
• WHERE-ben használható:
select ename, rownum from emp where rownum<=3 order by ename;
• Az ORDER BY hátrébb van Nem a rendezett sorból válogat CSAK allekérdezéssel használható!!
04/21/23 [email protected] 12
ROWNUM• SELECT rownum, ename FROM (select
ename from emp order by ename) WHERE rownum<=3;
• SELECT rownum, ename, rown FROM (select rownum as rown, ename from emp order by ename) WHERE rownum<=3;
Csak < és <= !!!!
04/21/23 [email protected] 13
ROWNUM• SELECT rownum, ename FROM (select ename
from emp order by ename) WHERE rownum>1;
• SELECT rownum as rown, ename FROM (select ename from emp order by ename) WHERE rownum<=6 and rownum >3;
• SELECT * FROM (select rownum as rown, ename from (select ename from emp order by ename) where rownum<=6) WHERE rown>3;
04/21/23 [email protected] 14
ROWNUM + NÉZET• create or replace view sorrend as (select
rownum as rown, al.* from (select * from emp order by ename) al);
• select * from sorrend where rown=6;
• select * from sorrend where rown>6 and rown<10;
04/21/23 [email protected] 15
ROWNUM?
• CSAK az SQL2003 "szabványban" van hasonló dolog: row_number()
• A leginkább implementáció-függő rész…
!!! CSAK AZ ORACLE-T KELL TUDNI !!!
!!! CSAK A ROWNUM ISMERETE KELL!!!
04/21/23 [email protected] 16
ROWNUM ~ SZÁMOZÁSSAL• MSSQL: select rownum=identity(int,1,1),
ename into #temp from emp order by ename;select ename from #temp where rownum between {start} and {end};
• SYBASE: select rownum = identity(3), ename into #tempA from emp order by ename;select ename from #tempA where rownum between {start} and {end};
04/21/23 [email protected] 17
ROWNUM ~ SZÁMOZÁSSAL, MYSQL• set @num = 0;
SELECT emp.*, @num := (@num + 1) as row_number from emp;
• set @num = 0;SELECT emp.ename, emp.sal, @num := (@num + 1) as row_number from emp order by emp.ename WHERE row_number between {start} and {end};
04/21/23 [email protected] 18
ROWNUM ~ SZŰRÉS
• MSSQL / SYBASE: set rowcount {num}
• MSSQL: select TOP {length} ename from emp order by ename;
• SYBASE: select TOP {length} START AT {start} ename from emp order by ename;
• Postgresql, MySQL: select ename from emp order by ename LIMIT {start},{length} [= LIMIT X OFFSET Y]
04/21/23 [email protected] 19
ROWNUM?
• SQL SERVER 2005, Oracle, SZABVÁNY:
SELECT ROW_NUMBER() OVER (ORDER BY ENAME ASC) AS RNUM, ENAME FROM EMP; Allekérdezés …
!!! CSAK A ROWNUM ISMERETE KELL!!!
04/21/23 [email protected] 20
Gyakorlás
04/21/23 [email protected] 21
6.21
• +999 USD jutalék mindenkinek, akinek legalább kettő közvetlen beosztottja van.
• … nézettábla vagy allekérdezés?
• Cél: meghatározni, hogy kinek kell növelni a jutalékát
04/21/23 [email protected] 22
ALLEKÉRDEZÉS
• UPDATE emp SET comm=nvl(comm, 0)+999 WHERE empno IN(SELECT mgr FROM emp GROUP BY mgr HAVING count(*)>=2);
04/21/23 [email protected] 23
NÉZETTÁBLA
• CREATE OR REPLACE VIEW workers_num AS SELECT mgr FROM emp GROUP BY mgr HAVING count(*)>=2;
• UPDATE emp SET comm=nvl(comm,0)+999 WHERE empno IN
(select * from workers_num)
04/21/23 [email protected] 24
FELADAT
Írjon script-programot, mely megnöveli mindazok fizetését(sal) egy, a felhasználó által megadott értékkel, akiknek nincs, vagy nulla a jutalékuk, foglalkozási csoportjukban egynél többen vannak, valamint Dallas-ban vagy Chicago-ban dolgoznak. […]
drop table emp1; create table emp1 as select * from emp;
04/21/23 [email protected] 25
RÉSZLEG-FELTÉTEL
• CREATE VIEW data1 ASSELECT empno FROM emp1, deptWHERE emp1.deptno=dept.deptno AND
dept.loc IN ('DALLAS', 'CHICAGO');
• Eredmény: azon dolgozó-azonosítók listája, akik Dallasban, illetve Chicagoban dolgoznak
04/21/23 [email protected] 26
MUNKAKÖR-FELTÉTEL
• CREATE VIEW data2 ASSELECT job FROM emp1 GROUP BY jobHAVING count(*)>1;
• Eredmény: azon munkakörök listája, ahol egynél többen dolgoznak
04/21/23 [email protected] 27
MEGOLDÁSUPDATE emp1 a SET sal=sal+&delta_sal
WHERE ((COMM=0) OR (COMM IS NULL))
AND empno IN (SELECT * FROM data1)
AND job IN (SELECT * FROM data2);
04/21/23 [email protected] 28
6.22
Írjon script-programot, amely minden részlegben növeli a két legalacsonyabb fizetésű dolgozó fizetését a részleg legnagyobb és legkisebb fizetése közti különbség 15%-ával
04/21/23 [email protected] 29
6.22
• Szükséges adatok– Részlegenként a legnagyobb és legkisebb
fizetés különbsége Nézettábla1– Részlegenként a két legalacsonyabb fizetésű
dolgozó (két legalacsonyabb fizetéssel rendelkező dolgozók???) Nézettábla2
• Nézettábla1 SETNézettábla2 WHERE
04/21/23 [email protected] 30
Nézettábla1
• CREATE OR REPLACE VIEW nezet1 AS SELECT
min(sal) as Minimum,max(sal) as Maximum,max(sal)-min(sal) as Delta,0.15*(max(sal)-min(sal)) as DeltaPct,deptno FROM emp GROUP BY deptno;
• select * from nezet1;
04/21/23 [email protected] 31
Nézettábla2• RowNum –ra gondolnánk, de ez túl
bonyolult (+ lassú, rossz…)
• Amikor lehet, kerülni ajánlott a használatát
• Túl mély allekérdezés-lánc, bár ez nézetekkel elkerülhető
• Alternatív megoldási módszer …
04/21/23 [email protected] 32
Nézettábla2
SELECT kulso.empno, (
SELECT count(*) FROM emp belsoWHERE
(belso.sal<kulso.sal) and (belso.deptno=kulso.deptno)
) AS KISEBB from emp kulso;
04/21/23 [email protected] 33
Nézettábla2
CREATE OR REPLACE VIEW nezet2 AS
SELECT empno FROM emp kulso
WHERE(SELECT count(*) FROM emp belsoWHERE
(belso.sal<kulso.sal) and (belso.deptno=kulso.deptno))<=1;
04/21/23 [email protected] 34
UPDATE
• UPDATE emp SETsal=sal+
(SELECT deltapct FROM nezet1WHERE deptno=emp.deptno)
WERE empno IN(select * from nezet2);
04/21/23 [email protected] 35
Nézettábla2 alternatíva (rownum)• Cél:
CREATE OR REPLACE VIEW nezet2 ASSELECT empno FROM reszlegsorrendWHERE rown2<=2;
• Sorrendnézet:CREATE OR REPLACE VIEW sorrend AS(SELECT rownum as rown, al.* FROM (select * from emp order by deptno,sal) al);
04/21/23 [email protected] 36
Nézettábla2 alternatíva (rownum)• Részlegen belüli sorrend:
CREATE OR REPLACE VIEW reszlegsorrend AS (
SELECT a.*,(1+a.rown-
(select min(rown) from sorrend b
where b.deptno=a.deptno)) AS rown2
FROM sorrend a);
04/21/23 [email protected] 37
Nézettábla2 alternatíva (rownum)
• CREATE OR REPLACE VIEW nezet2 ASSELECT empno FROM reszlegsorrendWHERE rown2<=2;
• UPDATE emp SETsal=sal+
(SELECT deltapct FROM nezet1WHERE deptno=emp.deptno)
WERE empno IN(select * from nezet2);
04/21/23 [email protected] 38
6.23
• Minden nem-president munkakörben megnöveli a két lekisebb fizetésű dolgozó fizetését a munkakör legkisebb és legnagyobb fizetése közti különbség 5%-ával
gyakorlatilag ugyanaz, mint az előző
04/21/23 [email protected] 39
ZH
• Március 24.
• Teljes SQL: SELECT + DDL + DML
• Tranzakció-kezelés, felső-N, nézetek(!)
• „Nézettábláért pluszpont adható”
04/21/23 [email protected] 40
TANÁCSOK
• "Ellenőrizze a műveletek végrehajtását"
• Formázottan: BTITLE, TTITLE, COLUMN, BREAK ON, Linesize, Pagesize
• String-egyezésnél UPPER/LOWER
• Tábla-összekapcsolás: ALAPISMERET
• 413_Labor\#01_SQL Bevezető Feladatgyűjtemény [25].pdf ! ! ! ! ! ! ! ! ! ! !