DML Advanced

od·2025년 5월 18일
0

RDB

목록 보기
6/13

집합 연산자

집합 연산자란 두 개의 SELECT 문의 결과를 하나로 응답할 때 사용하는 연산자 입니다.
연산의 결과는 첫 번째 컬럼명을 따르며 OrderBy 는 집합 연산이 마무리 된 후 마지막 한 번만 선언 가능합니다.

집합 연산자설명
UNION두 SELECT 결과를 합집합처럼 결합하고 중복 제거
UNION ALL두 SELECT 결과를 합집합처럼 결합하지만 중복 제거하지 않음
INTERSECT두 SELECT 결과의 교집합만 응답
EXPECT 또는 MINUS첫 번째 SELECT 결과에서 두 번째 SELECT 결과를 제외한 후 응답





계층형 SQL

계층형 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;       -- 형제 노드끼리 정렬 순서
idnamemanager_idlevel
1CEONULL1
2Manager12
3Staff123
4Staff223
5Intern34





PIVOT 절과 UNPIVOT 절

데이터의 형태를 변환하는데 사용되는 연산자 입니다.
쿼리의 결과를 집계함수로 묶어 행을 열로 변환하여 보여주고자 할 때 이용 됩니다.

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

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);




profile
차분하게 단단히 쌓아가는 개발자

0개의 댓글