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

DuckDB의 더 친숙한 SQL - Part 2

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

https://aladin.kr/p/MSt8I

 

LUVIT♥ EPL과 유튜브 데이터로 배우는 DuckDB | 이기준

DuckDB를 활용한 SQL 기반 데이터 분석 입문서다. SQL 기초부터 고급 활용, 파이썬 연동, 데이터 시각화와 대시보드 제작까지 단계적으로 학습할 수 있다. EPL 데이터, 유튜브 트렌드, 「케이팝 데몬

www.aladin.co.kr

요약: DuckDB는 SQL 문법에 여러 확장 기능을 제공한다. 이러한 기능의 전체 목록은 Friendly SQL 문서 페이지에서 확인할 수 있다.

 

우아한 사용자 경험은 DuckDB의 핵심 설계 목표 중 하나이다. 이 목표는 DuckDB 아키텍처의 많은 부분을 이끌고 있다. DuckDB는 설치가 간단하고, Pandas, Arrow, R DataFrame과 같은 다른 데이터 구조와 자연스럽게 통합되며, 별도의 의존성이 필요하지 않다. 병렬 처리는 자동으로 수행되며, 계산 과정에서 사용 가능한 메모리를 초과하는 경우 데이터는 디스크로 원활하게 버퍼링된다. 물론 DuckDB의 뛰어난 처리 속도는 더 많은 작업을 더 쉽게 수행할 수 있도록 해준다.

 

하지만 SQL은 사용자 친화적인 언어로 유명하지는 않다. DuckDB는 이를 바꾸고자 한다. DuckDB는 데이터프레임 스타일의 연산을 위한 Relational API와 PostgreSQL과 높은 호환성을 갖춘 SQL을 모두 제공한다. 데이터프레임 스타일의 연산을 선호한다면 DuckDB의 로드맵에 대한 의견을 들려주기를 바란다. SQL을 선호한다면, DuckDB가 혁신과 실용성을 어떻게 결합하여 다른 어떤 곳보다도 SQL을 쉽게 작성할 수 있도록 만드는지 계속 살펴보기 바란다. GitHub 또는 Discord를 통해 SQL 워크플로를 더욱 단순하게 만들 수 있는 기능에 대한 의견을 언제든 공유해 주기 바란다. 오래된 개에게 새로운 재주를 가르치는 여정에 함께해 보자.

WHERE / GROUP BY / HAVING 절에서 컬럼 별칭 사용

많은 SQL 방언에서는 SELECT 절에서 정의한 별칭(alias)을 같은 쿼리 내에서 ORDER BY를 제외한 다른 절에서는 사용할 수 없다. 이 때문에 별칭을 활용하기 위해 불필요하게 장황한 CTE나 서브쿼리를 작성해야 하는 경우가 많다.

DuckDB에서는 SELECT 절에서 정의한 비집계(non-aggregate) 별칭을 같은 쿼리 수준에서 바로 WHERE 절과 GROUP BY 절에서 사용할 수 있다. 또한 집계 함수의 별칭은 HAVING 절에서 사용할 수 있다. 별도의 서브쿼리는 필요하지 않다.

SELECT
    only_imperial_storm_troopers_are_so_precise AS nope,
    turns_out_a_parsec_is_a_distance AS very_speedy,
    sum(mistakes) AS total_oops
FROM oops
WHERE
    nope = 1
GROUP BY
    nope,
    very_speedy
HAVING
    total_oops > 0;

대소문자를 유지하면서 대소문자 구분 없이 사용하기

DuckDB는 쿼리 작성 시 대소문자를 구분하지 않으면서도, 데이터가 시스템에 저장되고 외부로 전달될 때는 원래 지정된 대소문자를 그대로 유지한다.

이를 통해 DuckDB 내부에서는 쿼리를 더욱 간편하게 작성할 수 있으며, 외부 라이브러리와의 호환성도 유지할 수 있다.

CREATE TABLE mandalorian AS
SELECT 1 AS "THIS_IS_THE_WAY";

SELECT this_is_the_way FROM mandalorian;

결과:

THIS_IS_THE_WAY
1

친절한 오류 메시지

아무리 숙련된 사용자라도 SQL을 작성하다 보면 실수를 하기 마련이다. 많은 관계형 데이터베이스에서는 오류 원인을 스스로 찾아야 하는 경우가 많다.

DuckDB에서는 테이블 이름이나 컬럼 이름을 잘못 입력하면 가장 유사한 이름을 추천해 준다. 또한 오류가 발생한 위치를 화살표(^)로 정확하게 표시해 준다.

SELECT * FROM star_trek;

오류 메시지:

Error: Catalog Error: Table with name star_trek does not exist!
Did you mean "star_wars"?
LINE 1: SELECT * FROM star_trek;
                      ^

(걱정하지 않아도 된다. 오리와 오리 테마 데이터베이스도 스타트렉을 좋아한다.)

DuckDB의 추천 기능은 상황에 따라 달라진다. 아래 예제에서는 현재 조회 중인 테이블에서 가장 유사한 컬럼명을 추천해 준다.

SELECT long_ago FROM star_wars;

오류 메시지:

Error: Binder Error: Referenced column "long_ago" not found in FROM clause!
Candidate bindings: "star_wars.long_long_ago"
LINE 1: SELECT long_ago FROM star_wars;
               ^

이처럼 DuckDB는 단순히 오류를 보고하는 데 그치지 않고, 사용자가 문제를 빠르게 해결할 수 있도록 구체적인 힌트를 제공한다.

 

<출처: https://duckdb.org/2022/05/04/friendlier-sql>

댓글