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

๐Ÿ’Ž DataBase/๐Ÿ’Ž SQL-PL,SQL

หšโ‚Šโœฉโ€งโ‚Š [SQL] JOIN หšโ‚Šโœฉโ€งโ‚Š

HYEJU01 2024. 6. 20. 02:40

[JOIN ๊ฐœ๋…]

์‚ฌ์šฉ์ž๊ฐ€ ์ปฌ๋Ÿผ์„ ์กฐํšŒํ•  ๋•Œ ํ…Œ์ด๋ธ” ์•ˆ์˜ ์ปฌ๋Ÿผ๋งŒ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์•„๋‹Œ, ํ…Œ์ด๋ธ”์•ˆ์˜ ์ปฌ๋Ÿผ ์ „์ฒด๋ฅผ ๊ฐ€์ง€๊ณ ์˜จ๋‹ค.

๋น„ํšจ์œจ์ ์ด๋‹ค.. ์ด ๋ฐฉ๋ฒ•์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ •๊ทœํ™”๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๊ณ  ( ํ•˜๋‚˜๋ฅผ ๋” ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ )

์šฐ๋ฆฌ๋Š” ํ…Œ์ด๋ธ”์„ ์ •๊ทœํ™”ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋œ๋‹ค.

์ด๋•Œ ์šฐ๋ฆฐ ๋‚˜๋ˆ ์ง„ ํ…Œ์ด๋ธ”์„ ์กฐํ•ฉํ•ด์„œ ๊ฐ€์ ธ์™€์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— JOIN ์ด๋ผ๋Š” ๊ธฐ์ˆ ์ด ์ƒ๊ฒจ๋‚ฌ๋‹ค!

 

[ ORACLE JOIN  / ANSI JOIN ]

oracle ์šฉ join ๋ฌธ๋ฒ•์ด ์žˆ๊ณ , ๊ณตํ†ต ํ‘œ์ค€ ANSI join ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค.

// Oracle JOIN 
SELECT a.col1, b.col1
FROM table1 a, table2 b
WHERE a.col2 = b.col2;


// ANSI JOIN
SELECT a.col1, b.col1
FROM table a [INNER] JOIN table2 b
ON a.col2 = b.col2;

 

[์„ ํ–‰ ํ…Œ์ด๋ธ”, ํ›„ํ–‰ ํ…Œ์ด๋ธ”]

๋‘˜ ์ค‘ ํ•˜๋‚˜ ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ฝ๊ณ  JOIN ์ ˆ์„ ํ™•์ธํ•˜์—ฌ ๋‚˜๋จธ์ง€ ํ…Œ์ด๋ธ”์— ๊ฐ€์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

๋จผ์ € ์ฝ๋Š” ํ…Œ์ด๋ธ”์ด ์„ ํ–‰ ํ…Œ์ด๋ธ”์ด๋‹ค. 

์„ ํ–‰ํ…Œ์ด๋ธ”์€ ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์ž‘์€ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒํ•ด์•ผ ์†๋„๋ฉด์—์„œ ์ข‹๋‹ค.




[Cartesian Product ์นดํ‹ฐ์…˜๊ณฑ]

JOIN ์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ : ์กฐ์ธ ์กฐ๊ฑด์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„ !

 

1) ์กฐ์ธ ์กฐ๊ฑด ์ž˜๋ชป ์คŒ, 2) ์กฐ์ธ ์กฐ๊ฑด์ ˆ ์ ์ง€ ์•Š์Œ

=>  ๋ฐ์ดํ„ฐ ์ „๋ถ€ ๊ฐ€์ ธ์˜ค๋Š” ํ˜„์ƒ์ด ์ƒ๊น€

์ด ๊ฒฝ์šฐ๋ฅผ ์นดํ‹ฐ์…˜ ๊ณฑ์ด๋ผ๊ณ  ํ•œ๋‹ค. ( (ANSI) CROSS JOIN ์ด๋ผ๊ณ ๋„ ๋ถ€๋ฆ„)

 

 

* ์˜๋„์ ์œผ๋กœ ์นดํ‹ฐ์…˜ ๊ณฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

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

-> ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ์šฉ ํ…Œ์ด๋ธ” ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ  (ํ•œ๋ฒˆ์— ๋Œ€๋Ÿ‰๋ฉ”๋ชจ๋ฆฌ์˜ ํ…Œ์ด๋ธ” ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ)

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

-> ํ•œ๋ฒˆ์— ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ถ”์ถœ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ๋‹ค์šด๋˜๋Š” ๊ฒฝ์šฐ

 

 

 

[INNER JOIN ์ด๋„ˆ ์กฐ์ธ]

๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅ

 


[EQUL Join ๋“ฑ๊ฐ€์กฐ์ธ]

์„œ๋กœ ๊ฐ™์€ ์กฐ๊ฑด์˜ ๋ฐ์ดํ„ฐ

