[TIL] SQL - Array & Struct

한울·2025년 12월 22일

Core Concept

배열과 구조체

  • 배열

    • 같은 타입의 값이 여러 개 들어 있는 자료구조

    • 중첩 가능하다.

      • event_params에 해당
  • 구조체

    • 관련 있는 값들을 하나의 덩어리로 묶은 것

    • key-value 쌍을 하나의 묶음으로 다룬다.

    • 중첩 가능하다.

      • event_paramskey, value에 해당

왜 등장하게 되었는가?

  • 기존 테이블(관계형 데이터베이스)의 구조

    • 기본적으로 한 행에 하나의 값만 저장한다.
  • 기존 테이블의 한계

    • 실제로는 하나의 대상에 여러 값이 동시에 연결되는 경우가 많다.

    • 예시

      • 한 이벤트에 여러 개의 속성
      • 하나의 주문에 여러 개의 상품
    • 기존 테이블 구조라면, 행을 늘려서 동일한 데이터를 반복 저장하거나, 정규화로 테이블을 분리한 뒤 JOIN해야 한다.

    • 이럴 경우, 다음과 같은 단점이 존재한다.

      • 데이터가 흩어진다.
      • 쿼리가 복잡해진다.
      • JOIN 비용이 발생한다.

UNNEST

  • 배열을 여러 행으로 펼치는 과정
  • 기존 테이블의 각 행과 결합하기 위해 CROSS JOIN을 사용한다.
SELECT
  title,
  unnested_genres
FROM
  advanced.array_exercises
CROSS JOIN
  UNNEST(genres) AS unnested_genres

Confusing Points

ARRAY + UNNEST

  • 오류 코드
SELECT
  title,
  actor
FROM
  advanced.array_exercises
CROSS JOIN
  UNNEST(actors.actor) AS actor

Cannot access field actor on a value with type ARRAY<STRUCT<actor STRING, character STRING>> at [7:17]

  • ARRAY<STRUCT<...>> 구조에서 배열을 먼저 UNNEST 하지 않고, 내부 필드(actors.actor)에 바로 접근하려 해서 오류가 발생했다.

  • actors는 배열이고, actor, character는 배열 원소의 필드(STRUCT)이다.

  • 수정 후 코드

SELECT
  title,
  a.actor,
  a.character
FROM
  advanced.array_exercises
CROSS JOIN
  UNNEST(actors) AS a

느낀 점

SQL에서도 자료구조가 존재한다는 걸 오늘 처음 알았다. 하나의 이벤트에 여러 속성이 존재하는 로그 데이터 특성을 고려했을 때, 로그 데이터 분석에 많이 쓰이는 이유를 알 거 같다. 다만 아직 문법이 익숙하지 않아 꾸준히 연습해야 할 거 같다.

profile
데이터 공부

0개의 댓글