MapleStory Finger Point Cute Line Smiley Blinking Hello Kitty Angel MapleStory Finger Point

๐Ÿ’Ž DataBase/๐Ÿ“š ์˜ค๋ผํด SQL๊ณผ PL,SQ

หšโ‚Šโœฉโ€งโ‚Š DB Oracle ์ •๋ฆฌ 2ํƒ„ (์˜ค๋ผํด SQL๊ณผ PL/SQL Ch4) หšโ‚Šโœฉโ€งโ‚Š

HYEJU01 2021. 11. 5. 22:28

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (RDBMS)์˜ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์ธ  Join

 

์˜ˆ์‹œ) Aํ…Œ์ด๋ธ”์— a, b ์ปฌ๋Ÿผ์„ ๋Œ€์ƒ์œผ๋กœ SELECT๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋””์Šคํฌ์—์„œ๋Š”

Aํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. (๋น„ํšจ์œจ์ )

 

์ •๊ทœํ™” : ํ•˜๋‚˜๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ 

์ •๊ทœํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ํฉ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํ•ฉํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด Join ์ด๋ผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค!

 

JOIN (INNER JOIN / OUTER JOIN)



-----------------------
โ–ถOracel JOIN ๋ฌธ๋ฒ•

SELECT d.dept_nm, s.s_id, s.s_nm
FROM student s, dept d 
WHERE s.D_ID = d.D_ID ;
 /*WHERE student.D_ID = dept.D_ID */


-----------------------
โ–ถANSI JOIN ๋ฌธ๋ฒ• (์‚ฌ์šฉ)

SELECT d.dept_nm, s.s_id, s.s_nm
FROM student s
JOIN dept d ON s.D_ID = d.D_ID ;

-----------------------
EMP -> ENPNO, ENAME
DEPT -> DEPTNO, DNAME, LOC

SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DEPTNO,
D.DNAME, D.LOC
FROM EMP E
INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

-----------------------

INNER JOIN C ON A.d = C.d


-----------------------

SELECT
FORM Z
INNER JOIN Y ON Z.a = Y.a
AND Z.b = Y.b


โ–ถJOIN ์ถ”๊ฐ€ํ•˜๊ธฐ

SELECT
FORM Z
INNER JOIN Y ON Z.a = Y.a AND Z.b = Y.b
INNER JOIN X ON Z.d = X.d

 


โ–ถoracle ๋ฌธ๋ฒ•

SELECT
FORM Z,Y,Z
WHERE Z.a = Y.a AND Z.b = Y.b 
AND Z.d = X.d

 

(1) Cartesian Product  (์นดํ‹ฐ์…˜ ๊ณฑ)

Join ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์กฐ์ธ ์กฐ๊ฑด ์ง€์ • ๋ถ€๋ถ„.

 

์กฐ์ธ ์กฐ๊ฑด์ ˆ์„ ์ ์ง€ ์•Š์œผ๋ฉด ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๊ฒƒ์„ ์นดํ‹ฐ์…˜ ๊ณฑ์ด๋ผ๊ณ  ๋ถ€๋ฆ„

 

join์ฟผ๋ฆฌ ์ค‘์— WHERE์ ˆ์— ๊ธฐ์ˆ ํ•˜๋Š”  join ์กฐ๊ฑด์ด ์ž˜๋ชป ๊ธฐ์ˆ  ๋˜์—ˆ๊ฑฐ๋‚˜ ์•„์˜ˆ ์—†์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์ด๋‹ค.

 

์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

1 : ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜์—ฌ ์›๋ณธ ํ…Œ์ด๋ธ”์„ ๋ฐ˜๋ณตํ•ด์„œ ์ฝ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ

2 : ์‹ค์ˆ˜๋กœ ์กฐ์ธ ์กฐ๊ฑด ์ปฌ๋Ÿผ ์ค‘ ์ผ๋ถ€๋ฅผ ๋น ๋œจ๋ฆฌ๋Š” ๊ฒฝ์šฐ

 

-----------------------
/*์นดํ‹ฐ์…˜ ๋‚˜์˜ค๋Š” ๊ฑด ๋ง‰์•„์•ผํ•จ*/
-----------------------


EQUL Join (๋“ฑ๊ฐ€์กฐ์ธ)

 

์„ ํ–‰ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ ์กฐ์ธ ์กฐ๊ฑด์ ˆ์„ ๊ฒ€์‚ฌํ•ด์„œ ๋™์ผํ•œ ์กฐ๊ฑด์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํ›„ํ–‰ ํ…Œ์ด๋ธ”์—์„œ ๊บผ๋‚ด์˜ค๋Š” ๋ฐฉ๋ฒ•

 

์กฐ๊ฑด์ ˆ์— = ๋ฅผ ์‚ฌ์šฉํ•ด์„œ EQUL Join ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

"ํ…Œ์ด๋ธ”์ด๋ฆ„ . ์ปฌ๋Ÿผ์ด๋ฆ„" ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ ์„ ๋•Œ ์ปฌ๋Ÿผ์ด๋ฆ„์ด ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์—๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š”

