Join

๊ธฐํ˜ยท2023๋…„ 2์›” 13์ผ
0

DBMS ํ•™์Šต

๋ชฉ๋ก ๋ณด๊ธฐ
6/13
post-thumbnail

day04

๐Ÿ“Œ Join

  • ๋‘˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”๋“ค์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ

๐Ÿ“Œ Join์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • ๋‘๊ฐœ์˜ ํ…Œ์ด๋ธ”์— ํ•˜๋‚˜๋ผ๋„ ๊ฐ™์€ ์ปฌ๋Ÿผ์ด ์žˆ์–ด์•ผํ•œ๋‹ค.
  • ๋‘ ์ปฌ๋Ÿผ์˜ ๊ฐ’์€ ๊ณต์œ ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๋ณดํ†ต ์ข…์ธ์„ ์œ„ํ•ด ๊ธฐ๋ณธํ‚ค(Primary key)์™€
    ์™ธ๋ž˜ํ‚ค(Foreign Key)๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

๐Ÿ“ข inner join

  • ๊ฐ ํ…Œ์ด๋ธ”์— ์กฐ์ธ ์กฐ๊ฑด์— ์ผ์น˜๋˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ
    ๊ฐ€์ ธ์˜จ๋‹ค.
  • inner Join์€ ๊ต์ง‘ํ•ฉ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.
SELECT	e.EMPLOYEE_ID   ,  	e.DEPARTMENT_ID 
	,	d.DEPARTMENT_ID ,	d.DEPARTMENT_NAME 	
FROM 	EMPLOYEES e 
	INNER JOIN DEPARTMENTS d 
	ON	e.DEPARTMENT_ID  = d.DEPARTMENT_ID
WHERE	e.EMPLOYEE_ID = 178 
;

๐Ÿ“ข outer join

  • join ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฐ ์ผ์น˜ํ•˜์ง€ ์•Š์€
    ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ select ํ•œ๋‹ค.
  • join ์กฐ๊ฑด์ด ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด NULL๋กœ
    ๊ฐ€์ ธ์˜จ๋‹ค.
  • Outer Join ์€ Inner Join๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฃผ(main)
    ํ…Œ์ด๋ธ”์ด ์–ด๋–ค ํ…Œ์ด๋ธ”์ธ์ง€๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ
    ์–ด๋–ค ํ…Œ์ด๋ธ”์ด ์ค‘์‹ฌ์ด ๋˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ค์‹œ
    Left Outer Join, Right Outer Join, Full Outer Join
    ์œผ๋กœ ์„ธ๋ถ„ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Left Outer Join์€ ์™ผ์ชฝ์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด,
    Right Outer Join์€ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด,
    Full Outer Join์€ ์–‘์ชฝ ํ…Œ์ด๋ธ”์ด ๋ชจ๋‘๊ฐ€ ์ค‘์‹ฌ(์ฃผ)
    ์ด๋ผ๋Š” ๋œป์ด๋‹ค.

๐Ÿ’ก Left Outer Join

  • ์™ผ์ชฝ ํ…Œ์ด๋ธ”์ด ๊ธฐ์ค€์ด ๋œ๋‹ค.
  • Join ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ Join ๋‹นํ•˜๋Š”
    ํ…Œ์ด๋ธ”(์˜ค๋ฅธ์ชฝ)์— ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ, ๋ถ€์žฌํ•˜๋ฉด
    NULL๋กœ select๋œ๋‹ค.
 select * 
 from table_A t1
	left outer join table_B t2 --  table_A๊ฐ€ ๊ธฐ์ค€์ 

์˜ˆ์‹œ๋ฒ„์ „

SELECT	e.EMPLOYEE_ID 	,	e.FIRST_NAME 
	,	d.DEPARTMENT_ID ,	d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN	DEPARTMENTS d 
	ON e.EMPLOYEE_ID = d.DEPARTMENT_ID -- EMPLOYEE_ID์ด ๊ธฐ์ค€์ ์ด ๋œ๋‹ค.
;

๐Ÿ’ก Right Outer Join

  • ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์ด ๊ธฐ์ค€์ด ๋œ๋‹ค.
  • Join ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ Join ๋‹นํ•˜๋Š”
    ํ…Œ์ด๋ธ”(์™ผ์ชฝ)์— ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ, ๋ถ€์žฌํ•˜๋ฉด
    NULL๋กœ select๋œ๋‹ค.
  select * from table_A t1
	right outer join table_B t2

