Database : Basic SQL_집합연산자_union,interset,minus
< 집합연산자 - union, interset, minus >
1. 합집합 union 사용하기
1) union의 사용: 110건
union은 중복을 제거한 합집합입니다. 쓰이는 col과 동일한 형태이어야 합니다.
사원이 과거에 가졌던 근무와 현재 근무지가 중복되는 데이터들이 있다 하지만..!
중요한 것은 employee_id와 job_id가 중복되는 경우를 없애고 보여주기 때문에 union이 저절로 '정렬작업'을 해준다는 것입니다.
select * from job_history;
select employee_id, job_id
from employees
union
select employee_id, job_id
from job_history;
2) union이 아닌 join의 사용
: join문장으로서 중복되는 값만 보여줍니다.
과거에 job_history가 있는 사원들을 출력하는 것이다. 즉, 과거에 직업이 바뀐 사원들을 나올 수 있습니다.
select e.employee_id, j.job_id
from employees e, job_history j
where e.employee_id = j.employee_id;
2. union all 사용하기
1) union all: 117건
union all은 중복을 제거하지 않는 합집합입니다.
ex) 176번의 사원은 sa_rep가 2번이나 출력됩니다.
select employee_id, job_id
from employees
union all
select employee_id, job_id
from job_history
order by 1, 2;
3.교집합 interset 사용하기
1) interset
: 과거에 근무했던 직업과 현재 근무하고 있는 직업이 같은 사람. 중복되는 경우를 알 수 있습니다.
--select 사용하기.
select employee_id, job_id
from employees
where employee_id in (176, 200);
--interset사용하기.
select employee_id, job_id
from employees
intersect
select employee_id, job_id
from job_history;
4.차집합 minus사용하기
1) minus: job_history에 가지고 있는 데이터는 없어지고 employees테이블에만 있는 유니크한 값만 출력됩니다.
select employee_id, job_id
from employees
minus
select employee_id, job_id
from job_history;
1-1)minus
--이번에는 job_history에만 가지고 있는 유니크한 값을 가져옵니다.
select employee_id, job_id
from job_history
minus
select employee_id, job_id
from employees;
5. select문 일치.
: 아래의 문장은 select문의 일치가 되지 않는 것.두 번째 칼럼인 department_name과 state_province는 둘다 char인데 왜 실행이 안되는거지?
바로 정답은 col의 갯수가 다르기때문에.
1)
select location_id, department_name
from departments
union
select location_id, state_province
from locations;
select count(*) from locations; --23건
select count(*) from departments; -- 27건
: 두 테이블에 중복되는 데이터 값이 없기때문에 총 50건이 출력이 됩니다.
왜냐면 똑같은 location_id이더라도 출력하는 값(department_name)과 state_province는 다르기 때문이죠.
즉 두 select문장의 col이 다를 경우 중복한 값이 없게 됩니다.
* union과 join 헷갈리지말아요. join은 한 칼럼에서 보여주고 union은 두 레코드를 읽어줍니다.
2)
select location_id, department_name, department_name, null "State"
from departments
union
select location_id, null, null, state_province
from locations;
: null을 넣어주면 location_id가 부서의 이름과 연계된 것인지 부서의 이름과 연계된 것인지 비교해 볼 수 있습니다.
-departments의 테이블에 없는 col의 경우 null을 써주고, locations의 테이블에 없는 col을 null을 사용하여 4:4로 합집합 할 수 있습니다.
3) select문 예제
SELECT employee_id, job_id,salary
FROM employees
UNION
SELECT employee_id, job_id,0
FROM job_history;
6. order by
1)
select employee_id, job_id
from employees
union
select employee_id, job_id
from job_history
order by 1;
: 집합연산자의 orderby로 정렬합니다.
집합연산자에서 orderby는 맨 마지막에 한 번 사용할 수 있습니다.
orderby의 의미는 칼럼들의 합집합을 다정렬해주고 마지막에 셀렉트의 칼럼들에서 중복되는 데이터들을 정렬해주는 방법을 지정해주는 것입니다.
댓글
댓글 쓰기