집합 연산자란 두 개의 SELECT 문의 결과를 하나로 응답할 때 사용하는 연산자 입니다.
연산의 결과는 첫 번째 컬럼명을 따르며 OrderBy 는 집합 연산이 마무리 된 후 마지막 한 번만 선언 가능합니다.
| 집합 연산자 | 설명 |
|---|---|
| UNION | 두 SELECT 결과를 합집합처럼 결합하고 중복 제거 |
| UNION ALL | 두 SELECT 결과를 합집합처럼 결합하지만 중복 제거하지 않음 |
| INTERSECT | 두 SELECT 결과의 교집합만 응답 |
| EXPECT 또는 MINUS | 첫 번째 SELECT 결과에서 두 번째 SELECT 결과를 제외한 후 응답 |
계층형 SQL 은 자기 자신의 테이블 ID 를 추가 컬럼으로 갖는 테이블을 의미합니다.
이는 부서원, 매니저와 같이 계층관계를 나타냅니다.
루트 노드의 레벨은 1부터 시작되며 부모 -> 자식 순으로 관계를 맺는것을 순방향 전개라고 합니다.
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT -- 상사의 id (자기 자신을 참조하는 구조)
);
SELECT id, name, manager_id, LEVEL -- LEVEL : 계층 레벨을 표시
FROM employee
START WITH manager_id IS NULL -- 루트 노드 지정
CONNECT BY -- 계층형 SQL 의 조건 설정
PRIOR id = manager_id -- 부모 자식 관계 명시 (PRIOR 부모컬럼 = 자식컬럼)
AND LEVEL > 3 -- 루트 노드는 조건에서 제외 (항상 리턴)
ORDER SIBLINGS BY name; -- 형제 노드끼리 정렬 순서
| id | name | manager_id | level |
|---|---|---|---|
| 1 | CEO | NULL | 1 |
| 2 | Manager | 1 | 2 |
| 3 | Staff1 | 2 | 3 |
| 4 | Staff2 | 2 | 3 |
| 5 | Intern | 3 | 4 |
데이터의 형태를 변환하는데 사용되는 연산자 입니다.
쿼리의 결과를 집계함수로 묶어 행을 열로 변환하여 보여주고자 할 때 이용 됩니다.
SELECT * FROM (<피벗할 쿼리문>)
PIVOT(
<그룹함수(컬럼)> -- new col value
FOR <피벗할 컬럼> IN (항목1, 항목2, 항목3..) -- new col
)
SELECT * FROM (SELECT job, deptno, sal FROM emp)
PIVOT(
SUM(sal)
FOR deptno IN ('10', '20', '30')
)
SELECT job, deptno, sal
FROM pivot_emp
UNPIVOT (
sal FOR deptno IN ('10', '20', '30')
);
-------------------
job | deptno | sal
a | 10 | 2000
a | 20 | 3000
a | 30 | 2000
b | 10 | 3000
b | 20 | 2000
b | 30 | 5000
--------------------
------------------------
job | 10 | 20 | 30
a | 2000 | 3000 | 2000
b | 3000 | 2000 | 5000
------------------------
MERGE INTO문은 특정 키에 대해서 레코드가 있을 때에 수정사항에 대해서 UPDATE를 하고
레코드가 없으면 새롭게 INSERT를 할 수 있는 구문 d입니다.
DELETE 절은 MERGE UPDATE 절로 갱신된 행을 대상으로 수행 됩니다.
MERGE INTO TEST1
USING TEST2
ON (TEST1.COL1 = TEST2.COL1)
WHEN MATCHED THEN
UPDATE SET TEST1.COL3 = 4
WHERE TEST1.COL3 = 2
DELETE WHERE TEST1.COL3 <= 2
WHEN NOT MATCHED
THEN INSERT(TEST1.COL1, TEST1.COL2, TEST1.COL3)
VALUES(TEST2.COL1, TEST2.COL2, TEST2.COL3);