DML
INSERT
Section titled “INSERT”INSERT INTO orders (customer_name, amount)VALUES ('Alice Smith', 149.99);RETURNING
Section titled “RETURNING”挿入された行から値を返します。
INSERT INTO orders (customer_name, amount)VALUES ('Bob Johnson', 75.50)RETURNING id;
INSERT INTO orders (customer_name, amount)VALUES ('Carol', 200.00)RETURNING *;クエリからのInsert
Section titled “クエリからのInsert”INSERT INTO archive (customer_name, amount)SELECT customer_name, amount FROM orders WHERE status = 'delivered';INSERT … ON CONFLICT(Upsert)
Section titled “INSERT … ON CONFLICT(Upsert)”コンフリクト行をスキップします。
INSERT INTO users (email, name)VALUES ('alice@example.com', 'Alice')ON CONFLICT DO NOTHING;特定のカラムでコンフリクト時に更新します。
INSERT INTO users (email, name)VALUES ('alice@example.com', 'Alice Updated')ON CONFLICT (email) DO UPDATE SET name = 'Alice Updated';RETURNINGと組み合わせできます。
INSERT INTO users (email, name)VALUES ('alice@example.com', 'Alice')ON CONFLICT (email) DO UPDATE SET name = 'Alice'RETURNING *;UPDATE
Section titled “UPDATE”UPDATE orders SET status = 'shipped' WHERE amount > 100;VALUESからの一括更新
Section titled “VALUESからの一括更新”PostgreSQLスタイルのUPDATE ... FROMです。
UPDATE orders SET status = d.status FROM (VALUES ('ord-1', 'shipped'), ('ord-2', 'delivered')) AS d (id, status) WHERE orders.id = d.id;RETURNING付きUPDATE
Section titled “RETURNING付きUPDATE”UPDATE orders SET status = 'shipped'WHERE id = 42RETURNING id, status;DELETE
Section titled “DELETE”DELETE FROM orders WHERE status = 'delivered';DELETE … USING
Section titled “DELETE … USING”他のテーブルをジョインして削除する行を決定します。
DELETE FROM ordersUSING customersWHERE orders.customer_id = customers.id AND customers.status = 'inactive';複数のUSINGテーブル:
DELETE FROM order_itemsUSING products, categoriesWHERE order_items.product_id = products.id AND products.category_id = categories.id AND categories.name = 'discontinued';RETURNING付きDELETE
Section titled “RETURNING付きDELETE”DELETE FROM orders WHERE status = 'delivered'RETURNING *;CSV形式でのデータの一括インポートとエクスポートです。
COPY FROM
Section titled “COPY FROM”CSVファイルから行をインポートします。
COPY orders FROM 'data/orders.csv';COPY orders FROM 'data/orders.csv' WITH (HEADER);COPY orders FROM 'data/orders.csv' WITH (HEADER, DELIMITER '|');COPY orders (customer_name, amount) FROM 'data/partial.csv' WITH (HEADER);COPY TO
Section titled “COPY TO”テーブルまたはクエリをCSVファイルにエクスポートします。
COPY orders TO 'export/orders.csv';COPY orders TO 'export/orders.csv' WITH (HEADER);COPY (SELECT * FROM orders WHERE status = 'pending') TO 'export/pending.csv' WITH (HEADER);| オプション | 説明 |
|---|---|
HEADER | 最初の行はヘッダー(インポート時にスキップ、エクスポート時に書き込み) |
DELIMITER 'c' | フィールド区切り文字(デフォルト:,) |
csv_file() — CSVファイルを直接クエリ
Section titled “csv_file() — CSVファイルを直接クエリ”インポートなしでCSVファイルを仮想テーブルとしてクエリします。
SELECT * FROM csv_file('data/sales.csv');SELECT name, age::int FROM csv_file('data/people.csv') WHERE age::int > 25;すべての値はTEXTとして返されます — キャストするには::typeを使用してください。WHERE、ORDER BY、LIMIT、JOIN、集計をサポートします。
オプション:
csv_file('path') -- ヘッダー付き(デフォルト)csv_file('path', false) -- ヘッダーなし(カラム名はcolumn1, column2, ...)csv_file('path', true, '|') -- カスタムデリミタCSVファイル同士またはデータベーステーブルとのジョイン:
SELECT e.name, d.departmentFROM csv_file('employees.csv') eJOIN csv_file('departments.csv') d ON e.dept_id = d.id;仮想テーブル
Section titled “仮想テーブル”CREATE VIRTUAL TABLEを使用して外部データソースをクエリ可能なテーブルとして登録します。
CREATE VIRTUAL TABLE sales USING csv('data/sales.csv');CREATE VIRTUAL TABLE sales USING csv('data/sales.csv', 'no_header', '|');
SELECT * FROM sales WHERE amount::int > 100;DROP TABLE sales;仮想テーブルはSHOW TABLESに表示され、SELECT、WHERE、JOIN、ORDER BY、集計をサポートします。読み取り専用で、INSERT、UPDATE、DELETEはサポートされていません。
組み込みのcsvモジュールはデフォルトで登録されています。カスタムモジュールはScala APIで登録できます。
db.registerVirtualTableModule("mymodule", new VirtualTableModule { ... })