๐ ์ ์ฉํ ์ ๋ณด

๐กํผ๋๋ฐฑ Tip
SDLC (Software Development Life Cycle) - ์ํํธ์จ์ด๊ฐ๋ฐ์๋ช ์ฃผ๊ธฐ
[๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธก๋ฉด์์์ SDLC]
0. ํ๋น์ฑ ๊ฒํ
- ๊ธฐํ, ๊ณํ
- (์ฌ์ฉ์ ์๊ตฌ ์ฌํญ) ๋ถ์ (What) โ ERD ๋์ถ
- ์ค๊ณ (How) [40%]
- ๊ฐ๋ฐ [20%]
- ํ ์คํธ [40%]
- ์ดํ (Realease, Deploy)
- ์ด์ ๋ฐ ์ ์ง๋ณด์
โ ์ถํ ๋ชจ๋ธ๋ง ํ ERD๋ฅผ A3์ฉ์ง์ ๊ทธ๋ฆฌ๋ ๊ฒ์ด ์ํ
๐ Join
์ฌ๋ฌ ํ ์ด๋ธ์ ํฉ์ด์ ธ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฌ์(Join ํด์) ๋ณด๋ ๊ฒ
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ๊ฐ ๋ฌผ๋ฆฌ์ ์ฐ๊ฒฐ ์์ด ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌ ํ๋ค๊ฐ ๋ฐ์ดํฐ ๊ฐ ์ฐ๊ฒฐ์ด ํ์ํ ๋ ๋ด์ฉ์ ์ํ ์ฐธ์กฐ(Content Reference)๋ฅผ ํ๋ค. ์ค์๊ฐ์ผ๋ก ํ ์ด๋ธ ๊ฐ ๊ด๊ณ ํตํด ์ํ์ ๊ฒฐํฉ ๊ฒ์ด JOIN.
- JOIN์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์์ ์ผ๋ก ํ์ํ ๊ฐ์ฅ ์ค์ํ ์ฐ์ฐ ์ค ํ๋.
ํ์์ฑ
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ
์ด๋ธ ๋
๋ฆฝ์ฑ, ๋ฐ์ดํฐ์ ์ต์ ์ค๋ณต์ฑ, ๋ฐ์ดํฐ๊ฐ์ ํจ์์ ์ข
์์ฑ์ ํตํด ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ์ ํ
์ด๋ธ๋ก ๋๋์ด(๋ถํ ) ์ ์ฅํ๋๋ก ์ค๊ณ.
- * ์ต์ ์ค๋ณต์ฑ : ๋ชจ๋ธ๋ง์ ์ค์!
- ์กฐํ๋ฅผ ์ํ๋ ๋ฐ์ดํฐ๊ฐ ํ๋์ ํ ์ด๋ธ์ ์ ์ฅ๋์ด ์๋ ๊ฒฝ์ฐ SELECT๋ฅผ ํตํด ์กฐํ ํ์ง๋ง, ์กฐํ๋ฅผ ์ํ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ํ ์ด๋ธ์ ๋๋์ด ์ ์ฅ๋์ด ์๋ ๊ฒฝ์ฐ๋ JOIN ์ฐ์ฐ์ผ๋ก ๋ฐ์ดํฐ ์กฐํ ํ๋ค.
- ์ฌ๋ฒ,์ด๋ฆ,๊ธ์ฌ,๋ถ์๋ฒํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ โ SELECT EMPNO,ENAME,SAL,DEPTNO FROM EMP;
- ๋ถ์๋ฒํธ,๋ถ์๋ช ,๋ถ์์์น๊ฐ ํ์ํ ๊ฒฝ์ฐ โ SELECT DEPTNO,DNAME,LOC FROM DEPT;
- ๋ถ์๋ช ,์ด๋ฆ,๊ธ์ฌ ์ ๋ณด๊ฐ ํ์ํ ๊ฒฝ์ฐ โ SELECT DNAME, ENAME, SAL FROM DEPT , EMP WHERE DEPT.DEPTNO = EMP.DEPTNO ;
Join ์ข ๋ฅ

