ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/DataBase

[SQL] ์กฐ์ธ join

NaNaRin๐Ÿ™ƒ 2021. 3. 8. 17:02

SELECT ๋ฌธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ์ด์•ผ๊ธฐํ–ˆ๋‹ค.

๊ทธ ์ค‘ ์„ธ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ ์กฐ์ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

 

1. ์กฐ์ธ join

- ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์ถœ๋ ฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

- ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์„ธ๋กœ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ด๊ณ , ์กฐ์ธ์„ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋กœ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒƒ

- ์กฐ์ธ ์กฐ๊ฑด์„ ์ œ๋Œ€๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ์นด๋ฅดํŠธ ๊ณฑ ๋•Œ๋ฌธ์— ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ชจ๋‘ ์กฐํ•ฉ๋˜์–ด ์ถœ๋ ฅ๋œ๋‹ค

- ๋ฐ์นด๋ฅดํŠธ ๊ณฑ ํ˜„์ƒ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฑด์‹์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋Š” ์กฐ์ธ ํ…Œ์ด๋ธ” ๊ฐœ์ˆ˜ - 1 ๊ฐœ ์ด๋‹ค

  ex) A, B, C ์„ธ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด A์™€ B ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด ์ค„ ์นผ๋Ÿผ ํ•˜๋‚˜, A์™€ B๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์—์„œ C ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด ์ค„ ์นผ๋Ÿผ ํ•˜๋‚˜ ์ด ๋‘๊ฐœ์˜ ์กฐ๊ฑด์ด ํ•„์š”

- ์กฐ์ธ ์กฐ๊ฑด ๋ฐ์ดํ„ฐ ์ค‘ ์–ด๋Š ํ•œ์ชฝ์ธ null์ด๋ฉด ๊ฒฐ๊ณผ์— ํฌํ•จ๋˜์ง€ ์•Š์Œ

-- 1. FROM ์ ˆ์— ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ” ์„ ์–ธํ•˜๊ธฐ
SELECT		*
FROM		EMP, DEPT
ORDER BY	EMPNO;

-- 2. ์นผ๋Ÿผ ์ด๋ฆ„์„ ๋น„๊ตํ•˜๋Š” ์กฐ๊ฑด์‹์œผ๋กœ ์กฐ์ธํ•˜๊ธฐ
SELECT		*
FROM		EMP, DEPT
WHERE		EMP.DEPTNO = DEPT.DEPTNO
ORDER BY	EMPNO;

-- 3. ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋ณ„์นญ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ
FROM ํ…Œ์ด๋ธ”์ด๋ฆ„1 ๋ณ„์นญ1, ํ…Œ์ด๋ธ”์ด๋ฆ„2 ๋ณ„์นญ2 …

SELECT		*
FROM		EMP E, DEPT D
WHERE		E.DEPTNO = D.DEPTNO
ORDER BY	EMPNO;

  (1) EMP์™€ DEPT ๋‘ ํ…Œ์ด๋ธ”์„ FROM ์ ˆ์— ํ•จ๊ป˜ ๋ช…์‹œํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ฉด ๊ฐ ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•˜๋Š” ํ–‰์ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ์กฐํ•ฉ๋˜์–ด ์ถœ๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— (EMP ํ–‰ ๊ฐœ์ˆ˜) X (DEPT ํ–‰ ๊ฐœ์ˆ˜) ๊ฐœ์˜ ํ–‰์ด ์ถœ๋ ฅ๋œ๋‹ค

  (2) EMP.DEPTNO = DEPT.DEPTNO ์กฐ๊ฑด์œผ๋กœ ๊ฐ ํ…Œ์ด๋ธ”์˜ DEPTNO๊ฐ€ ๊ฐ™์€ ํ–‰๋งŒ ์ถœ๋ ฅ๋œ๋‹ค (ํŠน์ • ์นผ๋Ÿผ ๊ฐ’์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅ) 

  (3) FROM ์ ˆ์— ์ง€์ •ํ•œ ํ…Œ์ด๋ธ”์—๋Š” SELECT ์ ˆ์˜ ์นผ๋Ÿผ์— ์‚ฌ์šฉํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณ„์นญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ„์นญ์€ ์ถœ๋ ฅ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค

 

2. ๋“ฑ๊ฐ€ ์กฐ์ธ equi join

= ๋‹จ์ˆœ ์กฐ์ธ simple join

- ๋‚ด๋ถ€ ์กฐ์ธ inner join ์— ํฌํ•จ๋œ๋‹ค

- ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•œ ํ›„ ์ถœ๋ ฅ ํ–‰์„ ๊ฐ ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์นผ๋Ÿผ์— ์ผ์น˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ ์ •ํ•˜๋Š” ๋ฐฉ์‹

- ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์กฐ์ธ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฆ„์„ ํŠน๋ณ„ํžˆ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด '์กฐ์ธ์„ ์‚ฌ์šฉํ•œ๋‹ค'๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ๋“ฑ๊ฐ€ ์กฐ์ธ

- ์กฐ์ธ์„ ์„ค๋ช…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ๊ฐ€ ๋“ฑ๊ฐ€ ์กฐ์ธ

-- 1. ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๋ถ€์„œ ๋ฒˆํ˜ธ๊ฐ€ ๋˜‘๊ฐ™์€ ์นผ๋Ÿผ ์ด๋ฆ„์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์„ ๋•Œ
SELECT		EMPNO, ENAME, DEPTNO, DNAME, LOC
FROM		EMP E, DEPT D
WHERE		E.DEPTNO = D.DEPTNO;

