* 순환 관계 모델
- 한 테이블 내 레코드끼리 관계를 갖는 데이터 모델
- 순환 관계 테이블은 셀프 조인을 통해 부모 노드나 자식 노드를 조회할 수 있음
* 계층 쿼리
- START WITH 절과 CONNECT BY 절로 구성됨
WHERE 절 다음에 기술하지만, 실제 실행 순서는 WHERE 절보다 앞섬
START WITH 조건을 만족하는 데이터를 시작으로 CONNECT BY 조건을 만족하는 데이터를 찾은 후
최종적으로 WHERE 조건으로 필터링함
- START WITH 절은 생략 가능함 / PRIOR 연산자는 직전 상위 노드의 값을 반환함
- CONNECT BY 절의 조건은 계층 전개 시 평가되므로 선택되는 하위 노드에 영향을 미침
- CTE (Common Table Expression) 은 WITH 절을 사용함 -> UNION ALL 연산자로 구성됨
UNION ALL 연산자의 상단 쿼리가 START WITH 절, 하단 쿼리가 CONNECT BY 절의 역할을 수행함
UNION ALL 상단에서 얻은 쿼리 집합을 시작으로 하단 쿼리 집합을 시작으로 하단 쿼리에서 WITH 절을
재귀적으로 조인함으로써 START WITH, CONNECT BY 절과 같은 계층구조를 얻을 수 있음
- PIVOT 절은 행을 열로 전환함
- UNPIVOT 절은 열을 행으로 전환함
> INCLUDE NULLS 키워드를 기술하면 UNPIVOT 된 열의 값이 널인 행도 결과에 포함됨 /
기본값은 널을 포함되지 않는 EXCLUDE
* 정규 표현식
- 마침표(.)는 모든 문자, 더하기(+)는 1회 또는 그 이상의 횟수로 일치함을 의미
* INSERT 문
- INSERT 문에 VALUES 절을 사용하면 테이블에 단일 행을 삽입할 수 있음
NULL 허용 컬럼은 선택적으로 값을 입력할 수 있지만,
NOT NULL 컬럼에 값을 입력하지 않으면 에러가 발생함
DEFAULT 가 지정된 컬럼에 값을 입력하지 않으면, 미리 정의한 기본값이 입력됨
* UPDATE 문
- 테이블의 기준 행을 갱신할 수 있음
- UPDATE 문의 SET 절의 서브 쿼리는 SELECT 문의 스칼라 서브 쿼리와 유사하게 동작함
- 예상치 못한 값으로 갱신되는 현상을 방지하기 위해 UPDATE 문에 EXISTS 조건을 추가하거나
MERGE 문을 사용할 수 있음
같은 데이터를 두 번 읽지 않으므로 성능 측면에서는 MERGE 문을 사용하는 것이 바람직함
* NOT IN
- 일치하는 데이터가 하나도 없는지를 확인하는 연산자
- 그런데 NOT IN 서브쿼리가 반환하는 집합에 널이 있으면,
메인 쿼리와 일치하는 데이터가 하나도 없는지, 참/거짓을 확인할 수 없게 됨
- 널을 포함하는 NOT IN 서브 쿼리를 사용하면 항상 공집합을 반환함
서브쿼리와 일치하는 데이터가 하나도 없는지, 참/거짓을 확인할 수 없는 상태이므로
하나도 삭제되지 않음
* 블로킹
- 두 트랜잭션이 동일한 행을 갱신하고자 할 때 후행 트랜잭션은 선행 트랜잭션이 설정한
Lock이 해제되기를 기다리며 블로킹 됨
- 갱신을 마친 선행 트랜잭션이 COMMIT 을 완료하고 나면 비로소 후행 트랜잭션은 Lock을 획득하고 갱신 시작
이 때 UPDATE를 처리하는 방식이 DBMS 마다 다름
> 오라클처럼 MVCC(Multi-Version Concurrency Control) 모델을 사용하는 DBMS는
UPDATE 문이 시작된 시점을 기준으로 갱신 대상을 식별함
만약 대상으로 식별된 레코드 중 UPDATE 문 시작 이후에
조건절 값이 변경된 레코드가 발견되면, 일관성 확보를 위해 UPDATE 문을 재시작함 /
조건절 값이 변경된 레코드가 발견되지 않으면 그대로 UPDATE를 진행함
> SQL Server 처럼 MVCC 모델을 사용하지 않는 DBMS 는 (UPDATE 문 시작 시점이 아니라)
레코드에 도달한 시점을 기준으로 갱신 대상을 식별함
- DDL 문은 암시적으로 COMMIT 을 수행함
'IT > SQL' 카테고리의 다른 글
[MySQL] GROUP BY 사용법 (0) | 2024.03.09 |
---|---|
[MySQL] JSON_TABLE (0) | 2023.09.14 |
SQLD 내용 정리3 (0) | 2021.04.04 |
SQLD 내용 정리2 (0) | 2021.03.28 |
SQLD 내용 정리1 (0) | 2021.03.21 |