DuckDB GUI에서 자주 쓰는 SELECT 문법 규칙
핵심 요약
duckdb에서는 CSV, Parquet, JSON 같은 로컬 파일을 바로 조회하는 기능이 강력함
⇒ 속도, SQL 전용 table을 생성하지 않아도 바로 조회 가능
sql
SELECT * FROM 'data.csv';
SELECT * FROM read_csv('data.csv', all_varchar = true);
SELECT * FROM 'data.parquet';1. 파일을 테이블처럼 직접 SELECT
DuckDB는 파일 경로를 FROM에 바로 사용 가능
sql
SELECT *
FROM 'sales.csv';Parquet도 동일한 구조로 읽음
⇒ 대규모의 데이터의 경우 csv로 읽을 경우 속도가 느려 Parquet 으로 변환추천
sql
SELECT *
FROM 'sales.parquet';여러 파일은 glob(*) 패턴으로 읽을 수 있음
⇒ 여러개의 동일한 헤더를 가진 csv를 별도의 병합 없이 바로 읽을 수 있음.
sql
SELECT *
FROM 'logs/*.csv';하위 폴더까지 포함하려면 다음처럼 가능
sql
SELECT *
FROM 'logs/**/*.csv';/** 과 /*의 차이
sql
FROM 'logs/**/*.csv';
-- /** 은 logs/hello/hello.csv logs/hello.csv 가능
FROM 'logs/*/*.csv';
-- /*은 log/hello/hello.csv 가능 logs/hello.csv 반드시 logs/하위폴더/*.csv의 구조2. read_csv() 테이블 함수
sql
SELECT *
FROM read_csv('sales.csv');
SELECT *
FROM read_csv('sales.csv', auto_detect = true);
-- auto_detect = true : CSV 파일의 구조를 자동으로 추론하게 하는 옵션3. named parameter 문법: 옵션명 = 값
sql
SELECT *
FROM read_csv(
'sales.csv',
delim = ',', -- 구분자를 , 로
header = true, -- 첫줄을 헤더로
all_varchar = true -- 모든 값을 문자로 읽겠다고 선언
);
-- csv 파일 구조를 기반으로 타입을 감지하지 못할 때 아래와 같이 선언 가능
SELECT *
FROM read_csv(
'data.csv',
delim = ',',
header = true,
columns = {
'id': 'BIGINT',
'name': 'VARCHAR',
'created_at': 'DATE'
}
);
주의할 점:
4. all_varchar = true
sql
SELECT *
FROM read_csv('students.csv', all_varchar = true);예시:
sql
SELECT student_id, phone, zip_code
FROM read_csv('students.csv', all_varchar = true);이 옵션은 read_csv()에서 지원되며, COPY 문에는 적용되지 않음.
5. auto_detect = true/false
sql
SELECT *
FROM read_csv('sales.csv', auto_detect = true);sql
SELECT *
FROM read_csv(
'sales.csv',
auto_detect = false,
delim = ',',
header = true,
columns = {
'order_id': 'VARCHAR',
'order_date': 'DATE',
'amount': 'DOUBLE'
}
);6. header = true/false
sql
SELECT *
FROM read_csv('sales.csv', header = true);sql
SELECT *
FROM read_csv('sales_no_header.csv', header = false);sql
SELECT *
FROM read_csv(
'sales_no_header.csv',
header = false,
names = ['order_id', 'order_date', 'amount']
);7. delim, sep, quote, escape
sql
SELECT *
FROM read_csv('sales_pipe.csv', delim = '|', header = true);sql
SELECT *
FROM read_csv('sales_semicolon.csv', sep = ';', header = true);sql
SELECT *
FROM read_csv('sales.csv', quote = '"', escape = '"');8. columns = {...} 구조체 문법
sql
SELECT *
FROM read_csv(
'sales.csv',
columns = {
'order_id': 'VARCHAR',
'order_date': 'DATE',
'amount': 'DECIMAL(12,2)'
}
);9. 오류가 있는 CSV 읽기
sql
SELECT *
FROM read_csv('dirty.csv', ignore_errors = true);sql
SELECT *
FROM read_csv(
'dirty.csv',
store_rejects = true,
rejects_table = 'reject_errors',
rejects_scan = 'reject_scans'
);10. CREATE TABLE AS FROM
sql
CREATE TABLE sales AS
FROM 'sales.csv';sql
CREATE TABLE sales AS
SELECT * FROM 'sales.csv';11. 리스트 리터럴: [...]
sql
SELECT *
FROM read_csv(['sales_jan.csv', 'sales_feb.csv']);select 추천 패턴
CSV 구조를 모를 때
sql
FROM sniff_csv('data.csv');sql
-- 1,000행 정도를 보고 CSV 구조/타입 추론
SELECT *
FROM read_csv('data.csv', sample_size = 1000);
-- 100,000행 정도를 보고 추론
SELECT *
FROM read_csv('data.csv', sample_size = 100000);
-- 전체 파일을 보고 추론
SELECT *
FROM read_csv('data.csv', sample_size = -1);
-- sample_size = -1 CSV 자동 감지에 파일 전체를 사용하라는 의미
-- 다만 파일의 크기가 클 경우 시간이 오래걸림모든 값을 문자로 안전하게 확인할 때
sql
SELECT *
FROM read_csv('data.csv', all_varchar = true);구분자가 특이한 CSV
sql
SELECT *
FROM read_csv('data.psv', delim = '|', header = true);여러 파일을 하나로 읽기
sql
SELECT *
FROM read_csv('data/*.csv', union_by_name = true);원본 파일명까지 추적
sql
SELECT filename, *
FROM read_csv('data/*.csv', union_by_name = true);