-- 2. ์นผ๋Ÿผ ์ด๋ฆ„์— ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ” ์ด๋ฆ„๋„ ํ•จ๊ป˜ ๋ช…์‹œํ•  ๋•Œ
SELECT		E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
FROM		EMP E, DEPT D
WHERE		E.DEPTNO = D.DEPTNO
ORDER BY	D.DEPTNO, E.EMPNO;

  (1) EMP ํ…Œ์ด๋ธ”๊ณผ DEPT ํ…Œ์ด๋ธ”์— ๊ฐ๊ฐ DEPTNO ์นผ๋Ÿผ์ด ์กด์žฌํ•  ๋•Œ SELECT ์ ˆ์— DEPTNO ์นผ๋Ÿผ์„ ํ…Œ์ด๋ธ” ๊ตฌ๋ถ„ ์—†์ด ๋ช…์‹œํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์‹คํ–‰๋˜์ง€ ๋ชปํ•œ๋‹ค

  (2) SELECT ๋ฌธ์— ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ฐ๊ฐ ๋ช…์‹œํ•ด ์ฃผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค

 

3. ๋น„๋“ฑ๊ฐ€ ์กฐ์ธ non-equi join

- ๋“ฑ๊ฐ€ ์กฐ์ธ ์™ธ์˜ ๋ฐฉ์‹์„ ์˜๋ฏธ

- ๋‚ด๋ถ€ ์กฐ์ธ inner join ์— ํฌํ•จ๋œ๋‹ค

SELECT	*
FROM 	EMP E, SALGRADE S
WHERE	E.SAL BETWEEN S.LOSAL AND S.HISAL;

  (1) EMP ํ…Œ์ด๋ธ”์˜ SAL ์นผ๋Ÿผ์˜ ๊ฐ’์ด SALGRADE ํ…Œ์ด๋ธ”์˜ LOSAL ์นผ๋Ÿผ๊ณผ HISAL ์นผ๋Ÿผ ์‚ฌ์ด์˜ ๊ฐ’์ผ ๋•Œ๋งŒ ์ถœ๋ ฅ

 

4. ์ž์ฒด ์กฐ์ธ self join

- ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ํ™œ์šฉํ•˜์—ฌ ์กฐ์ธํ•˜๋Š” ๋ฐฉ์‹

- FROM ์ ˆ์— ๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ช…์‹œํ•˜๋˜ ํ…Œ์ด๋ธ”์˜ ๋ณ„์นญ๋งŒ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ

- ๋‘ ๊ฐœ ํ…Œ์ด๋ธ”์—์„œ ์ง€์ •ํ•œ ์นผ๋Ÿผ ์ค‘ ์ผ์น˜ํ•œ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ์กฐ์ธ๋˜์—ˆ์œผ๋ฏ€๋กœ ํฐ ๋ฒ”์œ„์—์„œ๋Š” ๋“ฑ๊ฐ€ ์กฐ์ธ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ

- ๋‚ด๋ถ€ ์กฐ์ธ inner join ์— ํฌํ•จ๋œ๋‹ค

SELECT	E1.EMPNO, E1.ENAME, E1.MGR,
		E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
FROM 	EMP E1, EMP E2
WHERE	E1.MGR = E2.EMPNO;

  (1) EMP ํ…Œ์ด๋ธ”์—์„œ EMPNO์™€ ENAME, ๋‹ด๋‹น ๋งค๋‹ˆ์ €์˜ EMPNO์™€ ENAME์„ ๊ฐ™์€ EMP ํ…Œ์ด๋ธ”์—์„œ ์กฐ์ธํ•˜์—ฌ ์ถœ๋ ฅ

 

5. ์™ธ๋ถ€ ์กฐ์ธ outer join

- ์กฐ์ธ ์กฐ๊ฑด ๋ฐ์ดํ„ฐ ์ค‘ ์–ด๋Š ํ•œ์ชฝ์ด null์ž„์—๋„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ํฌํ•จ์‹œ์ผœ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์™ธ๋ถ€ ์กฐ์ธ์„ ์‚ฌ์šฉ

- ์™ธ๋ถ€ ์กฐ์ธ์€ ์ขŒ์šฐ๋ฅผ ๋”ฐ๋กœ ๋‚˜๋ˆ„์–ด ์ง€์ •ํ•˜๋Š”๋ฐ, WHERE ์ ˆ์— ์กฐ์ธ ๊ธฐ์ค€ ์นผ๋Ÿผ ์ค‘ ํ•œ ์ชฝ์— (+) ๊ธฐํ˜ธ๋ฅผ ๋ถ™์—ฌ ์ค€๋‹ค

- ์™ผ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ Left Outer Join       : WHERE TABLE1.COL1 = TABLE2.COL1(+)

  -> ์™ผ์ชฝ ์นผ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ ์นผ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ ์กด์žฌ ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ์ถœ๋ ฅํ•˜๋ผ๋Š” ๋œป

- ์˜ค๋ฅธ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ Right Outer Join : WHERE TABLE1.COL1(+) = TABLE2.COL1

  -> ์˜ค๋ฅธ์ชฝ ์นผ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์นผ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ ์กด์žฌ ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ์ถœ๋ ฅํ•˜๋ผ๋Š” ๋œป

- ์™ธ๋ถ€ ์กฐ์ธ ๋ฐฉ์‹์œผ๋กœ๋Š” ์–‘์ชฝ ๋ชจ๋“  ์—ด์ด ์™ธ๋ถ€ ์กฐ์ธ๋˜๋Š” ์ „์ฒด ์™ธ๋ถ€ ์กฐ์ธ full outer join ์‚ฌ์šฉ์€ ๋ถˆ๊ฐ€๋Šฅ