study ../SQLD

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

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


# 다중 칼럼(Multi Column) 서브 쿼리
  * 서브 쿼리의 실행 결과로 여러 칼럼을 반환한다. 메인 쿼리의 조건절에 여러 칼럼을 동시에 비교할 수 있다. 서브 쿼리와 메인 쿼리에서 비교하고자 하는 칼럼 개수와 칼럼의 위치가 동일해야 한다.

# 집합 연산자
  * UNION: 여러 개의 SQL 문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만든다.
  * UNION ALL: 여러 개의 SQL 문의 결과에 대한 합집합으로 중복된 행도 그대로 결과로 표시된다. 즉, 단순히 결과만 합쳐놓은 것이다. 일반적으로 여러 질의 결과가 상호 배타적(Exclusive)일 때 많이 사용한다. 개별 SQL 문의 결과가 서로 중복되지 않는 경우, UNION과 결과가 동일하다. (결과의 정렬 순서에는 차이가 있을 수 있음)
  * INTERSECT: 여러 개의 SQL 문의 결과에 대한 교집합이다. 중복된 행은 하나의 행으로 만든다.
  * EXCEPT: 앞의 SQL 문의 결과에서 뒤의 SQL 문의 결과에 대한 차집합이다. 중복된 행은 하나의 행으로 만든다. (일부 데이터베이스는 MINUS를 사용함)

# 오라클 계층형 질의
  * START WITH 절은 계층 구조의 시작점을 지정하는 구문
  * ORDER SIBLINGS BY 절은 형제 노드 사이에서 정렬을 지정하는 구문
  * 순방향 전개란 부모 노드로부터 자식 노드 방향으로 전개하는 것
  * 루트 노드의 LEVEL 값은 1이다.

# 계층형 질의문
  * SQL Server에서의 계층형 질의문은 CTE(Common Table Expression)를 재귀 호출함으로써 계층 구조를 전개한다.
  * SQL Server에서의 계층형 질의문은 앵커 멤버를 실행하여 기본 결과 집합을 만들고 이후 재귀 멤버를 지속적으로 실행한다.
  * 오라클의 계층형 질의문에서 WHERE 절은 모든 전개를 진행한 이후 필터 조건으로서 조건을 만족하는 데이터만을 추출하는 데 활용된다.
  * 오라클 계층형 질의문에서 PRIOR 키워드는 SELECT, WHERE 절에서도 사용할 수 있다.

# 반환되는 데이터의 형태에 따른 서브 쿼리 분류
  * Single Row 서브 쿼리(단일 행 서브 쿼리): 서브 쿼리의 실행 결과가 항상 1건 이하인 서브 쿼리를 의미한다. 단일 행 서브 쿼리는 단일 행 비교 연산자와 함께 사용된다. 단일 행 비교 연산자에는 =, <, <=, >, >=, <>이 있다.
  * Multi Row 서브 쿼리(다중 행 서브 쿼리): 서브 쿼리의 실행 결과가 여러 건인 서브 쿼리를 의미한다. 다중 행 서브 쿼리는 다중 행 비교 연산자와 함께 사용된다. 다중 행 비교 연산자에는 IN, ALL, ANY, SOME, EXISTS가 있다.
  * Multi Column 서브  쿼리(다중 칼럼 서브 쿼리): 서브 쿼리의 실행 결과로 여러 칼럼을 반환한다. 메인 쿼리의 조건절에 여러 칼럼을 동시에 비교할 수 있다. 서브 쿼리와 메인 쿼리에서 비교하고자 하는 칼럼 개수와 칼럼의 위치가 동일해야 한다.

# 윈도우 함수
  * PERCENT_RANK: 파티션별 윈도우에서 제일 먼저 나오는 것을 0으로, 제일 늦게 나오는 것을 1로 하여, 값이 아닌 행의 순서별 백분율을 구하는 함수
  * DENSE_RANK: 순위를 구하는 함수로 동일한 순위를 하나의 등수로 취급
  * CUME_DIST: 파티션별 윈도우의 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 구하는 함수
  * RANK: 파티션 내의 ORDER BY에 의한 순위를 구하는 함수로, 동일한 순위에 대해서는 동일한 순위를 부여
  * RATIO_TO_REPORT: 파티션 내의 주어진 칼럼 값에 대한 합계와 행별 백분율을 소수점으로 구하는 함수
  * NTILE: 파티션별 전체 건수를 주어진 인자로 N 등분한 결과를 반환
  * PARTITION BY 절과 GROUP BY 절은 의미적으로 유사
  * PARTITION BY 절이 없으면 전체 집합을 하나의 Partition으로 정의한 것과 동일
  * 결과에 대한 함수 처리
  * 윈도위 함수의 적용 범위는 Partition을 넘을 수 없다.

# 서브 쿼리
  * 단일 행 서브 쿼리의 비교 연산자는 다중 행 서브 쿼리의 비교 연산자로 사용할 수  없지만, 반대의 경우는 가능하다.
  * 비 연관 서브 쿼리가 주로 메인 쿼리에 값을 제공하기 위한 목적으로 사용된다.
  * 메인 쿼리의 결과가 서브 쿼리로 제공될 수도 있고, 서브 쿼리의 결과가 메인 쿼리로 제공될 수 있으므로 실행 순서는 상황에 따라 달라진다.

# 뷰
  * 뷰는 단지 정의만을 가지고 있으며, 실행 시점에 질의를 재작성하여 수행한다.
  * 뷰의 장점 중 독립성은 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.
  * 뷰는 보안을 강화하기 위한 목적으로도 활용될 수 있다.
  * 실제 데이터를 저장하고 있는 뷰를 생성하는 기능을 지원하는 DBMS도 있다.

# GRANT와 REVOKE
  * 어떤 사용자가 WITH GRANT OPTION과 함께 권한을 허가받았으면 그 사용자는 해당 권한을 WITH GRANT OPTION 유무와 관계없이 다른 사용자에게 허가할 수 있다.
  * PUBLIC을 사용하면 자신에게 허가된 권한을 모든 사용자들에게 허가할 수 있다.
  * REVOKE 문을 사용하여 권한을 취소하면 권한을 취소당한 사용자가 WITH GRANT OPTION을 통해서 다른 사용자에게 허가했던 권한들도 모두 연쇄적으로 취소된다.
  * REVOKE 문을 사용하여 권한을 취소할 때 그 권한을 허가한 사용자가 권한을 취소할 수 있다.