【SQL】INSERT-SELECTの使い方:サンプル多数あり


このページでは、ORACLEデータベースで、INSERT-SELECTの書き方や使い方を解説していきます。

INSERT-SELECTとは、ある表からSELECTした結果をそのまま別の表にINSERTする方法です。

あるテーブルのデータをコピーしたいときや、テストするためにレコードを増やす場合に使います。

INSERT文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】INSERT文の書き方:サンプル多数あり

INSERT-SELECTの基本構文

INSERT-SELECTの基本的な使い方は次のとおりです。

テーブル1に、テーブル2からSELECTした結果を登録しています。

INSERT INTO テーブル名1 SELECT 列[,列] FROM テーブル名2;

※VALUESを記述するとエラーになります。

具体的な使い方については、SQLサンプルで紹介していきます。

INSERT-SELECTのSQLサンプル

ここからは用途別にSQLのサンプルを使って解説してきます。

1・テーブル定義(カラム)が同じ場合

テーブル定義が同じ場合は、SELECT句に*を使うことが出来ます。

TAB1テーブルとTAB2テーブルのカラムの数やデータ型が一致している場合、SELECT * ~でデータを抽出し、そのまま登録することが出来ます。

INSERT INTO tab1 SELECT * FROM tab2;

2・列を指定する方法

データを抽出するテーブルと登録するテーブルの定義が一致しない場合は、登録先のテーブルに合わせて、列を指定します。

INSERT INTO tab1 SELECT col1,col2,col3 FROM tab2;

3.固定値を登録する方法

INSERT-SELECTでレコードを登録するときに、ある列だけ固定値を登録することができます。

次のサンプルでは、3つ目の項目に’test’という固定値を登録しています。

INSERT INTO tab1 SELECT col1,col2,'test' FROM tab2;

4.NULL値を登録する方法

NULL値を登録したいときは、SELECT句にNULLを指定します。

NULL値はNULL、もしくはnullと記述します。

INSERT INTO tab1 SELECT col1,col2,NULL FROM tab2;

5.関数を使う方法

INSERT-SELECTでは、SELECT句で関数を使うこともできます。

次のSQLのようにMAX,MIN,NVLなど様々な関数を使うことが出来ます。

INSERT INTO tab1 SELECT col1,MAX(col2),MIN(col3),NVL(col4) FROM tab2;

6.WHERE句で条件を指定する方法

INSERT-SELECTするときに、SELECTするデータにWHERE句で条件を指定して、抽出するレコードを絞り込むことが出来ます。

INSERT INTO tab1 SELECT * FROM tab2 WHERE col1 = 'ABC';

7.CASEを使う方法

INSERT-SELECTでCASEを使うことが出来ます。

サンプルでは、SELECT句でCASE式を使って登録する値を条件に合わせて変更しています。

INSERT INTO tab1 
SELECT
    col1
    ,col2
    ,CASE WHEN col1 = 'A' THEN 'AAAA'
          WHEN col1 = 'B' THEN 'BBBB'
          ELSE NULL
     END
FROM
    tab2
WHERE
    col1 = 'ABC';

8.同じテーブルから同じテーブルに登録する方法

INSERT-SELECTでは、同じテーブルにデータを登録することが出来ます。

サンプルのように、SELECTするときに一部の値を変更することや対象データを選択して登録することも出きます。

INSERT INTO tab1 SELECT col1,col2,'test' FROM tab1 WHERE col1 = 'ABC';

9.SELECTの結果が0件の場合

INSERT-SELECTのデータをSELECTした結果が0件の場合には、データが登録されません。

ただし、SQL自体はエラーとならず、0件登録しましたという形で正常終了します。

データが登録されなくてもエラーにならないので、きちんとデータが登録されているかは確認するようにしましょう。

プログラムで実装する場合も注意が必要です。

まとめ

INSERT-SELECTは、INSERTとSELECTの組み合わせなので、かなり自由度にコーディングすることが出来ます。

このほか、INSERT文には様々な書き方があります。
詳しくは「【SQL】INSERT文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。