[F-Lab 66해빗 페이백 챌린지 ]

[F-Lab 페이백 모각코 55일차] (SQL) SQL 활용

everydeveloper 2023. 9. 9. 23:31

서브쿼리 (Subquery)

  • SELECT 절: 메인 쿼리에서 서브쿼리를 이용하여 특정 값을 조회하는 방법입니다.
  • FROM 절: 서브쿼리를 이용하여 메인 쿼리에서 조회할 데이터를 선택하는 방법입니다.
  • WHERE 절, HAVING 절: 서브쿼리를 이용하여 조건을 만족하는 데이터를 조회하는 방법입니다.
  • 스칼라 서브쿼리(Scalar Subquery): 서브쿼리에서 하나의 값을 반환하는 경우를 말합니다.
  • 인라인 뷰 (Inline View): 서브쿼리를 이용하여 새로운 가상 테이블을 생성하여 메인 쿼리에서 사용하는 방법입니다.
  • 중첩 서브쿼리 (Nested Subquery): 서브쿼리 안에 또 다른 서브쿼리를 중첩하여 사용하는 방법입니다.

뷰 (View)

  • 뷰는 하나 이상의 테이블에서 데이터를 가져와 가상의 테이블을 만드는 기능입니다. 뷰를 이용하면 데이터를 복사하여 새로운 테이블을 만들 필요없이 기존 테이블에서 필요한 데이터를 가져와 사용할 수 있습니다.

집합 연산자

  • 집합 연산자는 두 개 이상의 쿼리 결과를 하나로 합치는 기능을 제공합니다. 다음과 같은 종류가 있습니다.
    • UNION ALL / UNION: 두 쿼리의 결과를 하나의 테이블로 합칩니다. UNION ALL은 중복된 데이터도 모두 합치지만, UNION은 중복된 데이터는 한 번만 합칩니다.
      • UNION ALL: 중복된 데이터도 모두 합칩니다.
      • UNION: 중복된 데이터는 한 번만 합칩니다.
    • INTERSECT: 두 쿼리의 결과에서 공통된 데이터만 추출합니다.
    • MINUS / EXCEPT: 첫 번째 쿼리의 결과에서 두 번째 쿼리의 결과에 포함된 데이터를 제외한 데이터를 추출합니다.

그룹 함수

  • 그룹 함수는 여러 행을 그룹으로 묶어서 집계 결과를 출력하는 함수입니다. 다음과 같은 종류가 있습니다.
    • ROLLUP: 여러 개의 그룹핑 컬럼을 이용하여 집계합니다. ROLLUP을 사용하면 계층적인 집계를 수행할 수 있습니다.
    • CUBE: 여러 개의 그룹핑 컬럼을 이용하여 집계합니다. CUBE를 사용하면 모든 가능한 조합에 대한 집계 결과를 출력할 수 있습니다.
    • GROUPING SETS: 여러 개의 그룹핑 컬럼을 이용하여 집계합니다. GROUPING SETS를 사용하면 여러 개의 그룹핑 컬럼에 대해 서로 다른 집계를 수행할 수 있습니다.
    • GROUPING: ROLLUP, CUBE, GROUPING SETS에서 사용할 수 있는 함수로, 그룹핑 컬럼 중 하나라도 NULL인 경우 1, 그렇지 않은 경우 0을 반환합니다.

윈도우 함수

  • 순위 함수: 데이터를 정렬하고, 데이터의 순위를 반환하는 함수입니다. RANK, DENSE_RANK, ROW_NUMBER 함수가 있습니다.
    • RANK: 데이터의 순위를 반환하며, 같은 값을 가진 데이터는 같은 순위를 가집니다. 순위를 계산한 다음, 다음 순위를 계산합니다.
    • DENSE_RANK: 데이터의 순위를 반환하며, 같은 값을 가진 데이터는 같은 순위를 가집니다. 순위를 계산한 다음, 다음 가능한 순위를 계산합니다.
    • ROW_NUMBER: 데이터의 순서에 따라 순서를 매깁니다. 각 행은 고유한 번호를 가집니다.
  • 윈도우 함수: 데이터를 분석하고, 결과를 반환하는 함수입니다. WINDOW 절에서 OVER 함수와 함께 사용합니다. 윈도우 함수는 데이터를 그룹화하고, 정렬하며, 순위를 매길 수 있습니다.
  • PARTITION BY: 윈도우 함수에서 사용되는 구문으로, 데이터를 그룹화합니다.
  • ORDER BY: 윈도우 함수에서 사용되는 구문으로, 데이터를 정렬합니다. 기본적으로 오름차순으로 정렬됩니다.

집계 함수

  • 다수의 행을 하나의 값으로 집계하는 함수입니다.
    • SUM: 해당 컬럼의 합을 반환합니다.
    • MAX: 해당 컬럼 중 가장 큰 값을 반환합니다.
    • MIN: 해당 컬럼 중 가장 작은 값을 반환합니다.
    • AVG: 해당 컬럼의 평균 값을 반환합니다.
    • COUNT: 해당 컬럼의 행 수를 반환합니다.

