SELECT 文の結果を別のテーブルへ挿入!INSERT INTO SELECT 文の使いこなし
MySQL INSERT INTO SELECT 文:詳細解説
INSERT INTO SELECT
文は、SELECT 文の結果を基に、別のテーブルへデータを挿入する強力なツールです。1 つのクエリで複数のレコードを挿入したり、複雑なデータ操作を行ったりできます。
構文
INSERT INTO テーブル名 [(列名1, 列名2, ...)]
SELECT 列名1, 列名2, ...
FROM テーブル名 [WHERE 条件];
例:SELECT 文の結果を別のテーブルへ挿入
-- 従業員テーブルから、営業部の従業員のみを "sales_team" テーブルへ挿入
INSERT INTO sales_team (name, department)
SELECT name, department
FROM employees
WHERE department = 'Sales';
詳細解説
INSERT INTO
テーブル名
: データを挿入するテーブルを指定します。(列名1, 列名2, ...)
: 挿入する列をカンマ区切りで指定します。省略時は、SELECT 文のすべての列が挿入されます。
SELECT
列名1, 列名2, ...
: 挿入するデータの列を指定します。WHERE 条件
: 挿入するデータの条件を指定します。
動作
INSERT INTO SELECT
文は、SELECT
文の結果を1行ずつ処理し、INSERT
文を実行します。- 挿入する列の順序は、
SELECT
文の列の順序と一致する必要があります。 - データ型が一致しない場合は、エラーが発生します。
応用例
- 複数のテーブルからデータを結合して、新しいテーブルを作成する。
- 特定の条件を満たすデータを別のテーブルへコピーする。
- データの更新や削除を、
SELECT
文の条件に基づいて行う。
注意点
- 挿入するデータの重複に注意が必要です。
- 主キー制約に違反する場合は、エラーが発生します。
- トランザクション処理を理解しておくと、安全なデータ操作が可能になります。
補足
INSERT INTO SELECT
文は、複雑なデータ操作を簡潔に記述できるため、効率的なデータ管理に役立ちます。- さまざまな条件を組み合わせることで、柔軟なデータ操作が可能になります。
- 構文を理解し、適切なオプションを指定することで、さまざまなニーズに対応できます。
- 上記以外にも、
INSERT INTO SELECT
文には多くのオプションがあります。詳細は、MySQL のリファレンスマニュアルを参照してください。
-- 従業員テーブルと部門テーブルを結合して、"employee_details" テーブルを作成
CREATE TABLE employee_details (
name VARCHAR(255),
department VARCHAR(100),
salary INT
);
INSERT INTO employee_details (name, department, salary)
SELECT e.name, d.department, e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
-- 給与が10万円以上の従業員を "high_salary_employees" テーブルへコピー
CREATE TABLE high_salary_employees (
name VARCHAR(255),
department VARCHAR(100),
salary INT
);
INSERT INTO high_salary_employees (name, department, salary)
SELECT name, department, salary
FROM employees
WHERE salary >= 100000;
-- 給与が5万円以下の従業員の給与を10万円に更新
UPDATE employees
SET salary = 100000
WHERE salary <= 50000;
-- 退職した従業員データを削除
DELETE FROM employees
WHERE department = 'Sales' AND status = '離職';
- 上記のサンプルコードは、あくまでも例です。必要に応じて修正してください。
- 詳細については、MySQL のリファレンスマニュアルを参照してください。
INSERT INTO SELECT 文の代替方法
INSERT 文を複数回実行
INSERT INTO テーブル名 (列名1, 列名2, ...)
VALUES (値1, 値2, ...);
INSERT INTO テーブル名 (列名1, 列名2, ...)
VALUES (値1, 値2, ...);
...
メリット:
- シンプルで分かりやすい
- データ量が多い場合、処理が重くなる
LOAD DATA INFILE 文
LOAD DATA INFILE 'ファイル名'
INTO TABLE テーブル名
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(列名1, 列名2, ...);
- ファイルからデータを効率的に読み込める
- ファイル形式を事前に準備する必要がある
CSV ファイルをインポート
- MySQL Workbench などのツールを使用
- GUI で簡単に操作できる
- ツールの使い方を習得する必要がある
ストアドプロシージャ
CREATE PROCEDURE 挿入手続き名(
IN パラメータ1 型,
IN パラメータ2 型,
...
)
BEGIN
...
INSERT INTO テーブル名 (列名1, 列名2, ...)
VALUES (パラメータ1, パラメータ2, ...);
...
END;
- 複雑な処理をまとめて実行できる
- SQL の知識が必要
mysql sql insert-select