ํ…Œ์ด๋ธ”์ด๋ฆ„์„ ์ƒ๋žตํ•ด๋„๋จ

 

๊ฒ€์ƒ‰์กฐ๊ฑด, Join์กฐ๊ฑด => ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ๋จผ์ € ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ฒ”์œ„๋ฅผ ์ค„์ธ ๋‹ค์Œ Join ์กฐ๊ฑด์„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

(๊ฒ€์ƒ‰์กฐ๊ฑด์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ž‘์—…์˜ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค !!)

 

 

โ–ถ๋“ฑ๊ฐ€์กฐ์ธ
์–‘์ชฝ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•ด์•ผ์•ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ด 
(INNER ์€ ์ตœ์†Œ(์ž‘๊ฒŒ) ๋งคํ•‘์‹œํ‚ด ์—ฌ๋Ÿฌ๊ฐœ ์กฐ๊ฑด๋„ ์ž‘์€ ์ชฝ ๋งคํ•‘์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค. )

SELECT S.NAME "STU_NAME", P.NAME "PRO_NAME" 
FROM STUDENT S, PROFESSOR P
WHERE S.PROFNO= P.PROFNO;


-----------------------

- ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ -> ์ 
- ๊ณ„ํš์„ค๋ช… F10 COST(๋น„์šฉ๊ธฐ๋ฐ˜) ๋‚ฎ์„ ์ˆ˜๋ก ์ข‹์Œ
-----------------------

 

SELECT s.name stu_name
, d.dname 
, p.name prof_name
FROM student s
INNER JOIN department d
ON s.deptno1 = d.deptno
INNER JOIN professor p
ON d.deptno = s.deptno1
AND p.profno = s.profno;

 

SELECT s.name stu_name
,p.name prof_name
FROM student s 
INNER JOIN professor p 
ON s.profno = p.profno --AND s.deptno = 101
WHERE s.deptno1 = 101;
/* AND ๊ฐ€ ๋” ํšจ์œจ์  101์ธ ์• ๋“ค๋งŒ (๋Œ€์ƒ๋งŒ) ์กฐ์ธ์„ ๊ฑด๋‹ค*/

 

Non-EQUL Join (๋น„๋“ฑ๊ฐ€์กฐ์ธ)

 

์กฐ๊ฑด์ด ๊ฐ™์ง€์•Š๊ณ  ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ๊ฒฝ์šฐ์˜ ์กฐ๊ฑด์„ ์กฐํšŒํ•ด์•ผํ•  ๊ฒฝ์šฐ

 

BETWEEN or ๋น„๊ต์—ฐ์‚ฐ์ž (์„ฑ๋Šฅ ๋” ์ข‹์Œ/ ๊ถŒ์žฅ)

 

 

์‚ฌ์šฉ์˜ˆ2>

=๋‹ค์–‘ํ•œ ์กฐ๊ฑด ์กฐํšŒ
=์กฐ๊ฑด ์‚ฌ์ด์— ๊ฑธ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ์ถœ๋ ฅ๋˜์ง€์•Š์Œ

SELECT C.*
FROM CUSTOMER C
INNER JOIN GIFT G 
	ON C.POINT BETWEEN G.G_START AND G.G_END;
    
    --
    
SELECT C.GNAME CUST_NAME, G.GNAME GIF_NAME, C.POINT, G.G_START, G.G_END
FROM CUSTOMER C
INNER JOIN GIFT G 
	ON C.POINT BETWEEN G.G_START AND G.G_END;

=๋น„๊ต ์—ฐ์‚ฐ์ž๊ฐ€ ์„ฑ๋Šฅ์— ์ข‹๋‹ค.

SELECT C.GNAME CUST_NAME, G.GNAME GIF_NAME, C.POINT, G.G_START, G.G_END
FROM CUSTOMER C
INNER JOIN GIFT G 
	ON C.POINT >= G.G_START 
    AND C.POINT <= G.G_END;

 

์‚ฌ์šฉ์˜ˆ2>

SELECT S.NAME, O.TOTAL, H.GRADE
FROM STUDENT
INNER JOIN SCORE O
  ON S.STUDNO = O.STUDNO 

INNER JOIN HAKJUM H --ํ•™์  ๊ธฐ์ค€ํ…Œ์ด๋ธ”
  ON O.TOTAL >= H.MIN_POINT 
    AND O.TOTAL <= H.MAX_POINT

 

 

OUTER Join(์•„์šฐํ„ฐ ์กฐ์ธ)

 

equi , non-equi ๋ชจ๋‘ ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค. (inner join)

ํ•œ์ชฝ ํ…Œ์ด๋ธ”์—” ์žˆ๊ณ  ๋‹ค๋ฅธ ํ•œ์ชฝ์—๋Š” ์—†๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ์ „๋ถ€ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ• (outer join)

 

DB์„ฑ๋Šฅ์— ์•„์ฃผ ๋‚˜์œ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ (์‹ ์ค‘ํžˆ ์‚ฌ์šฉ)

 

