【SQL】INSERT文の書き方:サンプル多数あり

このページでは、ORACLEデータベースで、表にデータを追加・登録するSQL、INSERT文について紹介します。

INSERT文の基本構文に加えて、たくさんのサンプルを掲載していますのでぜひ参考にしてください。

SQLとは何か?どんな種類があるか基礎的な内容については↓で詳しく解説していますので参考にしてください。
>>【初心者向け】SQLとは?基礎から分かりやすく解説

INSERT文の基本構文

INSERT文の基本的な構文・文法は次の通りです。

INSERT INTO テーブル名(列名) VALUES (値);

さらに、INSERT文は表に存在する全ての列名を記述する書き方や列名を省略する書き方、列の値を省略する書き方があります。

全ての列名を記述する方法

一番シンプルなINSERT文のサンプルになります。

基本構文に習って、テーブル名の後ろに、全てのカラム名を列挙します。列挙したカラムのデータ型と順番に合わせて、VALUESに値をセットします。

INSERT INTO tab1(col1,col2,col3) VALUES('001','test','A');

列名を省略する方法

INSERT文では、登録時に必要なテーブルのカラムがVALUESにセットされている場合に限って、列名を省略できます。

サンプルでは、テーブル名の後ろの列名を省略しています。VALUESには、tab1の全てのカラムに対する値がセットされているので列名を書かなくても問題ありません。

INSERT INTO tab1 VALUES('001','test','A');

列の値を省略する方法

INSERT文では、列の値を省略することもできます。

列の値を省略できるのは、NULLを許容できるカラムのみです。
省略した列には、NULL値が登録されます。

例えば、tab1にcol1,col2,col33というカラムがあるとします。
このとき、col1は主キー、col2はNOTNULL制約、col3はNULL許容のカラムの場合、col3だけが省略可能です。

省略すると次のようなINSERT文になります。

INSERT INTO tab1(col1,col2) VALUES('001','test');

もちろん、列名を省略した形で、列の値を省略することもできます。

INSERT INTO tab1 VALUES('001','test');

INSERT文のSQLサンプル

INSERT文のSQLサンプルをパターンごとに紹介していきます。

表からSELECTして別の表へINSERTする方法

あるテーブルからレコードをSELECTした結果を別のテーブルへINSERTする方法です。

◆テーブル定義(カラム)が同じ場合
 取得元のテーブルと登録先のテーブルのテーブルの定義が同じ場合は、テーブル名の後ろのカラム名を省略し、SELECT句に*で登録が出来ます。

INSERT INTO tab1 SELECT * FROM tab2;

◆列名を指定する場合
 登録するときに列名を指定することもできます。

INSERT INTO tab1(col1,col2)
SELECT col1,col2 FROM tab2;

このようなINSERT-SELECTを行う方法は他にも多数あります。
詳しくは「【SQL】INSERT-SELECTの使い方:サンプル多数あり」で解説していますので参考にしてください。

条件に一致するデータをINSERTする方法

あるテーブルからレコードをSELECTして、別のテーブルへINSERTする際、条件に一致するレコードだけを登録することが出来ます。

次のSQLでは、WHERE句に条件し、COL3列の値が’001’と一致するレコードだけをINSERTで登録しています。

INSERT INTO tab1(col1,col2)
SELECT col1,col2 FROM tab2 WHERE col3 = '001';

この他にも、EXISTSを使って別の表に存在するデータだけをチェックして登録する方法もあります。
詳しくは「【SQL】INSERT文にWHERE条件を付ける方法」で解説していますので参考にしてください。

条件に一致しないデータをINSERTする方法

WHERE句の条件を指定して、条件に一致しないレコードだけを登録することが出来ます。

次のSQLでは、WHERE句に「col3 != ‘001’」と「col4 is not null」という条件を指定しています。

COL1列の値が001でない、かつCOL4の列の値がNULL値でないレコードだけを登録しています。

INSERT INTO tab1(col1,col2)
SELECT
  col1
  ,col2 
FROM
  tab2 
WHERE
  col3 != '001'
  and col4 is not null;

この他にもNOT EXISTSを使う方法もあります。
詳しくは「【SQL】レコードが存在しない場合だけINSERTする方法」で解説していますのでぜひ参考にしてください。

複数のテーブルを結合した結果をINSERTする方法

複数のテーブルを結合してSELECTした結果をINSERTすることもできます。

◆複数のテーブルを結合した結果をINSERTする場合
 サンプルでは、tab2とtab3をINNER JOINで結合してSELECTした結果をINSERTしています。

