day04
- ๋ ์ด์์ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ค์ ๋งํด, ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ๋ค์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๊ฒ
- ๋๊ฐ์ ํ ์ด๋ธ์ ํ๋๋ผ๋ ๊ฐ์ ์ปฌ๋ผ์ด ์์ด์ผํ๋ค.
- ๋ ์ปฌ๋ผ์ ๊ฐ์ ๊ณต์ ๋์ด์ผ ํ๋ค.
- ๋ณดํต ์ข ์ธ์ ์ํด ๊ธฐ๋ณธํค(Primary key)์
์ธ๋ํค(Foreign Key)๋ฅผ ํ์ฉํ๋ค.
- ๊ฐ ํ ์ด๋ธ์ ์กฐ์ธ ์กฐ๊ฑด์ ์ผ์น๋๋ ๋ฐ์ดํฐ๋ง
๊ฐ์ ธ์จ๋ค.- 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
;
- 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์ ์์ชฝ ํ ์ด๋ธ์ด ๋ชจ๋๊ฐ ์ค์ฌ(์ฃผ)
์ด๋ผ๋ ๋ป์ด๋ค.
- ์ผ์ชฝ ํ ์ด๋ธ์ด ๊ธฐ์ค์ด ๋๋ค.
- 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์ด ๊ธฐ์ค์ ์ด ๋๋ค.
;
- ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ด ๊ธฐ์ค์ด ๋๋ค.
- 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 ๊ฐ ๊ธฐ์ค์ ์ด ๋๋ค.
;
- ์์ชฝ ํ ์ด๋ธ์ด ๊ธฐ์ค์ด ๋๋ค.
- 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 -- ๊ณตํต์ ์ ๋งบ๋์ (๊ต์งํฉ๋ถ๋ถ๋งบ๊ธฐ)
;
- SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ง๋ค์ด์ง
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํด์ฃผ๋
๋๋ถ๋ถ์ DMMS๋ค์ SQL์ ์ฌ์ฉํ๋ค. ๋ฌผ๋ก DBMS
์์ฒด์ ํน์์ฑ ๋๋ฌธ์ SQL์ ์ฌ์ฉ๋ฒ์ด ์กฐ๊ธ์ฉ
๋ค๋ฅด๊ธฐ๋ ํ์ง๋ง, ํฐ ํ์์ ๋ณด๋ฉด ๋๋ฆ๋๋ก์
๋ณดํธ์ฑ์ ๊ฐ์ง๊ณ ์๋ค.- ANSI ๋ฏธ๊ตญ ๊ตญ๋ฆฝ ํ์ค ํํ์์๋ SQL์
๋ํ ๋ณดํธ์ ์ธ ๋ฌธ๋ฒ์ ์ ์ํ๊ณ ์๋๋ฐ, ๊ทธ๊ฒ์ด
๋ฐ๋ก ANSI Query์ด๋ค. Join๋ ๋ง์ฐฌ๊ฐ์ง๋ก
ANSI๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค.
์ฌ์๋ค์ ์ด๋ฆ, ๋ถ์๋ฒํธ, ๋ถ์๋ช ์ ์ถ๋ ฅํ๋ผ
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
;
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
;
์ปค๋ฏธ์ ์ ๋ฐ๋ ์ฌ์์ ์ด๋ฆ, ์ง์ , ๋ถ์๋ฒํธ,๋ถ์๋ช ์ ์ถ๋ ฅํ๋ผ
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
;
์ง์ญ๋ฒํธ 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
;
์ด๋ฆ์ 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%'
;
์ฌ์์ด๋ฆ๊ณผ ๊ทธ ์ฌ์์ ๊ด๋ฆฌ์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ผ
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๋ ๋งค๋์ ๋ค์ ๊บผ๋ด์ค๋๊ฒ
;
์ฌ์์ด๋ฆ๊ณผ ๋ถ์๋ช ๊ณผ ์๊ธ์ ์ถ๋ ฅํ๋๋ฐ ์๊ธ์ด 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
;
๊ธ์ฌ๊ฐ 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
;
๊ธ์ฌ๊ฐ 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
;
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'
;
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'
;
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
;
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'
;
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
;