위 함수들은 GROUP BY 구문과 함께 사용되어 특정 컬럼의 값을 그룹화하여 집계할 때 사용됩니다.

  • 행 순서 함수
    • FIRST_VALUE: 정렬된 결과에서 가장 처음 값
    • LAST_VALUE: 정렬된 결과에서 가장 마지막 값
    • LAG: 현재 행에서 이전 행의 값을 가져옴
    • LEAD: 현재 행에서 다음 행의 값을 가져옴

행 순서 함수는 정렬된 결과에서 특정 행 앞뒤의 값을 가져오는 함수입니다. FIRST_VALUE와 LAST_VALUE는 정렬된 결과에서 가장 처음값과 가장 마지막 값을 가져옵니다. LAG와 LEAD는 현재 행에서 이전 행 또는 다음 행의 값을 가져올 수 있습니다. 이 함수들은 윈도우 함수와 함께 사용하여 특정 구간의 값을 가져올 때 유용합니다.

비율 함수

  • RATIO_TO_REPORT: 전체 데이터 대비 각 그룹의 비율을 계산하는 함수입니다. 특정 그룹의 값 / 전체 그룹의 값으로 계산됩니다.
  • PERCENT_RANK: 전체 그룹에서 현재 행의 순위를 백분율로 변환한 값을 반환하는 함수입니다. 0부터 1사이의 값을 반환하며, (현재 행의 순위 - 1) / (전체 행 수 - 1)로 계산됩니다.
  • CUME_DIST: 현재 행의 값보다 작거나 같은 값의 누적 비율을 반환하는 함수입니다. 0부터 1사이의 값을 반환하며, 작거나 같은 값의 수 / 전체 행 수로 계산됩니다.
  • NTILE: 전체 그룹을 n개의 그룹으로 나누고, 각 그룹에 대한 번호를 반환하는 함수입니다. n은 사용자가 지정합니다. 전체 그룹이 n으로 나누어 떨어지지 않는 경우, 일부 그룹은 n+1번째 그룹에 포함됩니다.

Top-N 쿼리

  • ROWNUM은 오라클 데이터베이스에서 쿼리에서 반환된 각 행에 고유한 번호를 할당하는 가상 열(pseudocolumn)입니다. 번호는 행이 검색된 순서대로 할당됩니다. ROWNUM은 각 행에 할당되는 순차적인 번호이지만, 행의 영구적인 속성은 아닙니다.
  • 윈도우 함수 순위 함수
    • 윈도우 함수 중 순위 함수는 데이터를 정렬하고, 데이터의 순위를 반환하는 함수입니다.
      • RANK: 데이터의 순위를 반환하며, 같은 값을 가진 데이터는 같은 순위를 가집니다. 순위를 계산한 다음, 다음 순위를 계산합니다.
      • DENSE_RANK: 데이터의 순위를 반환하며, 같은 값을 가진 데이터는 같은 순위를 가집니다. 순위를 계산한 다음, 다음 가능한 순위를 계산합니다.
      • ROW_NUMBER: 데이터의 순서에 따라 순서를 매깁니다. 각 행은 고유한 번호를 가집니다.

셀프 조인 (Self Join)

  • 셀프 조인(Self Join)은 자신과 자신이 포함된 하나의 테이블에서 조인을 수행하는 것을 말합니다. 하나의 테이블에서 다른 두 개의 행을 비교하기 위해 사용됩니다.
  • 예를 들어, 회사의 직원 정보가 있는 테이블에서 직원들의 상사 정보를 조회하고 싶다면, 상사 정보가 저장된 컬럼과 직원 정보가 저장된 컬럼을 조인하여 조회할 수 있습니다. 이때, 상사 정보와 직원 정보가 모두 같은 테이블에 저장되어 있으므로, 셀프 조인을 이용하여 해결할 수 있습니다.
  • 셀프 조인은 테이블의 크기가 크지 않은 경우에는 사용하기 쉽지만, 테이블의 크기가 매우 큰 경우에는 성능 저하의 문제가 있을 수 있습니다. 따라서, 셀프 조인을 사용할 때는 적절한 인덱스를 사용하여 성능을 최적화하는 것이 중요합니다.

계층 쿼리 (난이도 Hard)

  • START WITH PARENT_CATEGORY IS NULL
    • 계층 쿼리의 시작점을 설정하는 부분입니다. 이 경우, PARENT_CATEGORY가 NULL인 레벨 1을 시작점으로 지정합니다.
  • CONNECT BY PRIOR CATEGORY_NAME = PARENT_CATEGORY
    • 계층 구조를 지정하는 부분입니다. PRIOR는 이전 레코드를 가리키는 연산자입니다. 이 경우, CATEGORY_NAME과 PARENT_CATEGORY 간의 계층 구조를 지정합니다.
  • CONNECT BY PRIOR CATEGORY_NAME = PARENT_CATEGORY
    • 계층 구조를 지정하는 부분 중 두 번째입니다. 이 경우, 첫 번째 CONNECT BY PRIOR와 동일한 계층 구조를 지정합니다.