INSERT INTO tab1(col1,col2)
SELECT a.col1,b.col2 FROM tab2 inner join tab3 on a.col1 = b.col1;

NULL値をINSERTする方法

INSERT文のVALUESでNULLキーワードを指定することで、NULL値を登録することが出来ます。

NULL値をセットできるカラムは、キー項目でないカラム、NOTNULL制約がないカラムだけです。

次のSQLでは、VALUESでNULLキーワードを指定することで、COL3列の値にNULLを登録しています。NULLキーワードは小文字でnullと記述しても構いません。

INSERT INTO tab1(col1,col2,col3) VALUES('001','test',NULL);
INSERT INTO tab1(col1,col2,col3) VALUES('002','test',null);

この他にも列の省略やCASE式の判定結果でNULLを登録することもできます。
詳しくは「【SQL】INSERT文でNULL値を登録する方法」で解説していますのでぜひ参考にしてください。

列の値の変換や固定値を登録する方法

列の値の変換や固定値を登録する方法については、各ページで紹介しておりますのでぜひ参考にしてください。

NULL値の変換
>>【SQL】INSERT文でNULLを置き換えて登録する方法

列の値を空白や0埋めする方法
>>【SQL】INSERTで列の値を空白埋めや0埋めする方法

固定値の登録方法
>>【SQL】INSERTで固定値を登録する方法

複数のテーブルに同時にINSERTする方法

マルチテーブルインサートという書き方をすると、一度に複数のテーブルにデータをINSERTすることが出来ます。

◆マルチテーブルインサート:例1
 INSERT ALLと記述し、その後に、INTO~と記述していきます。

INSERT ALL
 INTO tab1(col1,col2,col3)VALUES('001','test',NULL)
 INTO tab2(col1,col2,col3)VALUES('002','test',null)
SELECT * FROM dual;

◆マルチテーブルインサート:例2
 同じテーブルに複数行のデータを登録することも可能です。

INSERT ALL
 INTO tab1(col1,col2,col3)VALUES('001','test',NULL)
 INTO tab1(col1,col2,col3)VALUES('002','test',null)
SELECT * FROM dual;

現在の日付をDATE型でINSERTする方法

現在の日付をDATE型で登録したい場合には、sysdateを使います。

INSERT INTO tab1(col1,col2,col3) VALUES('001','test',sysdate);

varchar型のデータをINSERTする方法

varchar型のデータを登録するときは、”(シングルクォーテーション)で囲みます。

例えば、testと言う文字を登録したい場合には、’test’と囲んでVALUESに記述します。

INSERT INTO tab1(col1,col2,col3) VALUES('001','test','A');

同じ値や同じデータを登録する方法

INSERT文で同じ値や同じデータを登録する方法や出来る条件や出来ない条件について、別のページで解説していますので参考にしてください。
>>【SQL】同じ値や同じデータのINSERTはできる?

INSERT文のエラー

INSERT文を実行したときのエラーの内容などは別のページにて紹介していますのでぜひ参考にしてください。

・登録対象が0件のとき
>>【SQL】INSERTしたレコードが0件でもエラーにならない

・値の個数が不足しているとき
>>【SQL】INSERTで「値の個数が不足しています」の対処法

・値の個数が多いとき
>>【SQL】INSERTで「値の個数が多すぎます」の対処法

INSERT文を取り消しする方法

INSERT文はトランザクションをコミット(commit)する前であればロールバックで取り消しをすることが出来ます。

詳しくは「【SQL】INSERT文を取り消しする方法」で解説していますのでぜひ参考にしてください。

その他

INSERTとUPDATEを同時に行う方法

ある表から選択したデータが存在しない場合はINSERT、データが存在する場合はUPDATEする方法は、INSERT文ではありません。

UPDATEでもなく、MERGE文という別の更新系のSQLで実装可能です。

INSERT文を自動作成する方法

INSERT文を大量に自動作成する方法はいくつかあります。
詳しくは「【SQL】INSERT文を自動作成する方法:サンプルあり」で解説していますのでぜひ参考にしてください。

まとめ

INSERT文を使うことで、さまざまな方法でデータを登録することが出来ます。

INSERT文の他にも、SELECT文やUPDATE文、DELETE文といったSQLがあり、データの検索や更新、削除を行うことが出来ます。

具体的な書き方や使い方については、↓で詳しく解説していますのでぜひ参考にしてください。
 ・データの検索:【SQL】SELECT文の書き方:サンプル多数あり
 ・データの更新:【SQL】UPDATE文の書き方:サンプル多数あり
 ・データの削除:【SQL】DELETE文の書き方:サンプル多数あり