Equi-join

- JOIN์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ์ปฌ๋ผ๊ฐ์ ์ ํ์ด ์ผ์น(EQUAL)ํ๋ ๋ฐ์ดํฐ๋ฅผ RETURN
- EQUAL( = ) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ JOIN
- 1~4 Oracle Join ๊ตฌ๋ฌธ, 5~6 ANSI/ISO-SQL
โ
SELECT DNAME,ENAME,JOB,SAL FROM EMP, DEPT WHERE DEPTNO = DEPTNO;
โ ORA-00918: ์ด์ ์ ์๊ฐ ์ ๋งคํฉ๋๋ค.. ์ด์ ๋ ?

โก
SELECT DNAME,ENAME,JOB,SAL FROM SCOTT.EMP, SCOTT.DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
- OBJECT Full name ํ๊ธฐ๋ฒ : [SCHEMA.]OBJECT_NAME EX) EMP โ SCOTT.EMP
- COLUMN Full name ํ๊ธฐ๋ฒ : [TABLE_NAME.]COLUMN_NAME EX) EMPNO โ EMP.EMPNO
โข
SELECT DNAME,ENAME,JOB,SAL FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.JOB IN ('MANAGER','CLERK')
ORDER BY DNAME;

- ์กฐ๊ฑด์ ์ฒ๋ฆฌ ์์??
- (a) JOIN ์ฒ๋ฆฌ (EMP.DEPTNO = DEPT.DEPTNO)
- โ ํํฐ๋ง (EMP.JOB IN ('MANAGER','CLERK'))
- (b) ํํฐ๋ง โ JOIN ์ฒ๋ฆฌ
- (a) JOIN ์ฒ๋ฆฌ (EMP.DEPTNO = DEPT.DEPTNO)
ํํฐ๋ง
์ดํ Join
์ฒ๋ฆฌ๋ฅผ ํ๋ค.
โ ์ ์ฒด ์ผ๋์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ์ตํฐ๋ง์ด์ ๊ฐ ํํฐ๋ง์ ๋จผ์ ์ฒ๋ฆฌํ๊ณ Join์ ๊ฐ์ฅ ํ ์์๋ก ์ฒ๋ฆฌ ํ๋ค.
โฃ
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;

- TABLE ALIAS์ ์ฌ์ฉ
- (a) ํธ์์ฑ
- (b) ๊ฐ๋
์ฑ(์๋ฏธ์๋ ์ด๋ฆ์ฌ์ฉ)
- EX) EMP E , EMP A
- (c) Self Join์ ํ์ ์ฌ์ฉ
- (d) ๋์ผ ์ปฌ๋ผ ๋ช ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ
โค // ANSI-SQL , ON ์กฐ์ธ์กฐ๊ฑด
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

โฅ
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO -- ์กฐ์ธ ์กฐ๊ฑด
WHERE E.DEPTNO IN (10,20) AND D.DNAME = 'RESEARCH' -- ํํฐ๋ง ์กฐ๊ฑด

Non Equi-Join (EQUAL =
์ด์ธ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ JOIN)
- EQUAL( = ) ์ด์ธ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ JOIN
โ
SELECT E.ENAME, E.JOB,E.SAL,S.GRADE FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL; -- ๋ฒ์ ์ฐ์ฐ์

โก
SELECT DNAME,ENAME,JOB,SAL,GRADE
FROM EMP E, DEPT D, SALGRADE S // Join ์์๋ ๋๊ฐ ๊ฒฐ์ ? , ๊ธฐ์ ์์? KMA
WHERE E.DEPTNO = D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL;

- 3๊ฐ ํ ์ด๋ธ JOIN , ์ต์ JOIN์กฐ๊ฑด: N(ํ ์ด๋ธ๊ฐ์) โ 1
โข
SELECT E.ENAME, E.JOB,E.SAL,E.GRADE FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL AND E.DEPTNO IN (10,30);
ORDER BY E.ENAME;
- ์กฐ๊ฑด์ ์ฒ๋ฆฌ ์์???
- (b) ํํฐ ์กฐ๊ฑด โ JOIN ์กฐ๊ฑด
โฃ
SELECT E.ENAME, E.JOB,E.SAL,S.GRADE FROM EMP E, SALGRADE S
WHERE E.SAL < S.LOSAL AND E.DEPTNO IN (10,30)
ORDER BY E.ENAME;

- ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ์๋ ๋ฌด์๋ฏธ(๋ถํ์)ํ ๋ค๋์ ๊ณฑ์งํฉ(Cartesian product) ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ด์ ๋?
โ ์๋ชป๋ Join ์กฐ๊ฑด์ ์ฌ์ฉ
- ๋ฆฌํด๋ ๊ฐ์ ๋ดค์ ๋ ๊ฒฐ๊ณผ ์งํฉ์ด Cartesian Product์ ํํ๋ก ๋์์ ๋ ์กฐ์ธ ์กฐ๊ฑด์ ๋ค์ํ๋ฒ ํ์ธํด๋ณด๊ธฐ!
Outer-Join
- JOIN ์กฐ๊ฑด์ ์ง์ ๋ง์กฑ๋์ง ์๋ ์ ๋ณด๋ ์กฐํ ( != Inner Join )
โ
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY D.DNAME;

- 40๋ฒ ๋ถ์(OPERATIONS)์ ๊ทผ๋ฌดํ๋ ์ง์์ด ์๊ธฐ ๋๋ฌธ์ Equi Join์์๋ 40๋ฒ ๋ถ์๊ด๋ จ ์ ๋ณด ์กฐํ๊ฐ ์๋๋ค. 14๊ฑด
โก
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL
FROM EMP E,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
ORDER BY D.DNAME;

- ๊ธฐ์ค์ด๋๋ ํ ์ด๋ธ(DEPT)๊ณผ ์กฐ์ธ๋๋ ๋์ ํ ์ด๋ธ(EMP)์ ์กฐ์ธ ์กฐ๊ฑด์ (+) ํ์ ,์ง์ ๋งคํ๋์ง ์๋ ์ปฌ๋ผ์๋ NULL , 15๊ฑด (OPERATIONS ?)
โข
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO(+)
ORDER BY D.DNAME;

- Equi-Join๊ณผ ๋์ผํ ๊ฒฐ๊ณผ ์ถ๋ ฅ, ๋ถํ์ํ ์์ํฐ ์กฐ์ธ์ ๋นํจ์จ์ ์ธ ์์ ์ฌ์ฉ ์ ๋ฐ ๊ฐ๋ฅ
โฃ
SELECT D.DNAME, NVL(E.ENAME,'๋น์๊ทผ ๋ถ์'), E.JOB, E.SAL
FROM EMP E,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
ORDER BY D.DNAME;

- ์ง์ ๋งคํ๋์ง ์๋ ์ปฌ๋ผ์๋ NULL
โค
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL
FROM EMP E,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO(+)
ORDER BY D.DNAME;
- ORACLE SQL์ ์๋ฐฉํฅ OUTER JOIN์ ํ์ฉํ์ง ์๋๋ค.
- ANSI-SQL 1999 ์์๋ ์๋ฐฉํฅ OUTER JOIN์ ํ์ฉ
Ansi Outer-Join
SELECT E.DEPTNO,D.DNAME,E.ENAME FROM EMP E LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
ORDER BY E.DEPTNO;

โก RIGHT OUTER JOIN : ์ฐ์ธก ํ ์ด๋ธ ๊ธฐ์ค
SELECT D.DNAME,E.ENAME FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
ORDER BY E.DEPTNO;

- DEPT์ ๊ธฐ์ค ํ ์ด๋ธ(Driving Table)ํ์ฌ Join ์ฐ์ฐ ์ํ , 40๋ฒ ๋ถ์์ ์ ๋ณด ํ๊ธฐ !!!!
โข FULL OUTER JOIN
SELECT D.DNAME,E.ENAME FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
ORDER BY E.DEPTNO;

