トップ > SQL入門 > 21章
21章 データ挿入(INSERT)
長い間SELECT構文を学んできましたが、今回からデータ操作のSQLについて学んでいきます。
データを操作するSQL文をDML(Data Manipulate Language)と言います。

DML文にはUPDATE,INSERT,DELETEがあります。

今回はINSERT文について学んでいきましょう。

INSERT文は英語の通り、データ挿入を行うSQL文です。
既存のテーブルに対し、1行を挿入していきます。

では構文を確認していきましょう。
INSERT文の構文は2通りあります。

[構文] 行の挿入(すべての列の挿入)
 INSERT INTO 表名
 VALUES ( 値, 値 …);

1つ目は全ての列に値を挿入する構文の場合、
VALUES句にすべての列の値を記載します。
また指定する値の順番は列の順番の通り指定します。

列の順番の確認方法はDESCRIBEコマンドで確認できます。

  SQL> desc departments
  
   Name                          Null?    Type
   ----------------------------- -------- -------------------
   DEPT_ID                       NOT NULL NUMBER(10)
   DEPT_NAME                              VARCHAR2(30)
   LOC_ID                                 NUMBER(10)

  ※describeコマンドはdescに省略できます。

DEPARTMENTS表にデータを挿入する場合は、
dept_id,dept_name,loc_idの順番となっているので、
VALUES句の値もその順番で指定します。

[構文] 行の挿入 (特定の列の挿入)
 INSERT INTO 表名( 列名, 列名 …)
 VALUES ( 値, 値 …);

次に特定の列に値を指定する場合は、挿入したい列名を表名の後に記載し、
VALUES句に対応する値を指定する方法です。
この場合の注意点は指定した列の数と値の数を同じにする必要があります。


 SQL> INSERT INTO 表名(列名, 列名, 列名)
   2> VALUES (値,値…);

 行1でエラーが発生しました。:
 ORA-00913: 値の個数が多すぎます。
 
 ※挿入する列が3つ、挿入する値が2つであるため、エラーになります
 

また値の種類は3つあります。

数値データ:10
文字データ:'AAAAAA'
日付データ:'DD-MON-RR'

文字データの場合はシングルクォーテーションで囲みます。
日付データの場合も同じくシングルクォーテーションで囲み、
書式はデータベースで設定されている書式の通り記載します。

では、実行例を見ていきましょう。

  SQL> select * from departments;

     DEPT_ID DEPT_NAME                          LOC_ID
  ---------- ------------------------------ ----------
          10 Human Resources                         1
          20 Consulting                              1
          30 Sales                                   2
          40 Engineering                             2
          50 Human Resources                         1
          60 International

  6 rows selected.
  

では、DEPARTMENTS表に行を追加してみましょう。

  SQL> INSERT INTO departments VALUES (100,'DB',3);

  1 row created.
  

上記の例は全ての列へ値を挿入する方法です。
DEPARTMENTS表は3列あるので、VALUES句にも3つ値を指定します。

DEPT_IDに100、DEPT_NAMEに'DB'、LOC_IDに2を指定しています。

  SQL> select * from departments;

     DEPT_ID DEPT_NAME                          LOC_ID
  ---------- ------------------------------ ----------
         100 DB                                      3
          10 Human Resources                         1
          20 Consulting                              1
          30 Sales                                   2
          40 Engineering                             2
          50 Human Resources                         1
          60 International

  7 rows selected.
  

1行追加されました。ちなみにINSERTした行は先頭に表示されますが、
必ずしも先頭とは限りません。表示する順番を統一したい場合は、
ORDER BY句を使用しましょう。

  SQL> INSERT INTO departments (DEPT_ID,DEPT_NAME)
    2> VALUES (120,'ORACLE');

  1 row created.
  

上記例では、特定の列に値を挿入しています。
対象の列はDEPT_IDに120、DEPT_NAMEに'ORACLE'を挿入しています。
指定しなかったLOC_ID列にはNULLが挿入されます。

  SQL> select * from departments;

     DEPT_ID DEPT_NAME                          LOC_ID
  ---------- ------------------------------ ----------
         100 DB                                      3
         120 ORACLE
          10 Human Resources                         1
          20 Consulting                              1
          30 Sales                                   2
          40 Engineering                             2
          50 Human Resources                         1
          60 International

  8 rows selected.
  

LOC_ID列はNULLが挿入されていることが分かりますね。
基本構文は上記の2つの方法で挿入することができます。

続いて、あるテーブルの行を別のテーブルにコピーしたいという場合の構文です。
[構文] 別表からの行コピー
 INSERT INTO 表名
 SELECT 列名, 列名 …
 FROM 表名
 [WHERE 条件式];

上記構文は副問合せから取り出した行を対象の表に追加する方法です。
この構文を使用して、別表から別表で行のコピーを行うことができます。
SELECT文はカッコ不要です。

構文の注意点は基本構文と同じです。
INSERTする表とSELECTする表の列数は同じである必要があります。

[構文] 別表からの行コピー (全列)
INSERT INTO 表名
SELECT 列名, 列名 …

上記の構文の場合は、INSERTする表の列数、
データ型とSELECTする表の列数、データ型は同じである必要があります。

[構文] 別表からの行コピー (指定列のみ)
INSERT INTO 表名 ( 列名, 列名 …)
SELECT 列名, 列名 …

上記構文の場合は対象の列だけINSERTが可能です。
こちらも列数とデータ型は同じである必要があります。
また指定しなかった列にはNULLが挿入されます。

  SQL> INSERT INTO departments (dept_id,dept_name)
    2> SELECT test_id,test_name
    3> FROM test;

  5 row created.
  

上記例はTEST表のtest_id,test_name列の値を
departments表のdept_id,dept_name列に挿入しています。
この時、departments1表の列と、test表の列の数が一致している必要があります。

  SQL> INSERT INTO departments (dept_id,dept_name)
    2> SELECT test_id,test_name
    3> FROM test
    4> WHERE test_id = 30;

  1 row created.
  

上記例では、前回と同様ですが、WHERE句を使用し、
条件に一致した行のみを挿入しています。

以上が行の挿入方法となります。