티스토리 뷰

카테고리 없음

오라클 - 집합

장꾸꾸 2020. 10. 20. 10:36

 

union all 은 교집합을 빼지 않고 (중복 빼지 않고) 전체

[SET operator]
두개 이상의 쿼리결과를 하나로 결합시키는 연산자

1. UNION      : 양쪽쿼리를 모두 포함(중복 결과는 1번만 포함)     --> 합집합
2. UNION  ALL : 양쪽쿼리를 모두 포함(중복 결과도 모두 포함)  
3. INTERSECT  : 양쪽쿼리 결과에 모두 포함되는 행만 표현          --> 교집합
4. MINUS      : 쿼리1결과에 포함되고 쿼리2결과에는 포함되지 않는 행만 표현 -->차집합

 

 

행을 붙이고 싶을 때 이용하는 set operator

[SET operator]
두개 이상의 쿼리결과를 하나로 결합시키는 연산자

1. UNION      : 양쪽쿼리를 모두 포함(중복 결과는 1번만 포함)     --> 합집합
2. UNION  ALL : 양쪽쿼리를 모두 포함(중복 결과도 모두 포함)  
3. INTERSECT  : 양쪽쿼리 결과에 모두 포함되는 행만 표현          --> 교집합
4. MINUS      : 쿼리1결과에 포함되고 쿼리2결과에는 포함되지 않는 행만 표현 -->차집합

[연습용테이블]

drop table employees_role purge;

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',
'2005-09-21','AD_VP',17000.00,NULL,100,90);

insert into employees_role  values(101,'Neeno','Kochhar','NKOCHHAR','515.123.4568',
'2005-09-21','AD_VP',17000.00,NULL,100,90);

insert into employees_role values(300,'SeoJeong','Kim','Jenni7','010.123.4567',
'2007-03-01','IT_PROG',23000.00,NULL,100,90);
commit;

delete from employees_role where first_name='SeoJeong';
==================================================================================
--ex1) union : 합집합 / 중복은 뺀다. 
--     employees테이블과 employees_role테이블을 union으로 연결하시오  ==> 108레코드
--     조건1) employee_id, last_name이 같을경우 중복제거 하시오
--     조건2) 출력
--               emoloyee_id   last_name
--               ----------------------------
select employee_id, last_name --107명
from employees
union 
select employee_id, last_name -- 3명 (새로 만든 테이블)
from employees_role
order by 1 -- 108개 나옴 (기존에 있던 니나와 니노 즉, 중복되는 니나와 니노가 빠져서 8개가 됨)


--employee_id   first_name    last_name
--101                Neena         Kochhar   <-- employees , employees_role둘다 있음
--101                Neeno         Kochhar   <-- employees_role에만 있음

--[참고]  ===> 109 레코드
select employee_id, first_name
from employees
union 
select employee_id, first_name 
from employees_role
order by 1; --109개가 되는 건 니노는 employees role에만 있어서 안뺌


--ex2) union all
--     employees테이블과 employees_role테이블을 union all으로 연결하시오  ==> 110레코드
--     조건1) employee_id, last_name이 같을경우 중복 하시오
--     조건2) 출력
--               emoloyee_id   last_name
--               ----------------------------

select employee_id, last_name --107명
from employees
union all -- union all은 중복을 허용 - > 107 +3 => 110~
select employee_id, last_name -- 3명 (새로 만든 테이블)
from employees_role


--ex3) minus
--    employees_role과 중복되는 레코드는 제거하고 employees에만 있는 사원명단을 
--    구하시오 (단, employee_id, last_name만 표시)   ==> 106 레코드
  
--     emoloyee_id   last_name
--     ----------------------------

select employee_id, last_name --107명
from employees
minus -- 차집합 중복된 것을 뺌 // 중복되는 니나만 빠짐 ! 1개만 빠짐
select employee_id, last_name -- 3명 (새로 만든 테이블)
from employees_role


--ex4) intersect(교집합)
--     employees와 employees_role에서 중복되는 레코드의 사원명단을 구하시오
--     (단, employee_id, last_name만 표시)   ==> 1 레코드

select employee_id, last_name --107명
from employees
intersect  -- 니나만 중복되니까!
select employee_id, last_name -- 3명 (새로 만든 테이블)
from employees_role


--ex5) employees와 employees_role에서  중복되는 레코드의 사원명단을 구하시오  ==> 1 레코드
--        조건1) 사원이름, 업무ID,입사일을 표시하시오
--        조건2) 부서번호가 90인사원만 표시하시오
select last_name, job_id, hire_date 
from employees
where department_id = 90
intersect  -- 중복되니까!
select last_name, job_id, hire_date 
from employees_role
where department_id = 90



--ex6) union구문을 이용하여 50번 사원과 대표이사를 구하시오
--employee_id     last_name    구분
---------------------------------------
--100             King             대표이사              
--120             Weiess            직원
--121             Fripp               직원 
--                 :

--(분석) select * from employees where department_id=50;
select employee_id, last_name, '대표이사' as "DIVISION"
from employees
where employee_id=100
union
select employee_id, last_name, '사원' as "DIVISION"
from employees
where department_id=50


--ex7) 기타
select 'SQL을 공부하고 있습니다' 문장, 3 순서 from dual
union
select 'it programmer 과정에서', 1 from dual
union
select '아주 재미있게', 2 from dual
order by 2 asc;

--ex8) SET operator과  IN operator관계
--job_title이   'Stock Manager' 또는  'Programmer'인 사원들의 사원명과 job_title을 표시하시오
--job_title순으로 정렬하시오(오름차순)

--last_name       job_title
--------------------------------
--Kaufling        StockManager
--Hunlod          Programmer
--           :

--방법1 (join, in연산자 이용)
select last_name, job_title
from employees
left join jobs using(job_id)
where job_title in('Stock Manager','Programmer')
order by 2;


--방법2 (join,union이용)
select last_name, job_title
from employees
left join jobs using(job_id)
where job_title='Stock Manager'
union
select last_name, job_title
from employees
left join jobs using(job_id)
where job_title='Programmer'
order by 2;

--ex9) 컬럼명이 다른경우의 SET operator
--     : 쿼리1과 쿼리2의 select 목록은 반드시동일(컬럼갯수,데이터타입)해야 하므로 
--       이를 위해 Dummy Column을 사용할수 있다.
desc employees;
desc departments; -- 확인용

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
-- last_name, department_name -> 같은 자료형 varchar// ..


--ex10)사용 예

drop table member;

create table member(
name varchar2(10),
score number);

insert into member(name,score) values('kim',55);
insert into member(name,score) values('lee',75);
insert into member(name,score) values('park',95);
commit;

select * from tab;
select * from member;

select name, score, result
from member --가상으로 만들어서 join해주는 것
left join (select '불합격' as result, 0 as low, 60 as high from dual
           union
           select '합격' as result, 61 as low, 100 as high from dual)
      on(score between low and high)
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함