본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
EPL과 유튜브 데이터로 배우는 DuckDB

SQL 효율을 높이는 DuckDB 전용 SQL - Part 1

by 아참형인간 2026. 5. 3.

https://2stndard.tistory.com/notice/203

 

[발간예정][EPL과 유튜브로 배우는 DuckDB] 실습 코드와 데이터

EPL과 유튜브 데이터로 배우는 DuckDB에서 사용되는 실습 데이터와 코드를 제공합니다. EPL_DATA&samplefile.zip : 책에서 사용하는 영국 프리미어리그 데이터 셋과 샘플로 사용하는 파일espn.duckdb.zip : 책

2stndard.tistory.com

[DuckDB] 데이터 분석 생산성을 높여주는 SQL 핵심 문법 정리

최근 데이터 분석 및 OLAP 엔진으로 각광받고 있는 DuckDB는 기존 표준 SQL의 번거로움을 해결해주는 강력한 'Syntactic Sugar(편의 문법)'를 제공합니다.


1. EXCLUDE (특정 컬럼 제외하기)

  • DuckDB: SELECT * EXCLUDE (컬럼명)
  • 용도: 수십 개의 컬럼 중 보안이나 불필요한 정보만 쏙 빼고 싶을 때 사용합니다.
FROM teams
SELECT * EXCLUDE (teamId, abbreviation);

2. REPLACE (일부 컬럼 값만 수정하기)

  • DuckDB: SELECT * REPLACE (새로운로직 AS 컬럼명)
  • 용도: 전체 구조는 유지하면서 특정 컬럼의 단위 변환이나 로직 변경이 필요할 때 유용합니다.
FROM teams
SELECT * EXCLUDE (teamId, abbreviation) RENAME (location AS 위치, name AS 이름);

3. DOUBLE COLON (간결한 타입 캐스팅)

  • DuckDB: 컬럼명::데이터타입
  • 용도: CAST 함수를 길게 적지 않아도 되어 쿼리가 간결해집니다.
SELECT strptime('01-march-2025', '%d-%B-%Y')::DATE AS "DATE";

4. SELECT DISTINCT ON (중복 제거의 단순화)

  • DuckDB: SELECT DISTINCT ON (기준컬럼) *
  • 용도: 특정 키값의 첫 번째 행만 가져오고 싶을 때 윈도우 함수 없이 구현 가능합니다.

5. GROUP BY ALL (자동 그룹화)

  • DuckDB: GROUP BY ALL
  • 용도: 집계 함수를 제외한 모든 컬럼을 자동으로 인식하여 그룹화합니다.
FROM fixtures
SELECT seasonType, leagueId, homeTeamId, homeTeamWinner, count(*)
WHERE seasonType = 12654
GROUP BY ALL

6. QUALIFY 절 (윈도우 함수 필터링)

  • DuckDB: QUALIFY 조건식
  • 용도: 윈도우 함수의 결과값에 조건을 걸기 위해 CTE나 서브쿼리를 만들 필요가 없습니다.
FROM k_de_hun
SELECT country, title, COUNT(*) AS "차트 일수"
GROUP BY CUBE (title, country)
HAVING 
    country IN ('US', 'KR')
QUALIFY 
    ROW_NUMBER() OVER (PARTITION BY country ORDER BY "차트 일수" DESC) <= 5;

7. UNION BY NAME (컬럼 이름 기준 결합)

  • DuckDB: UNION ALL BY NAME
  • 용도: 테이블 간 컬럼 순서가 달라도 이름만 같으면 알아서 매칭해줍니다.
(FROM 'D:/book/duckdb/ESPN/playerStats_data/playerStats_2024_UEFA.CHAMPIONS.CSV'
SELECT seasonType, year, league, teamId
LIMIT 5)
UNION ALL BY NAME
(FROM 'D:/book/duckdb/ESPN/playerStats_data/playerStats_2024_UEFA.EURO.CSV'
SELECT teamId, league, year, seasonType, athleteId
LIMIT 5);

댓글