집합연산자
두 개 이상의 SELECT 쿼리의 결과를 결합하여 하나의 결과 집합을 생성하는 데 사용된다. 주로 다음과 같은 연산자가 있다. 줄단위의 결합을 하며 두 테이블의 칼럼수와 타입이 동일해야 한다.
UNION
두 개 이상의 SELECT 쿼리 결과를 결합하여 중복된 행을 제거한 결과를 반환한다. =>합집합
EX)두 부서 모두 출력하는데 A대학 나온사람들을 중복시 한 번만 출력함.
UNION ALL
두 개 이상의 SELECT 쿼리 결과를 결합하되, 중복된 행도 포함하여 반환한다. =>합집합+교집합
EX)두 부서 모두출력하는데 A대학 나온사람들을 두 번 출력하게 됨
+
INTERSECT
두 개의 SELECT 쿼리에서 공통으로 나타나는 행만 반환한다. =>교집합
EX)두 부서에서 A 대학을 나온사람들을 출력함.
MINUS
첫 번째 SELECT 쿼리 결과에서 두 번째 SELECT 쿼리 결과에 포함되지 않은 행을 반환한다. =>차집합
EX)두부서에서 한부서(A 대학나온사람 포함)를 제외하고 한부서만 출력함.
💡규칙만 맞으면 의미없는 데이터도 UNION 가능하다->비추천
SELECT EMPLOYEE_ID, FIRST_NAME FROM EMPLOYEES
UNION
SELECT DEPARTMENT_ID, DEPARTMENT_NAME FROM EMPLOYEES;
=>두 SELECT문이 공통된 부분이 없어서 의미없는 데이터
위와 같이 연속되는 칼럼이 있는 테이블을 이용하여 데이터를 출력하려면 두개의 SELECT문을 결합하여 쿼리를 작성해야한다.
SELECT 사번, 이름, 업무시작일, 업무종료일, 담당업무ID, 담당업무
FROM
(
SELECT E.EMPLOYEE_ID 사번,
E.FIRST_NAME ||' '|| E.LAST_NAME 이름,
H.START_DATE 업무시작일,
H.END_DATE 업무종료일,
J.JOB_ID 담당업무ID,
J.JOB_TITLE 담당업무
FROM EMPLOYEES E, JOB_HISTORY H, JOBS J
WHERE E.EMPLOYEE_ID=H.EMPLOYEE_ID AND H.JOB_ID=J.JOB_ID
UNION ALL
SELECT E.EMPLOYEE_ID 사번,
E.FIRST_NAME ||' '|| E.LAST_NAME 이름,
E.HIRE_DATE 업무시작일,
SYSDATE 업무종료일,
E.JOB_ID 담당업무ID,
J.JOB_TITLE 담당업무
FROM EMPLOYEES E, JOBS J
WHERE E.JOB_ID=J.JOB_ID
) T --alias
ORDER BY 사번 ASC, 업무시작일 ASC, 업무종료일 ASC
;
📍위와 같이 연속성을 가지고 있는 데이터가 한 테이블에 함께 있는 것이 아닐 때 유용하게 사용할 수 있다. 또한 SUBQUERY에서는 ORDER BY를 사용할 수 없는데 INLINE VIEW를 사용하면 ORDER BY를 사용해서 정렬할 수 있다.
💡INLINE VIEW를 사용하지 않고도 ORDER BY를 사용할 수는 있으나 가독성이 떨어지고 여러 조합을 다루게 될 경우 복잡해진다.
INLINE VIEW
📍 INLINE VIEW는 SQL 쿼리에서 임시 테이블처럼 작동하는 뷰(View)를 의미한다. 즉, 쿼리의 FROM 절 내에 서브쿼리를 넣어 그 결과를 테이블처럼 사용할 수 있는 구조이다. INLINE VIEW는 특정 데이터 집합을 생성하고, 이를 기반으로 추가적인 쿼리를 수행할 수 있게 해준다.
'SQL' 카테고리의 다른 글
[SQL]WINDOW FUNCTION(윈도우 함수),분석함수(Analytic Function) (0) | 2024.09.04 |
---|---|
[sql] 계층형 쿼리(Hierarchical Query) (0) | 2024.09.04 |
[sql]JOIN, ANSI JOIN (0) | 2024.09.02 |
[sql] 그룹 쿼리 (group query)와 서브쿼리(sub query) (2) | 2024.09.01 |
[SQL] 함수 (1) | 2024.08.30 |