์˜ˆ์‹œ๋ฒ„์ „

SELECT	e.EMPLOYEE_ID 	,	e.FIRST_NAME 
	,	d.DEPARTMENT_ID ,	d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	RIGHT OUTER JOIN	DEPARTMENTS d 
	ON e.EMPLOYEE_ID = d.DEPARTMENT_ID -- DEPARTMENT_ID ๊ฐ€ ๊ธฐ์ค€์ ์ด ๋œ๋‹ค.
;

๐Ÿ’ก full outer join

  • ์–‘์ชฝ ํ…Œ์ด๋ธ”์ด ๊ธฐ์ค€์ด ๋œ๋‹ค.
  • Join ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ Join ๋‹นํ•˜๋Š”
    ํ…Œ์ด๋ธ”(์™ผ์ชฝ or ์˜ค๋ฅธ์ชฝ )์— ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ, ๋ถ€์žฌํ•˜๋ฉด
    NULL๋กœ select๋œ๋‹ค.
  select * from table_A t1
	full outer join table_B t2 -- ์–‘์ชฝ ๋‹ค ๊ธฐ์ค€์ 

โญ ์˜ˆ์‹œ๋ฌธ์ œ

  • ์šฐ๋ฆฌ ํšŒ์‚ฌ์— ์žˆ๋Š” ์‚ฌ์› ์ค‘์—์„œ ์‚ฌ์› ์ด๋ฆ„, ์‚ฌ์› ๋ฒˆํ˜ธ,
    ๋ถ€์„œ์ด๋™ ์ •๋ณด(start_date, end_date, job_id)๋ฅผ
    ์ถœ๋ ฅํ•˜์‹œ์˜ค
SELECT  e.EMPLOYEE_ID 	,	e.FIRST_NAME  -- ์‚ฌ์›์ค‘ ์‚ฌ์›์ด๋ฆ„๊ณผ ์‚ฌ์›๋ฒˆํ˜ธ
	,	e.HIRE_DATE 
	,	jh.START_DATE 	,	jh.END_DATE   -- ๋ถ€์„œ์ด๋™ ์ •๋ณด 
                      					 --  (start_date, end_date, 
                                         --  job_id)๋ฅผ ๊ฐ€์ ธ์˜จ ๋ชจ์Šต์ด๋‹ค.
	,	jh.JOB_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN JOB_HISTORY jh  - ๊ธฐ์ค€์  EMPLOYEES e
	ON	  e.EMPLOYEE_ID = jh.EMPLOYEE_ID -- ๊ณตํ†ต์ ์„ ๋งบ๋Š”์ (๊ต์ง‘ํ•ฉ๋ถ€๋ถ„๋งบ๊ธฐ)
;

๐Ÿ“Œ ANSI Join vs Oracle Join

  • SQL์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„
    ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š”
    ๋Œ€๋ถ€๋ถ„์˜ DMMS๋“ค์€ SQL์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฌผ๋ก  DBMS
    ์ž์ฒด์˜ ํŠน์ˆ˜์„ฑ ๋•Œ๋ฌธ์— SQL์˜ ์‚ฌ์šฉ๋ฒ•์ด ์กฐ๊ธˆ์”ฉ
    ๋‹ค๋ฅด๊ธฐ๋„ ํ•˜์ง€๋งŒ, ํฐ ํ‹€์—์„œ ๋ณด๋ฉด ๋‚˜๋ฆ„๋Œ€๋กœ์˜
    ๋ณดํŽธ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ANSI ๋ฏธ๊ตญ ๊ตญ๋ฆฝ ํ‘œ์ค€ ํ˜‘ํšŒ์—์„œ๋„ SQL์—
    ๋Œ€ํ•œ ๋ณดํŽธ์ ์ธ ๋ฌธ๋ฒ•์„ ์ œ์‹œํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์ด
    ๋ฐ”๋กœ ANSI Query์ด๋‹ค. Join๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
    ANSI๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋‹ค.

๐Ÿ“Œ ๋ฌธ์ œ

๐Ÿ“ข ๋ฌธ์ œ1)

์‚ฌ์›๋“ค์˜ ์ด๋ฆ„, ๋ถ€์„œ๋ฒˆํ˜ธ, ๋ถ€์„œ๋ช…์„ ์ถœ๋ ฅํ•˜๋ผ

