티스토리 뷰
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)
댓글