- ์๋ฐฉํฅ ์์ํฐ ์กฐ์ธ(Full Outer Join) ์คํ
[์ค์ต ์ดํด] - SELECT LIST ๋ฅผ *๋ก ๋๊ณ ๋น๊ตํด๋ณด๊ธฐ.
Self-Join
SELECT E.ENAME||' ''S MANAGER IS '||M.ENAME
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO
ORDER BY M.ENAME;

- ๊ฐ์ ํ ์ด๋ธ ๋ผ๋ฆฌ ์กฐ์ธ
- ํ
์ด๋ธ ๊ฐ์ฒด๋ด ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ๊ด๊ณ์ ex)
empno
vsmgr
- ํ ์ด๋ธ Alias ํ์ ์ฌ์ฉ
==============================================
- ์์ โ SQL์์๋ ํ์ฌ ๋ํ( job=โPRESIDENT') ์ ๋ณด๊ฐ ๋๋ฝ ๋์๋ค.
โ ๋ํ๋ manager๊ฐ ์๊ธฐ ๋๋ฌธ.
- SQL์ ์์ ํ์ฌ ๋๋ฝ๋ ์ ๋ณด๊ฐ ์กฐํ ๋๋๋ก ์์ฑ : OUTER JOIN ์ฌ์ฉ!
- ๋งค๋์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋งค๋์ ์ ์ด๋ฆ์ NOBODY๋ก ํ๊ธฐ
SELECT E.ENAME||' ''S MANAGER IS '||NVL(M.ENAME, 'NOBODY')
FROM EMP E LEFT OUTER JOIN EMP M
ON E.MGR = M.EMPNO
ORDER BY M.ENAME;
- ๊ธฐ์กด KING๊ณผ OCPOK์ ์๋์ ๊ฐ์ด MGR ๋ฒํธ๊ฐ null์ด๋ค


๋ฐ๋ผ์, Self-join
์ Equi Join
ํ์ ๋์๋ JOIN ์กฐ๊ฑด์ ์ํด MGR
์ด ์๋ KING๊ณผ OCPOK์ ๋๋ฝ๋์์๋ค.
์ด๋ฅผ Employ ๊ด์ ์์์ ํ
์ด๋ธ์ LEFT JOIN
ํจ์ผ๋ก์จ ๋๋ฝ๋์๋ ๋ ์ฝ๋๋ฅผ ํฌํจ์์ผ JOIN
ํ๊ณ , NVL()
ํจ์๋ฅผ ํตํด null
์ฒ๋ฆฌ๋ฅผ ํ๋ค.

์นดํ ์์ ๊ณฑ (Cartesian Product)
Join์ ๋ด๋ถ ์ฃผ์ ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ
- Nested Loop
- Sort-Merge
- Hash
- Join์ ๋ ํ
์ด๋ธ(์งํฉ)๊ฐ์ ๊ณฑ์งํฉ ์ฐ์ฐ์ผ๋ก ์ ์ฉํ์ง ์์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ํ์
- ๋ฐ์นด๋ฅดํธ์ ๊ณฑ์งํฉ
- ๋ฐ์์์ธ (a) Join ์กฐ๊ฑด ์๋ต์ (b) ์๋ชป๋ JOIN ์กฐ๊ฑด
- ์ฉ๋ (a) ํ ์คํธ์ฉ ์ํ๋ฐ์ดํ ์์ฑ (b) ๊ณฑ์งํฉ ๊ธฐ๋ฅ์ ์ด์ฉํ ๋น ๋ฅธ ์ฐ์ฐ ์์ฉ
โ CROSS JOIN (ANSI/ISO-SQL)
SELECT ENAME,JOB,DNAME FROM EMP, DEPT;
SELECT ENAME,JOB,DNAME FROM EMP CROSS JOIN DEPT; -- Ansi-SQL

- Join ์กฐ๊ฑด ์๋ต์ ๋ฐ์ , ๋ฐ์ดํฐ ๊ฑด์ ์ฒดํฌ
โ Cartesian Product ๋ฐ์!
โก Join ์กฐ๊ฑด ์์ด Join
SELECT ENAME,JOB,DNAME FROM EMP, DEPT
WHERE EMP.SAL > 2000 and DEPT.DEPTNO IN (10,20);

- ํํฐ๋ง ์กฐ๊ฑด(O) , Join ์กฐ๊ฑด(X) , and ์ ๋ฐ์ดํฐ ๊ฑด์ ์ฒดํฌ
โข Join ์กฐ๊ฑด ์์ด Join
SELECT ENAME,JOB,DNAME FROM EMP , DEPT
WHERE EMP.SAL > 2000 or DEPT.DEPTNO IN (10,20);

- ํํฐ๋ง ์กฐ๊ฑด(O) , Join ์กฐ๊ฑด(X) , or ์ ๋ฐ์ดํฐ ๊ฑด์ ์ฒดํฌ
โฃ
SELECT E.ENAME, E.JOB,E.SAL,S.GRADE FROM EMP E, SALGRADE S
WHERE E.SAL < S.LOSAL AND E.DEPTNO IN (10,30)
ORDER BY E.ENAME;

- ์๋ชป๋ Join ์กฐ๊ฑด
๐๊ณผ์
- ์์ โ SQL์์๋ ํ์ฌ ๋ํ( job=โPRESIDENT') ์ ๋ณด๊ฐ ๋๋ฝ ๋์๋ค.
โ ๋ํ๋ manager๊ฐ ์๊ธฐ ๋๋ฌธ.
- SQL์ ์์ ํ์ฌ ๋๋ฝ๋ ์ ๋ณด๊ฐ ์กฐํ ๋๋๋ก ์์ฑ : OUTER JOIN ์ฌ์ฉ!
- ๋งค๋์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋งค๋์ ์ ์ด๋ฆ์ NOBODY๋ก ํ๊ธฐ
SELECT E.ENAME||' ''S MANAGER IS '||NVL(M.ENAME, 'NOBODY')
FROM EMP E LEFT OUTER JOIN EMP M
ON E.MGR = M.EMPNO
ORDER BY M.ENAME;
- ๊ธฐ์กด KING๊ณผ OCPOK์ ์๋์ ๊ฐ์ด MGR ๋ฒํธ๊ฐ null์ด๋ค


๋ฐ๋ผ์, Self-join
์ Equi Join
ํ์ ๋์๋ JOIN ์กฐ๊ฑด์ ์ํด MGR
์ด ์๋ KING๊ณผ OCPOK์ ๋๋ฝ๋์์๋ค.
์ด๋ฅผ Employ ๊ด์ ์์์ ํ
์ด๋ธ์ LEFT JOIN
ํจ์ผ๋ก์จ ๋๋ฝ๋์๋ ๋ ์ฝ๋๋ฅผ ํฌํจ์์ผ JOIN
ํ๊ณ , NVL()
ํจ์๋ฅผ ํตํด null
์ฒ๋ฆฌ๋ฅผ ํ๋ค.

1. ์๋์ 3 SQL์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ ํ ์ค๋ช ํ์์ค
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO ORDER BY D.DNAME;
-- DEPT (์ค๋ฅธ์ชฝ)์ ๊ธฐ์ค์ผ๋ก Outer ์กฐ์ธ
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO AND E.SAL > 2000 ORDER BY D.DNAME; -- Outer Join ํ ํํฐ๋ง
-- DEPT (์ค๋ฅธ์ชฝ)์ ๊ธฐ์ค์ผ๋ก Oute ์กฐ์ธ ์ดํ, SAL์ด 2000์ด ๋๋ ๊ฒ์ ํํฐ๋ง
SELECT D.DNAME,E.ENAME,E.JOB,E.SAL FROM EMP E,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO AND E.SAL(+) > 2000 ORDER BY D.DNAME; -- Outer Join
-- Outer Join์ ๊ธฐ์ค์ด ๋๋ ํ
์ด๋ธ์๋ Join์กฐ๊ฑด์ด ๋งค์นญ๋์ง ์๋๋ผ๋ null์ ํฌํจํด ์กฐ์ธํ๋ค.
-- E.SAL(+)์๋ Outer Join์ด ์ ์ฉ๋ผ์, DEPT๋ฅผ ๊ธฐ์ค์ผ๋ก SAL ๊ฐ์ด 2000์ด ๋์ง ์๋๋ผ๋ ํฌํจ๋์๋ค.
2. ์๋ SQL์ ์คํ๊ฒฐ๊ณผ ์กฐํ๋๋ Row ๊ฐ์๋ฅผ ์ค๋ช
-- 2-1
SELECT E.ENAME||' ''S MANAGER IS '||M.ENAME FROM EMP E, EMP M
WHERE E.MGR(+) = M.EMPNO
ORDER BY M.ENAME;
-- 2-2
SELECT E.ENAME||' ''S MANAGER IS '||M.ENAME FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO(+)
ORDER BY M.ENAME;
3. JOIN์ ์ฌ์ฉํ์ฌ ๋ถ์๋ณ ๊ธ์ฌ ์ง๊ธ ์์ ๊ณ์ฐ

-- rank
select E.deptno, e.ename, e.job, e.sal,
(select count(*) + 1
from emp e2
where e2.deptno = e.deptno and e2.sal > e.sal) as ๊ธ์ฌ์์
from emp e
order by E.deptno, e.sal desc;
--------------------------------------------------------------------
-- dense rank
select E.deptno, e.ename, e.job, e.sal,
(select count(distinct e2.sal) + 1
from emp e2
where e2.deptno = e.deptno and e2.sal > e.sal) as ๊ธ์ฌ์์
from emp e
order by E.deptno, e.sal desc;
3-2. RANK, DENSE_RANK ํจ์๋ฅผ ์ฌ์ฉํ์ฌ 2)์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ SQL ์์ฑ
- ๊ฐ ํจ์์ ๋ํ ์ค๋ช ์ถ๊ฐ
๋์ผํ ๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ๋ค ์ค์์ ์์๋ฅผ ๊ณ์ฐํ๋, ์ค๊ฐ์ ๋น ์ง ์์๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, 1, 2, 2, 4, 5๊ฐ ์์ ๋ RANK ํจ์๋ฅผ ์ ์ฉํ๋ฉด 1, 2, 2, 4, 5๊ฐ ๋ฉ๋๋ค.
[DENSE_RANK]
RANK ํจ์์ ๋น์ทํ์ง๋ง, ์ค๊ฐ์ ๋น ์ง ์์๋ฅผ ์ฑ์ฐ๊ณ ๊ณ์ ์์ฐจ์ ์ผ๋ก ์์๋ฅผ ๋งค๊น๋๋ค. ์๋ฅผ ๋ค์ด, 1, 2, 2, 4, 5๊ฐ ์์ ๋ DENSE_RANK ํจ์๋ฅผ ์ ์ฉํ๋ฉด 1, 2, 2, 3, 4๊ฐ ๋ฉ๋๋ค.
SELECT DEPTNO, ENAME, JOB, SAL,
RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS dense_rank
FROM EMP
ORDER BY DEPTNO;

4. MAKE_ENV.SQL์ ์ฌ์ฉํ์ฌ ์ค์ต ํ๊ฒฝ์ ๊ตฌ์ฑํ ํ ์๋์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ JOIN ๊ตฌ๋ฌธ ์์ฑ

SYSTE | SYSTEM_NAME | FTP | TELNET | |
---|---|---|---|---|
XXX | ํํDB | ์ฌ์ฉ | ๋ฏธ์ฌ์ฉ | ๋ฏธ์ฌ์ฉ |
YYY | ๊ฐ๋จDB | ์ฌ์ฉ | ์ฌ์ฉ | ์ฌ์ฉ |
ZZZ | ์๋ฑํฌDB | ๋ฏธ์ฌ์ฉ | ๋ฏธ์ฌ์ฉ | ๋ฏธ์ฌ์ฉ |
sql ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ง๋ค์ด์ ๋ณ๋๋ก ํด๋น ํ์ผ์ ์คํ. ๊ณผ์ ํ๊ธฐ
1) ํฐ๋ฏธ๋์์ @ or start ๋ช ๋ น์ด ์ฌ์ฉํด์ sql script ํ์ผ ์คํ
2) sqldev์์ sqlscript ํ์ผ ์คํ (๋ฉ๋ด์์ ์ฐพ์์ ์คํ)
Drop Table SYSTEM;
Create Table SYSTEM()
์ด๋ฐ์์ผ๋ก ํ ์ด๋ธ ๋ง๋ค๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ญ์ ๋ฅผ ํด์ ์ฌ๋ฌ๋ฒ ์คํํ ์ ์๋๋ก ์คํฌ๋ฆฝํธ ์์ ํ๋ค.
SELECT S.SYSTEM_ID, S.SYSTEM_NAME,
DECODE(SUM(DECODE(R.RESOURCE_NAME, 'FTP', 1, 0)), 1, '์ฌ์ฉ', '๋ฏธ์ฌ์ฉ') AS FTP,
DECODE(SUM(DECODE(R.RESOURCE_NAME, 'TELNET', 1, 0)), 1, '์ฌ์ฉ', '๋ฏธ์ฌ์ฉ') AS TELNET,
DECODE(SUM(DECODE(R.RESOURCE_NAME, 'EMAIL', 1, 0)), 1, '์ฌ์ฉ', '๋ฏธ์ฌ์ฉ') AS EMAIL
FROM SYSTEM S LEFT OUTER JOIN RESOURCE_USAGE R
ON S.SYSTEM_ID = R.SYSTEM_ID
GROUP BY S.SYSTEM_ID, SYSTEM_NAME
ORDER BY S.SYSTEM_ID;
5. ๋ถ์๋ฒํธ, ์ด๋ฆ, ๊ธ์ฌ, ๊ธ์ฌ๋น์จ(์์์ ์ดํ 2์๋ฆฌ) ์ถ๋ ฅํ๋ SQL์ ์นดํฐ์ ๊ณฑ์ ์์ฉํ์ฌ ์์ฑ

