[DB] ORACLE - 4์ผ


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;