[DB] ORACLE - 4์ผ
in DB
ORACLE
์ค๋ผํด 4์ผ
[SET operator]-์งํฉ์ฐ์ฐ์
๋๊ฐ ์ด์์ ์ฟผ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ํ๋๋ก ๊ฒฐํฉ์ํค๋ ์ฐ์ฐ์
- UNION : ์์ชฝ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ํฌํจ(์ค๋ณต ๊ฒฐ๊ณผ๋ 1๋ฒ๋ง ํฌํจ) โ> ํฉ์งํฉ
- UNION ALL : ์์ชฝ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ํฌํจ(์ค๋ณต ๊ฒฐ๊ณผ๋ ๋ชจ๋ ํฌํจ)
- INTERSECT : ์์ชฝ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ชจ๋ ํฌํจ๋๋ ํ๋ง ํํ โ> ๊ต์งํฉ
- MINUS : ์ฟผ๋ฆฌ1๊ฒฐ๊ณผ์ ํฌํจ๋๊ณ ์ฟผ๋ฆฌ2๊ฒฐ๊ณผ์๋ ํฌํจ๋์ง ์๋ ํ๋ง ํํ โ>์ฐจ์งํฉ
์ค๋ผํด์ ์งํฉ์ฐ์ฐ์(SET operator) UNION, INTERSECT, MINUS ๋ order by ํ๋ค
์ปฌ๋ผ์ด ๋ง์ผ๋ฉด order by ํ๋ฏ๋ก ๋๋ ค์ง๋ค. ์๊ฐ ์์ ํํ๋ก ๊ฐ๊ณต ํ ์ฌ์ฉํ๋๊ฒ ์ข๋ค
UNION ALL ๋ order by ํ์ง ์๊ณ ๋ฌด์กฐ๊ฑด ํฉํด์ค๋ค
Order by๋ฅผ ํ๋ ค๋ฉด ๋๋ฒ์งธ ์ฟผ๋ฆฌ์ ์์ฑํด์ผ ํ๋ค
[์ฐ์ต์ฉ ํ ์ด๋ธ]
create table employees_role as select * from employees where 1=0; โ ํ
์ด๋ธ ๊ตฌ์กฐ๋ง ๋ณต์ฌ
select * from employees_role;
insert into employees_role values(101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(101, 'Nee', 'Ko', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(200, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(200, 'Nee', 'Kochhar', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(300, 'GilDong', 'Conan', 'CONAN', '010-123-4567',
'2009-03-01', 'IT_PROG', 23000.00, NULL, 100, 90);
ex1 ) union
employee_id, last_name์ด ๊ฐ์๊ฒฝ์ฐ ์ค๋ณต์ ๊ฑฐ ํ์์ค โ 110 ๋ ์ฝ๋
select employee_id, last_name from employees
union
select employee_id, last_name from employees_role;
ex2 ) union all
employee_id, last_name์ด ๊ฐ์๊ฒฝ์ฐ ์ค๋ณต์ ํ์ฉ ํ์์ค โ 113 ๋ ์ฝ๋
select employee_id, last_name from employees
union all
select employee_id, last_name from employees_role;
select salary from employees where department_id=10
union all
select salary from employees where department_id=30 order by 1;
ex3 ) minus
employees_role๊ณผ ์ค๋ณต๋๋ ๋ ์ฝ๋๋ ์ ๊ฑฐํ๊ณ employees์๋ง ์๋ ์ฌ์๋ช ๋จ์ ๊ตฌํ์์ค (๋จ, employee_id, last_name๋ง ํ์) โ 106 ๋ ์ฝ๋
select employee_id, last_name from employees
minus
select employee_id, last_name from employees_role;
ex4 ) intersect
employees์ employees_role์์ ์ค๋ณต๋๋ ๋ ์ฝ๋์ ์ฌ์๋ช ๋จ์ ๊ตฌํ์์ค (๋จ, employee_id, last_name๋ง ํ์) โ 1 ๋ ์ฝ๋
select employee_id, last_name from employees
intersect
select employee_id, last_name from employees_role;
[๋ฌธ์ 1] employees์ employees_role์์ ๋ ์ฝ๋์ ์ฌ์๋ช ๋จ์ ๊ตฌํ์์ค
์กฐ๊ฑด1) ์ฌ์์ด๋ฆ, ์ ๋ฌดID, ๋ถ์ID์ ํ์ํ์์ค
์กฐ๊ฑด2) employees ์์๋ ๋ถ์ID๊ฐ 10์ธ์ฌ์๋ง
employees_role์์๋ ์ ๋ฌดID๊ฐ IT_PROG๋ง ๊ฒ์
์กฐ๊ฑด3) ์ค๋ณต๋๋ ๋ ์ฝ๋๋ ์ ๊ฑฐ
ex5) SET operator๊ณผ IN operator๊ด๊ณ
job_title์ด โStock Managerโ ๋๋ โProgrammerโ์ธ ์ฌ์๋ค์ ์ฌ์๋ช ๊ณผ job_title์ ํ์ํ์์ค
last_name job_title
------------------------
Kaufling StockManager
Hunlod Programmer
:
๋ฐฉ๋ฒ1 (join, in์ฐ์ฐ์ ์ด์ฉ)
select last_name, job_title
from employees
join jobs using(job_id)
where job_title in('Stock Manager','Programmer');
๋ฐฉ๋ฒ2 (join, union ์ด์ฉ)
select last_name, job_title
from employees
join jobs using(job_id)
where job_title='Stock Manager'
union
select last_name, job_title
from employees
join jobs using(job_id)
where job_title='Programmer'
order by 2;
ex9 ) ์ปฌ๋ผ๋ช ์ด ๋ค๋ฅธ๊ฒฝ์ฐ์ SET operator
์ฟผ๋ฆฌ1๊ณผ ์ฟผ๋ฆฌ2์ select ๋ชฉ๋ก์ ๋ฐ๋์๋์ผ(์ปฌ๋ผ๊ฐฏ์,๋ฐ์ดํฐํ์ )ํด์ผ ํ๋ฏ๋ก ์ด๋ฅผ ์ํด Dummy Column์ ์ฌ์ฉํ ์ ์๋ค.
select last_name, employee_id, hire_date
from employees
where department_id=20
union
select department_name, department_id, NULL
from departments
where department_id=20;
