MySQLのINSERTステートメントでサブクエリ(SELECT文)を使う方法
MySQLでは、INSERTステートメントの中でSELECT文(サブクエリ)を組み合わせることで、あるテーブルのデータを別のテーブルへ簡単にコピーできます。ここでは、carsテーブルのデータをcopy_carsテーブルに複製する例を使って、具体的な手順を解説します。
1. コピー先テーブルの作成
まず、元のテーブルと同じ構造を持つコピー先のテーブルを作成します。CREATE TABLE ... LIKE構文を使えば、列定義やインデックスを含むテーブル構造をそのまま複製できます。
mysql> CREATE TABLE copy_cars LIKE cars; Query OK, 0 rows affected (0.86 sec) mysql> SELECT * from copy_cars; Empty set (0.08 sec)
この時点で、copy_carsテーブルは構造のみが作成され、データはまだ空の状態です。
2. INSERTとSELECTを組み合わせてデータをコピー
次に、INSERTステートメント内でSELECT文を使用し、carsテーブルの全データをcopy_carsテーブルへ一括挿入します。
mysql> INSERT INTO Copy_cars Select * from Cars; Query OK, 8 rows affected (0.07 sec)
実行結果として「8 rows affected」と表示されており、8件のレコードが正常にコピーされたことがわかります。
3. コピー結果の確認
mysql> SELECT * from copy_cars; +------+--------------+---------+ | ID | Name | Price | +------+--------------+---------+ | 1 | Nexa | 750000 | | 2 | Maruti Swift | 450000 | | 3 | BMW | 4450000 | | 4 | VOLVO | 2250000 | | 5 | Alto | 250000 | | 6 | Skoda | 1250000 | | 7 | Toyota | 2400000 | | 8 | Ford | 1100000 | +------+--------------+---------+ 8 rows in set (0.00 sec)
copy_carsテーブルを参照すると、carsテーブルとまったく同じデータが格納されていることが確認できます。
応用ポイント
INSERT INTO ... SELECT構文は、単純な全件コピーだけでなく、次のような使い方も可能です。
- 条件を絞ったコピー: SELECT文にWHERE句を追加すれば、特定の条件に合致する行だけを挿入できます。
- 特定の列だけをコピー: 列名を明示的に指定することで、必要なカラムのみを転送できます。
- データ変換しながらのコピー: 関数や式を使って、値を加工しながら挿入することもできます。
この構文は、テーブル間のデータ移行やバックアップの作成、集計結果の保存など、さまざまな場面で活用できる非常に便利な手法です。
-
MySQLのテーブルに1つのINSERT文で複数の値をまとめて挿入する方法
単一のINSERT文で複数の値を挿入するとはMySQLでは、複数行のデータを登録する際に、INSERT文を行の数だけ実行する必要はありません。VALUES句の後ろにカンマ区切りで値のセットを並べることで、たった1つのINSERT文で複数のレコード(値の配列)を一度に挿入できます。この方法はSQLの実行回数を減らせるため、大量データの登録時にはパフォーマンス面でも有利になります。それでは、実際の手順を見ていきましょう。手順1:テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable( Client
-
MySQLトリガー(TRIGGER)を使ってテーブルに現在の日付を自動挿入する方法
この記事では、MySQLのトリガー(TRIGGER)を使用して、テーブルに現在の日付(DATE)を自動的に挿入する方法を解説します。INSERT文の実行時に日付を指定しなくても、トリガーによって自動的に現在日付が登録される仕組みを見ていきましょう。 サンプルテーブルの作成 まず、以下のクエリでテーブルを作成します。 mysql> create table DemoTable1584-> (-> DueDate datetime-> );Query OK, 0 rows affected (1.79 sec) ここでは、datetime型の「DueDate」カラムを持つテ