- ์ธ๋ฑ์Šค๋ฅผ ์“ฐ์ง€์•Š๊ณ  Full Scan์„ ํ•จ

- ํŠœ๋‹์—์„œ) ์กฐ์ธ์ˆœ์„œ๊ฐ€ ๊ณ ์ •๋˜์–ด ์‚ฌ์šฉ์ž ๋œป๋Œ€๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ

 

Oracle -> Where ์กฐ๊ฑด์ ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ชฝ์— (+) ํ‘œ์‹œํ•ด์ค€๋‹ค.

ANSI -> ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ชฝ์— (+)

LEFT OUTER -> = ๊ธฐํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์˜ค ํ‘œ์‹œ

 

Outer Join ํ•ฉ์ณ์„œ ์ถœ๋ ฅํ•˜๊ธฐ -> UNION ( UNION ALL) ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

 

์ฃผ์˜์‚ฌํ•ญ

1. Where ์ ˆ์˜ outer join ๋˜๋Š” ์ปฌ๋Ÿผ์— ์ „๋ถ€ join ์—ฐ์‚ฐ์ž(+) ๋ฅผ ๋ถ™์—ฌ์•ผํ•จ -> ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ์ผ๋ฐ˜ ์กฐ์ธ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋จ

2. Where ์ ˆ์˜ ์กฐ๊ฑด์„ ON์ ˆ๋กœ ์œ„์น˜์‹œํ‚ค๋Š” ๊ฒฝ์šฐ... !!

 

 

 

์‚ฌ์šฉ์˜ˆ1>

 

= ์ฐธ์กฐ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ 1) LEFT / RIGHT , 2) ์ฃผํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ

= ์–ด๋–ค ์ชฝ์ด ์ฃผํ…Œ์ด๋ธ”์ด ๋˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผํ•จ

SELECT S.NAME STD_NAME, P.NAME PROF_NAME
FROM STUDENT S
INNER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
-- 15๋ช…

SELECT S.NAME STD_NAME, P.NAME PROF_NAME
FROM STUDENT S 
LEFT OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
--20 (์ฃผ) s 1:1 ๋ฐฉ์‹

 

์‚ฌ์šฉ์˜ˆ2>

SELECT S.NAME STD_NAME, P.NAME PROF_NAME
FROM STUDENT S 
RIGHT OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
--22 (์ฃผ)

 

 

์‚ฌ์šฉ์˜ˆ3>

SELECT S.NAME STD_NAME, P.NAME PROF_NAME
FROM STUDENT S 
FULL OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
--27 FULL

 

์ฐธ๊ณ  2 >

= WHERE ์ ˆ ๋•Œ๋ฌธ์— OUTER ์กฐ์ธ ํšจ๊ณผ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. (ON ์œผ๋กœ ๋ฌถ์–ด์ค˜์•ผ๋จ.

SELECT E.EMPNO, E.ENAME, E.JOB, D.DNAME, D.LOC
FROM EMP E 
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE D.LOC = 'CHICAGO';

--
SELECT E.EMPNO, E.ENAME, E.JOB, D.DNAME, D.LOC
FROM EMP E 
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
AND D.LOC = 'CHICAGO'
WHERE E.JOB = 'CLERK'; --๋งŒ๋“ค๊ณ  -> WHERE ์ „์ฒด์˜์กฐ๊ฑด

--

SELECT E.EMPNO, E.ENAME, E.JOB, D.DNAME, D.LOC
FROM EMP E 
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
AND D.LOC = 'CHICAGO'
AND E.JOB = 'CLERK'; --ON ์•ˆ์— ๋“ค์–ด๊ฐ€๋ฉด JOIN ์•ˆ์˜ ์กฐ๊ฑด -> ์กฐ๊ฑด์— ๋งž์ง€์•Š์•„๋„ NULL์„ ๋งŒ๋“ฌ

 


SELF Join

 

์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์žˆ๋Š” ๊ฒฝ์šฐ

๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณ„๋ช… ๋‘ ๊ฐœ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•œ๋‹ค. (2๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ฌ)

 

 

 

SELF  => ์žฌ๊ท€

= ๋งˆ์ง€๋ง‰ MGR ์—†๋Š” KING ์€ ๋‚˜์˜ค์ง€์•Š๋Š”๋‹ค. 

 

SELECT E1.ENAME,E2.ENAME
FROM EMP E1
INNER JOIN EMP E2
ON E1.MGR = E2.EMPNO;

 

= OUTER JOIN ์„ ํ•˜๋ฉด KING ๋„ ๋‚˜์˜จ๋‹ค.

= ์ฃผํ…Œ์ด๋ธ”์ด E1 ์ด๋ฏ€๋กœ LEFT ๋กœ ํ•ด์ค€๋‹ค.

SELECT E1.ENAME,E2.ENAME
FROM EMP E1
LEFT OUTER JOIN EMP E2
ON E1.MGR = E2.EMPNO;