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 워크플로를 더욱 단순하게 만들 수 있는 기능에 대한 의견을 언제든 공유해 주기 바란다. 오래된 개에게 새로운 재주를 가르치는 여정에 함께해 보자.
SELECT * EXCLUDE
전통적인 SQL의 SELECT 쿼리는 조회할 컬럼을 명시적으로 지정해야 한다. 예외적으로 사용할 수 있는 것이 * 와일드카드이다. SELECT *는 관련된 모든 컬럼을 반환하도록 한다. 이는 특히 여러 쿼리를 계층적으로 작성할 때 큰 유연성을 제공한다. 하지만 실제로는 대부분의 컬럼이 필요하고 일부 컬럼만 제외하고 싶은 경우가 많다. DuckDB에서는 제외할 컬럼만 지정하면 된다.
SELECT * EXCLUDE (jar_jar_binks, midichlorians)
FROM star_wars;
이제 모든 컬럼을 반복해서 입력하는 시간을 절약할 수 있으며, 코드의 가독성을 높일 수 있고, 원본 테이블에 새로운 컬럼이 추가되더라도 유연성을 유지할 수 있다.
DuckDB의 이 기능은 하나의 쿼리에서 여러 테이블에 대해 각각 다른 컬럼을 제외하는 것도 지원한다.
SELECT
sw.* EXCLUDE (jar_jar_binks, midichlorians),
ff.* EXCLUDE cancellation
FROM star_wars sw, firefly ff;
이처럼 특정 테이블의 모든 컬럼을 선택하면서 일부 컬럼만 제외할 수 있어 복잡한 쿼리를 훨씬 간결하게 작성할 수 있다.
SELECT * REPLACE
마찬가지로, 테이블의 모든 컬럼을 사용하되 일부 컬럼에만 작은 수정을 적용하고 싶은 경우가 자주 있다. 기존 SQL에서는 이렇게 하려면 *를 사용할 수 없으며, 수정되지 않는 컬럼까지 포함하여 모든 컬럼을 일일이 나열해야 한다. DuckDB에서는 REPLACE를 사용하여 소수의 컬럼에만 손쉽게 변경을 적용할 수 있다.
SELECT
* REPLACE (
movie_count + 3 AS movie_count,
show_count * 1000 AS show_count
)
FROM star_wars_owned_by_disney;
이 기능을 사용하면 뷰(View), CTE, 또는 서브쿼리를 매우 간결하게 서로 쌓아 올릴 수 있으며, 기본 테이블에 새로운 컬럼이 추가되더라도 쿼리를 수정할 필요 없이 그대로 활용할 수 있다.
ORDER BY ALL
SQL에서 반복적인 코드를 만들어내는 또 다른 흔한 원인은 ORDER BY 절이다. DuckDB를 비롯한 여러 관계형 데이터베이스는 ORDER BY 1, 2, 3과 같이 컬럼 번호를 사용하여 정렬할 수 있도록 지원함으로써 이 문제를 부분적으로 해결해 왔다. 하지만 실제로는 쿼리 결과의 모든 컬럼을 왼쪽에서 오른쪽 순서대로 정렬하고 싶은 경우가 많으며, 컬럼이 추가되거나 제거될 때마다 숫자 목록을 유지하는 것은 번거롭고 오류가 발생하기 쉽다. DuckDB에서는 단순히 ORDER BY ALL을 사용하면 된다.
SELECT
age,
sum(civility) AS total_civility
FROM star_wars_universe
GROUP BY ALL
ORDER BY ALL;
위 쿼리는 다음과 동일하다.
ORDER BY age, total_civility
이 기능은 특히 요약 테이블을 작성할 때 유용하다. 많은 클라이언트 도구들이 기본적으로 이러한 방식으로 결과를 정렬하기 때문이다.
또한 DuckDB는 모든 컬럼을 내림차순으로 정렬하는 ORDER BY ALL DESC도 지원한다.
ORDER BY ALL DESC
이 외에도 NULLS FIRST와 NULLS LAST 옵션을 함께 사용할 수 있어 NULL 값의 정렬 위치를 제어할 수 있다.
GROUP BY ALL과 마찬가지로 ORDER BY ALL은 반복적인 코드를 줄이고, 컬럼이 추가되거나 제거될 때 발생할 수 있는 실수를 방지하며, 더욱 간결하고 유지보수하기 쉬운 SQL을 작성할 수 있도록 해준다.
'EPL과 유튜브 데이터로 배우는 DuckDB' 카테고리의 다른 글
| DuckDB의 더 친숙한 SQL - Part 3 (0) | 2026.06.06 |
|---|---|
| DuckDB의 더 친숙한 SQL - Part 2 (0) | 2026.06.05 |
| 2026년에 실제로 활용하게 될 DuckDB 확장 기능 (0) | 2026.06.03 |
| DuckDB 속도 비밀: 2026년을 위한 10가지 팁 (0) | 2026.05.31 |
| Python 분석을 강화하는 DuckDB 활용 팁 10가지 (0) | 2026.05.31 |
댓글