SELECT 	e.FIRST_NAME , e.DEPARTMENT_ID , d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN  DEPARTMENTS d 
	ON e.EMPLOYEE_ID = d.DEPARTMENT_ID 
;

๐Ÿ“ข ๋ฌธ์ œ2)

30๋ฒˆ ๋ถ€์„œ์˜ ์‚ฌ์›๋“ค์˜ ์ด๋ฆ„,์ง์—…,๋ถ€์„œ๋ช…์„ ์ถœ๋ ฅํ•˜๋ผ

SELECT 	e.EMPLOYEE_ID , e.DEPARTMENT_ID , d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON 	e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE e.DEPARTMENT_ID = 30
;

๐Ÿ“ข ๋ฌธ์ œ3)

์ปค๋ฏธ์…˜์„ ๋ฐ›๋Š” ์‚ฌ์›์˜ ์ด๋ฆ„, ์ง์—…, ๋ถ€์„œ๋ฒˆํ˜ธ,๋ถ€์„œ๋ช…์„ ์ถœ๋ ฅํ•˜๋ผ

SELECT 	e.FIRST_NAME , e.JOB_ID  
	, e.DEPARTMENT_ID , d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON 	e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE COMMISSION_PCT IS NOT NULL 
;

๐Ÿ“ข ๋ฌธ์ œ4)

์ง€์—ญ๋ฒˆํ˜ธ 2500 ์—์„œ ๊ทผ๋ฌดํ•˜๋Š” ์‚ฌ์›์˜ ์ด๋ฆ„,
์ง์—…,๋ถ€์„œ๋ฒˆํ˜ธ,๋ถ€์„œ๋ช…์„ ์ถœ๋ ฅํ•˜๋ผ

SELECT 	e.FIRST_NAME , e.DEPARTMENT_ID 
	,	d.DEPARTMENT_NAME 	, e.JOB_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON 	e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE LOCATION_ID = 2500
;

๐Ÿ“ข ๋ฌธ์ œ5)

์ด๋ฆ„์— A๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์‚ฌ์›๋“ค์˜ ์ด๋ฆ„๊ณผ ๋ถ€์„œ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋ผ

SELECT 	e.FIRST_NAME , e.DEPARTMENT_ID 
	,	d.DEPARTMENT_NAME 	, e.JOB_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON 	e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE 	FIRST_NAME LIKE '%A%'
;

๐Ÿ“ข ๋ฌธ์ œ6)

์‚ฌ์›์ด๋ฆ„๊ณผ ๊ทธ ์‚ฌ์›์˜ ๊ด€๋ฆฌ์ž ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋ผ

SELECT 	e.EMPLOYEE_ID , e2.FIRST_NAME , e.FIRST_NAME  ,e.MANAGER_ID 
FROM 	EMPLOYEES e 
	INNER JOIN EMPLOYEES e2             -- e ์™€ e2
	ON e.EMPLOYEE_ID = e2.MANAGER_ID    -- e ๊ทธ๋ƒฅ ๋„ค์ž„ e2๋Š” ๋งค๋‹ˆ์ €๋„ค์ž„ ๊บผ๋‚ด์˜ค๋Š”๊ฒƒ
;

๐Ÿ“ข ๋ฌธ์ œ7)

์‚ฌ์›์ด๋ฆ„๊ณผ ๋ถ€์„œ๋ช…๊ณผ ์›”๊ธ‰์„ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ์›”๊ธ‰์ด 3000 ์ด์ƒ์ธ ์‚ฌ์›์„ ์ถœ๋ ฅํ•˜๋ผ

SELECT e.FIRST_NAME , d.DEPARTMENT_NAME , e.SALARY
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.SALARY >= 3000
ORDER BY e.SALARY
;

๐Ÿ“ข ๋ฌธ์ œ8)

๊ธ‰์—ฌ๊ฐ€ 3000์—์„œ 5000์‚ฌ์ด์ธ ์‚ฌ์›์˜ ์ด๋ฆ„๊ณผ ์†Œ์†๋ถ€์„œ๋ช… ์ถœ๋ ฅํ•˜๋ผ

SELECT	FIRST_NAME , d.DEPARTMENT_NAME
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON	e.DEPARTMENT_ID  = d.DEPARTMENT_ID  
WHERE e.SALARY BETWEEN 3000 AND 5000
;

๐Ÿ“ข ๋ฌธ์ œ9)

