CREATE VIRTUAL TABLE
CREATE VIRTUAL TABLE은 데이터베이스 파일에 저장되는 대신 모듈이 즉석에서 내용을 계산해주는 테이블을 만들어요.
출처: 문서
본문
CREATE VIRTUAL TABLE 문은 내용을 데이터베이스 파일에 저장하는 게 아니라 모듈이 즉석에서 계산하는 테이블을 만들어요. 가상 테이블은 외부 데이터 소스, 커스텀 생성기, 테이블 값 함수 위에 SQL 인터페이스를 제공해요.
문법
CREATE VIRTUAL TABLE [IF NOT EXISTS] [schema-name.]table-name
USING module-name [(module-arguments)];
설명
가상 테이블은 행의 저장과 조회를 모듈에 위임해요. 모듈이 테이블의 컬럼, 반환할 데이터, 그 테이블에 대한 쿼리를 어떻게 최적화할지 결정해요. 가상 테이블은 일반 테이블처럼 SELECT로 조회할 수 있지만, 모듈이 쓰기 지원을 구현하지 않았다면 INSERT, UPDATE, DELETE의 대상이 될 수 없어요.
절
| 절 | 설명 |
|---|---|
IF NOT EXISTS |
같은 이름의 테이블이 이미 존재할 때 생길 오류를 억제해요. |
schema-name |
가상 테이블을 만들 붙은(attached) 데이터베이스 이름. 기본값은 main. |
table-name |
새 가상 테이블의 이름. |
module-name |
가상 테이블 구현을 제공하는 모듈의 이름. |
module-arguments |
모듈에 전달되는 쉼표로 구분된 인수. 이 인수들의 형식과 의미는 모듈마다 달라요. |
사용 가능한 모듈
csv
csv 모듈은 CSV 파일에서 데이터를 읽어서 그 내용을 읽기 전용 테이블로 노출해요. 먼저 load_extension('csv')로 csv 확장을 로드하세요.
| 인수 | 설명 |
|---|---|
filename |
읽을 CSV 파일 경로. |
header |
첫 행에 컬럼 이름이 들어 있으면 yes. 기본값은 no. |
columns |
header가 no일 때 기대할 컬럼 개수. |
schema |
컬럼 이름과 타입을 위한 명시적 CREATE TABLE 스키마. |
generate_series
generate_series 모듈은 정수 값의 계열을 만들어 내는 내장 테이블 값 함수예요. 확장을 로드할 필요가 없어요.
| 인수 | 설명 |
|---|---|
start |
계열의 첫 값 (포함). |
stop |
계열의 마지막 값 (포함). |
step |
값 사이의 증분. 기본값은 1. |
generate_series 모듈은 가상 테이블로도, FROM 절의 테이블 값 함수로도 쓸 수 있어요.
예제
CSV 파일 읽기
-- Load the csv extension
SELECT load_extension('csv');
-- Create a virtual table from a CSV file with a header row
CREATE VIRTUAL TABLE employees USING csv(
filename='employees.csv',
header=yes
);
-- Query the CSV data with SQL
SELECT * FROM employees WHERE department = 'Engineering';
정수 계열 만들기
-- Use generate_series as a table-valued function
SELECT value FROM generate_series(1, 10);
-- value
-- 1
-- 2
-- ...
-- 10
-- Use with a step argument
SELECT value FROM generate_series(0, 100, 10);
-- value
-- 0
-- 10
-- 20
-- ...
-- 100
generate_series로 날짜 계열 만들기
-- Generate dates for the next 7 days
SELECT date('now', '+' || value || ' days') AS day
FROM generate_series(0, 6);