SELECT INTO ? vs CREATE TABLE AS vs INSERT INTO
SQLiteにおける SELECT INTO ? の解説
SELECT INTO ?
は、SQLiteデータベースで SELECT クエリ結果を 新しいテーブル に挿入するために使用する構文です。既存のテーブルにデータをコピーしたり、新しいテーブルを作成してデータをフィルタリングしたりするのに便利です。
構文
SELECT column_list
INTO new_table_name
FROM table_name
WHERE condition;
パラメータ
- column_list: 新しいテーブルに挿入する列をカンマ区切りで指定します。省略すると、元のテーブルのすべての列が挿入されます。
- new_table_name: 新しいテーブルの名前を指定します。
- WHERE condition: オプションで、挿入する行をフィルタリングするための条件を指定できます。
例
- 既存のテーブル
customers
からname
とemail
列を新しいテーブルcontacts
にコピーする
SELECT name, email
INTO contacts
FROM customers;
customers
テーブルから、country
がJapan
の顧客のみを新しいテーブルjapanese_customers
に挿入する
SELECT *
INTO japanese_customers
FROM customers
WHERE country = 'Japan';
注意事項
- 新しいテーブルは、元のテーブルと同じデータベースに作成されます。
- 新しいテーブルにすでに存在する行は、上書きされます。
SELECT INTO
は、データ型が一致する列のみを挿入します。
サンプルコード1:既存のテーブルから新しいテーブルにデータをコピーする
import sqlite3
# データベースへの接続
connection = sqlite3.connect("database.db")
cursor = connection.cursor()
# 既存のテーブルから新しいテーブルにデータをコピー
query = """
SELECT *
INTO new_table
FROM existing_table;
"""
cursor.execute(query)
# コミット
connection.commit()
# 接続を閉じる
cursor.close()
connection.close()
サンプルコード2:条件に基づいてデータを新しいテーブルに挿入する
import sqlite3
# データベースへの接続
connection = sqlite3.connect("database.db")
cursor = connection.cursor()
# 条件に基づいてデータを新しいテーブルに挿入
query = """
SELECT name, email
INTO filtered_users
FROM users
WHERE age > 18;
"""
cursor.execute(query)
# コミット
connection.commit()
# 接続を閉じる
cursor.close()
connection.close()
サンプルコード3:SELECTクエリ結果を新しいテーブルに挿入する
import sqlite3
# データベースへの接続
connection = sqlite3.connect("database.db")
cursor = connection.cursor()
# SELECTクエリを実行
query = """
SELECT *
FROM users
WHERE country = 'Japan';
"""
results = cursor.fetchall()
# SELECTクエリ結果を新しいテーブルに挿入
query = """
INSERT INTO new_table (name, email, country)
VALUES (?, ?, ?);
"""
for row in results:
cursor.execute(query, row)
# コミット
connection.commit()
# 接続を閉じる
cursor.close()
connection.close()
CREATE TABLE AS 構文
CREATE TABLE new_table AS
SELECT column_list
FROM table_name
WHERE condition;
SELECT INTO ?
と同様の機能を提供しますが、より標準的な構文です。
INSERT INTO 構文
INSERT INTO new_table (column_list)
SELECT column_list
FROM table_name
WHERE condition;
SELECT INTO ?
よりも詳細な制御を提供します。例えば、挿入する列を個別に指定したり、デフォルト値を設定したりできます。
Pythonスクリプト
import sqlite3
# データベースへの接続
connection = sqlite3.connect("database.db")
cursor = connection.cursor()
# SELECTクエリを実行
query = """
SELECT *
FROM users
WHERE country = 'Japan';
"""
results = cursor.fetchall()
# 新しいテーブルを作成
query = """
CREATE TABLE new_table (
name TEXT,
email TEXT,
country TEXT
);
"""
cursor.execute(query)
# SELECTクエリ結果を新しいテーブルに挿入
for row in results:
query = """
INSERT INTO new_table (name, email, country)
VALUES (?, ?, ?);
"""
cursor.execute(query, row)
# コミット
connection.commit()
# 接続を閉じる
cursor.close()
connection.close()
上記は、SELECT INTO ?
の代替方法の例です。それぞれの方法にはメリットとデメリットがあり、状況に応じて最適な方法を選択する必要があります。
SELECT INTO ? の利点
- 簡潔で分かりやすい構文
- 既存のテーブルと同じ構造の新しいテーブルを作成できる
- 詳細な制御ができない
- 標準的な構文ではない
CREATE TABLE AS の利点
- 標準的な構文
- 詳細な制御が可能
- 他の方法より記述量が多い
sql sqlite