SELECT DEPTNO, ENAME, SAL, ROUND((SAL/SUM_SAL)*100, 2) || '%'
FROM EMP E1, (
SELECT SUM(SAL) AS SUM_SAL FROM EMP
) E2;
6. ๋ค์์ ์งํฉ ์ฐ์ฐ์๋ฅผ ์คํํ ํ ์ค๋ช ํ์์ค
select deptno from dept -- 10,20,30,40
union all
select deptno from emp; -- 10,20,30
select deptno from dept
union
select deptno from emp; -- ์ ๋ ฌ๋๋ ์ด์ ? ์คํ๊ณํ SORT(UNIQUE)
select ename,job,sal from emp where job = 'CLERKโ -- ์ง๋ฌด๊ฐ CLERK์ธ ์งํฉ
union -- ์ปฌ๋ผ ๊ฐ์ & ๋ฐ์ดํฐ ํ์
์ผ์น
select ename,job,sal from emp where sal > 2000 -- 2000 ์ด์ ๊ธ์ฌ ๋์์ ์งํฉ
order by job asc,sal desc; -- order by ๋์ ์งํฉ์? ์์น๋?
- ๋์ ์งํฉ์ UNION ์๋ฃ ํ ๊ฒฐ๊ณผ ์งํฉ.
โก ๊ต์งํฉ
select deptno from dept
intersect
select deptno from emp; -- ์ ๋ ฌ๋๋ ์ด์ ? ์คํ๊ณํ SORT(UNIQUE)
โข ์ฐจ์งํฉ
select deptno from dept
minus
select deptno from emp; -- ์ ๋ ฌ๋๋ ์ด์ ? ์คํ๊ณํ SORT(UNIQUE)
- Union all์ ์ ์ธํ Union, intersect, minus๋ ์ ๋ ฌ์ด ๋์ด ์ถ๋ ฅ๋๋ค. ๊ทธ ์ด์ ํ์ธ

- ์ตํฐ๋ง์ด์ ๊ฐ ์ต์ ์ ์งํฉ ์ฐ์ฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ ๋ ฌ์ ํ๋ค. (SORT, UNIQUE)
Uploaded by N2T