๊ธ‰์—ฌ๊ฐ€ 3000์ดํ•˜์ธ ์‚ฌ์›์˜ ์ด๋ฆ„๊ณผ ๊ธ‰์—ฌ, ๊ทผ๋ฌด์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ผ

SELECT 	e.FIRST_NAME , e.SALARY , d.LOCATION_ID  , l.CITY 
FROM 	DEPARTMENTS d  
	RIGHT OUTER JOIN EMPLOYEES e 
	ON e.DEPARTMENT_ID  = d.DEPARTMENT_ID  
	LEFT OUTER JOIN LOCATIONS l 
	ON d.LOCATION_ID = l.LOCATION_ID 
WHERE 	SALARY <= 3000 
;

๐Ÿ“ข ๋ฌธ์ œ10)

Steven King์˜ ๋ถ€์„œ๋ช…์„ ์ถœ๋ ฅํ•˜๋ผ.

SELECT 	d.DEPARTMENT_NAME ,e.FIRST_NAME ,e.LAST_NAME 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON	e.DEPARTMENT_ID  = d.DEPARTMENT_ID 
WHERE e.LAST_NAME = 'King' 
AND	e.FIRST_NAME = 'Steven'
;

๐Ÿ“ข ๋ฌธ์ œ11)

IT๋ถ€์„œ์—์„œ ๊ทผ๋ฌดํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ถœ๋ ฅํ•˜๋ผ.

SELECT FIRST_NAME , LAST_NAME 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON	e.DEPARTMENT_ID  = d.DEPARTMENT_ID 
WHERE d.DEPARTMENT_NAME = 'IT'
;

๐Ÿ“ข ๋ฌธ์ œ12)

EMPLOYEES ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์›๋ฒˆํ˜ธ,์ด๋ฆ„,์—…๋ฌด,
EMPLOYEES ํ…Œ์ด๋ธ”์˜ ๋ถ€์„œ๋ฒˆํ˜ธ,
DEPARTMENTS ํ…Œ์ด๋ธ”์˜ ๋ถ€์„œ๋ฒˆํ˜ธ,๋ถ€์„œ๋ช…,๊ทผ๋ฌด์ง€๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ

SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME , e.JOB_ID 
	,	e.DEPARTMENT_ID 
	,	d.DEPARTMENT_NAME 
	,	d.LOCATION_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID  = d.DEPARTMENT_ID  
ORDER BY EMPLOYEE_ID 
;

๐Ÿ“ข ๋ฌธ์ œ13)

EMPLOYEES ํ…Œ์ด๋ธ”๊ณผ DEPARTMENTS ํ…Œ์ด๋ธ”์˜ ๋ถ€์„œ๋ฒˆํ˜ธ๋ฅผ ์กฐ์ธํ•˜๊ณ 
SA_MAN ์‚ฌ์›๋งŒ์˜ ์‚ฌ์›๋ฒˆํ˜ธ,์ด๋ฆ„,๊ธ‰์—ฌ,๋ถ€์„œ๋ช…,๊ทผ๋ฌด์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.

SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME  ,e.SALARY
	,	d.DEPARTMENT_NAME , d.LOCATION_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID  = d.DEPARTMENT_ID  
WHERE e.JOB_ID  = 'SA_MAN'
;

๐Ÿ“ข ๋ฌธ์ œ14)

EMPLOYEES ํ…Œ์ด๋ธ”๊ณผ DEPARTMENTS ํ…Œ์ด๋ธ”์—์„œ
DEPARTMENTS ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์›๋ฒˆํ˜ธ,์ด๋ฆ„,์—…๋ฌด,
๋ถ€์„œ๋ฒˆํ˜ธ,๋ถ€์„œ๋ช…,๊ทผ๋ฌด์ง€๋ฅผ
EMPLOYEES ํ…Œ์ด๋ธ”์˜ ๋ถ€์„œ๋ฒˆํ˜ธ ์ถœ๋ ฅํ•˜์—ฌ๋ผ

SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME , e.JOB_ID 
	, 	d.DEPARTMENT_NAME  , d.LOCATION_ID 
	,  	e.DEPARTMENT_ID 
FROM 	EMPLOYEES e 
	RIGHT OUTER JOIN DEPARTMENTS d
	ON	e.DEPARTMENT_ID  = d.DEPARTMENT_ID 
;
profile
โญ๏ธ๋‚ด๊ฐ€๋งŒ๋“ ์ฟ ํ‚คโญ๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€