study ../SQLD

[과목 II. SQL 기본 및 활용] 제2장 SQL 활용: index

wlsekf 2025. 8. 18. 21:19
과목 II. SQL 기본 및 활용
  제2장 SQL 활용
    제1절 서브 쿼리
    제2절 집합 연산자
    제3절 그룹 함수
    제4절 윈도우 함수
    제5절 Top N 쿼리
    제6절 계층형 질의와 셀프 조인
    제7절 PIVOT 절과 UNPIVOT 절
    제8절 정규 표현식


# 일반 집합 연산자를 SQL과 비교
  * UNION 연산은 UNION 기능으로, INTERSECTION 연산은 INTERSECT 기능으로, DIFFERENCE 연산은 EXCEPT(오라클은 MINUS) 기능으로, PRODUCT 연산은 CROSS JOIN 기능으로 구현되었다.

# PRIOR
  * CONNECT BY 절에 사용되며, 현재 읽은 칼럼을 지정한다. PRIOR 자식 = 부모 형태를 사용하면 계층 구조에서 부모 데이터에서 자식 데이터(부모 → 자식) 방향으로 전개하는 순방향 전개를 한다. 그리고 PRIOR 부모 = 자식 형태를 사용하면 반대로 자식 데이터에서 부모 데이터(자식 → 부모) 방향으로 전개하는 역방향 전개를 한다.

# START WITH 절
  * 계층 구조 전개의 시작 위치를 지정하는 구문이다. 즉, 루트 데이터를 지정한다. (액세스)

# ORDER SIBLINGS BY
  * 형제 노드(동일 LEVEL) 사이에서 정렬을 수행한다.

# 계층형 질의(Hierarchical Query)
  * 테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 계층형 질의(Hierarchical Query)를 사용한다. 계층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다.

# 셀프 조인(Self Join)
  * 동일 테이블 사이의 조인을 말한다. 따라서 FROM 절에 동일 테이블이 두 번 이상 나타난다. 동일 테이블 사이의 조인을 수행하면 테이블과 칼럼 이름이 모두 동일하기 때문에 식별을 위해 반드시 테이블 별칭(Alias)를 사용해야 한다.

# 셀프 조인(Self Join) 문장
  * SELECT ALIAS명1.칼럼명, ALIAS명2.칼럼명, ... FROM 테이블 ALIAS명1, 테이블 ALIAS명2 WHERE ALIAS명1.칼럼명2 = ALIAS명2.칼럼명1;

# 서브 쿼리를 사용할 때 주의사항
  * 서브 쿼리를 괄호로 감싸서 사용한다.
  * 서브 쿼리는 단일 행(Single Row) 또는 복수 행(Multiple Row) 비교 연산자와 함께 사용 가능하다. 단일 행 비교 연산자는 서브 쿼리의 결과가 반드시 1건 이하어야 하고 복수 행 비교 연산자는 서브 쿼리의 결과 건수와 상관없다.
  * 서브 쿼리에서는 ORDER BY 절을 사용하지 못한다. SELECT 절에서 오직 한 개만 올 수 있기 때문에 ORDER BY 절은 메인 쿼리의 마지막 문장에 위치해야 한다.

# 인라인 뷰(Inline View)
  * FROM 절에서 사용되는 서브 쿼리를 인라인 뷰(Inline View)라고 한다. 서브 쿼리의 결과가 마치 실행 시에 동적으로 생성된 테이블인 것처럼 사용할 수 있다. 인라인 뷰는 SQL 문이 실행될 때만 임시적으로 생성되는 동적인 뷰이기 때문에 데이터베이스게 해당 정보가 저장되지 않는다.

# 뷰 사용의 장섬
  * 독립성: 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.
  * 편리성: 복잡한 질의를 뷰로 생성하여 관련 질의를 단순하게 작성할 수 있다. 또한 해당 형태의 SQL을 자주 사용할 때 뷰를 이용하면 편리하게 사용할 수 있다.
  * 보안성: 직원의 급여 정보와 같이 숨기고 싶은 정보가 존재한다면, 뷰를 생성할 때 해당 칼럼을 빼고 생성하여 사용자에게 정보를 감출 수 있다.

# Grouping Columns
  * 가질 수 있는 모든 경우에 대하여 Subtotal을 생성해야 하는 경우에는 CUBE를 사용하는 것이 바람직하나, ROLLUP에 비해 시스템에 많은 부담을 주므로 사용에 주의해야 한다.

# CUBE
  * 결합 가능한 모든 값에 대하여 다차원 집계를 생성한다. CUBE도 결과에 대한 정렬이 필요한 경우는 ORDER BY 절에 명시적으로 정렬 칼럼이 표시되어야 한다.

# GROUPING SETS
  * 다양한 소계 집합을 만들 수 있는데, GROUPING SETS에 표시된 인수들에 대한 개별 집계를 구할 수 있으며, 이때 표시된 인수들 간에는 계층 구조인 ROLLUP과는 달리 평등한 관계이므로 인수의 순서가 바뀌어도 결과는 같다. 그리고 GROUPING SETS 함수도 결과에 대한 정렬이 필요한 경우는 ORDER BY 절에 명시적으로 정렬 칼럼이 표시되어야 한다.

# RANK 함수
  * ORDER BY를 포함한 QUERY 문에서 특정 항목(칼럼)에 대한 순위를 구하는 함수이며 동일한 값에 대해서는 동일한 순위를 부여한다.

# DENSE_RANK 함수
  * RANK 함수와 흡사하나, 동일한 순위를 하나의 건수를 취급하는 것이 다른 점이다.

# ROW_NUMBER 함수
  * RANK나 DENSE_RANK 함수가 동일한 값에 대해서는 동일한 순위를 부여하는데 반해, 동일한 값이라도 고유한 순위를 부여한다.

# LAG 함수
  * 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있다. 이후 몇 번째 행의 값을 가져오는 것은 LEAD 함수이며, SQL Server에서는 지원하지 않는 함수이다.