ORACLE JOIN
SELECT e.empno , e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;


ANSI JOIN
SELECT e.empno , e.ename, d.dname
FROM emp e JOIN dept d
ON e.deptno = d.deptno;

 

 

 

์„ ํ–‰ ํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์„ ๊ฐ€์ ธ์˜จ ํ›„ ์กฐ์ธ ์กฐ๊ฑด์ ˆ์„ ๊ฒ€์‚ฌํ•ด์„œ

๋™์ผํ•œ ์กฐ๊ฑด์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ

ํ›„ํ–‰ ํ…Œ์ด๋ธ”์—์„œ ๊บผ๋‚ด์˜ค๋Š” ๋ฐฉ๋ฒ•

 

(ANSI) ์กฐ์ธ์ด ๋Š˜์–ด๋‚  ๊ฒฝ์šฐ JOIN ~ ON ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

*์กฐ์ธ ์‹œ์— select ์ปฌ๋Ÿผ ๋ž€์— ํ…Œ์ด๋ธ”์ด๋ฆ„์„ ์ ์ง€ ์•Š์•„๋„ ์‹คํ–‰๋˜์ง€๋งŒ

์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์žˆ๋Š” ์ปฌ๋Ÿผ์˜ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๋ฏ€๋กœ

[ ํ…Œ์ด๋ธ”๋ช….์ปฌ๋Ÿผ ] ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด์ž.

 

*๊ฒ€์ƒ‰์กฐ๊ฑด, ์กฐ์ธ ์กฐ๊ฑด ์žˆ์„ ์‹œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด ํ›„ ์กฐ์ธ์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—

๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ์ธ ์ž‘์—… ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.

 

 


[Non-Equi Join ๋น„๋“ฑ๊ฐ€์กฐ์ธ]

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

ORACLE JOIN
SELECT c.game, TO_CHAR(c.point,'99.999'), g.name
FROM customer c , gift g
WHERE c.point BETWEEN g.g_start AND g.g_end;


ANSI JOIN
SELECT c.game, TO_CHAR(c.point,'99.999'), g.name
FROM customer c JOIN gift g
ON c.point BETWEEN g.g_start AND g.g_end;

-- BETWEEN ๋ณด๋‹ค ๋น„๊ต์—ฐ์‚ฐ์ž๊ฐ€ ๋” ์„ฑ๋Šฅ์— ์ข‹๋‹ค.

 

 

 

[OUTER Join ์•„์šฐํ„ฐ์กฐ์ธ]

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

-> DB ์„ฑ๋Šฅ์— ๋‚˜์œ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ ( FULL SCAN  )

 

?) ์–ด๋Š ์ชฝ์ด ์ฃผ ํ…Œ์ด๋ธ”์ด ๋˜๋Š”๊ฐ€

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

 

// Oracle JOIN 
SELECT s.name, p.name
FROM student s, professor p
WHERE s.profno = p.profno(+);
-- ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ชฝ์— (+) ํ‘œ์‹œ


// ANSI JOIN
SELECT s.name, p.name
FROM student s LEFT OUTER JOIN professor p
ON s.profno = p.profno;
-- ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ชฝ์— ํ‘œ์‹œ (LEFT)


// ANSI JOIN
SELECT s.name, p.name
FROM student s FULL OUTER JOIN professor p
ON s.profno = p.profno;
-- ๋‘๊ฐ€์ง€ OUTER JOIN ๊ฒฐ๊ณผ ํ•œ๋ฒˆ์— ์ถœ๋ ฅ

 

* (ANSI) WHERE, ON ์˜๋ฏธ

- WHERE ์ ˆ : ๊ธฐ์ค€ ํ…Œ์ด๋ธ”์˜ ์ง‘ํ•ฉ์˜ ์ˆ˜

- ON ์ ˆ : ๊ธฐ์ค€ ์ง‘ํ•ฉ ์ค‘์— ์•„์šฐํ„ฐ ์กฐ์ธ ๋Œ€์ƒ์ด ๋˜๋Š” ์ง‘ํ•ฉ (๊ฒฐ๊ณผ์˜ํ–ฅ์—†์Œ)

 

1) WHERE ์กฐ๊ฑด์— ๋งž๋Š” ์ง‘ํ•ฉ ์ถ”์ถœ

2) ON ์ ˆ์— ๊ธฐ์ˆ ๋œ ์กฐ๊ฑด๋งŒ ์กฐ์ธ

 


[SELF Join ์…€ํ”„ ์กฐ์ธ]

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

// Oracle JOIN 
SELECT e1.ename, e2.ename
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno;


// ANSI JOIN
SELECT e1.ename, e2.ename
FROM emp e1 JOIN emp e2
ON e1.mgr = e2.empno;

-- ๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ๋ณ„๋ช…๋งŒ ๋‹ค๋ฅด๊ฒŒ