INSERTステートメント
INSERTステートメントは、対象とするテーブルにデータ行(レコード)を追加することのできる、SQLにおけるデータ操作言語 (DML)ステートメントの1つです。
「INSERT [INTO]」に続いて追加するテーブル名を指定し、「VALUES」に続く括弧の中に追加する行の値を記述します。
このとき、値は追加するテーブルの定義通りに記述する必要があります。
文字列型の値を記述する際は「'(シングルクォーテーション)」で囲い、文字列値であることを示します。
NULL値を追加する場合は、NULLと記述することで指定することができますが、NOT NULL指定(NULLを許可しない制約)の列に対して指定した場合、エラーとなります。
また、値の指定はSELECT句にて別テーブル、もしくは同テーブルからWHERE句で記述した条件に該当するレコードの値を指定することができます。
※ SQL Server、MySQLでは「INTO」の記述を省略することができます。
文法
INSERT [INTO] テーブル名 [( 列名[, 列名...] )] { VALUES ( 値[, 値...] ) | SELECT命令 }
列を限定しないINSERT
列名指定を行わない場合、追加するテーブルの定義通りの順番で値を記述します。
使用例
INSERT INTO table_name VALUES ( 20, 'abcd', '2017-09-18 18:59:15.325' )
列を限定したINSERT
列名指定を行った場合、指定した列に対してのみ値を設定し、行を追加することができます。
指定を行わなかった列の値はデフォルト値が定義されている場合は、デフォルト値に、定義されていない場合は、NULL値になります。
列指定の順番は任意ですが、「VALUES」で指定した順番との対応が取れている必要があります。
使用例
例ではtable_name内の列number_column, datetime_column, string_columnに対する値のみを指定し追加します。
table_name内に他の列の定義が存在する場合、それらの値はデフォルト値、もしくはNULLとなります。
INSERT INTO table_name ( number_column, datetime_column, string_column ) VALUES ( 20, '2017-09-18 18:59:15.325', 'abcd' )
デフォルト値のINSERT
デフォルト値を明示的にINSERTする場合、「DEFAULT」と記述することで指定できます。
※ 列にデフォルト値が定義されている場合に限ります。
使用例
datetime_columnをデフォルト値として追加します。
INSERT INTO table_name ( number_column, datetime_column, string_column ) VALUES ( 20, DEFAULT, 'abcd' )
SELECT結果をINSERT
SELECT句を指定することでSELECTで得た結果をそのままテーブルにINSERTすることができます。
使用例1
table_name2より取得したnumber_column, string_column, datetime_columnをtable_name1に追加します。
INSERT INTO table_name1 ( number_column1, string_column1, datetime_column1 ) SELECT number_column2, string_column2, datetime_column2 FROM table_name2
使用例2
table_name2より取得したnumber_columnが100であるレコードのnumber_column, string_column, 現在時刻をtable_name1に追加します。
INSERT INTO table_name1 ( number_column1, string_column1, datetime_column1 ) SELECT number_column2, string_column2, 現在時刻 FROM table_name2 WHERE number_column2 = 100
複数行のINSERT
「VALUES」で指定する値のまとまりをカンマ区切りで指定することによって1度のINSERT文で複数の行を追加することが可能です。
※ Oracleでは「INSERT ALL」を使用する為、この構文は使用できません。
使用例
1回のINSERT命令でtable_nameに2行のレコードを追加します。
INSERT INTO table_name ( number_column, datetime_column, string_column ) VALUES ( 20, '2017-09-18 18:59:15.325', 'abcd' ), ( 30, '2017-09-18 18:59:16.325', 'efgh' )
INSERT ALL
Oracleではより高度なINSERT命令を記述することが可能です。
複数の行を追加する場合、「INSERT ALL」を使用します。
また、「INSERT ALL」では「WHEN」及び「THEN」を利用することにより、条件によって追加先のテーブルを振り分けることが可能です。
使用例1
1回のINSERT命令でtable_nameに2行のレコードを追加します。
INSERTに続けてALLを記述し、「INTO table_name VALUES (20, 'abcd')」と「INTO table_name VALUES (30, 'efgh')」が実際の追加指示となります。
「INSERT ALL」はSELECT命令が必ず必要となる為、例のようにVALUESに値を指定する場合であってもSELECT文を記述します。
INSERT ALL INTO table_name VALUES ( 20, 'abcd' ) INTO table_name VALUES ( 30, 'efgh' ) SELECT * FROM DUAL
使用例2
「INSERT ALL」では、INTO毎にテーブルを指定することができる為、同一テーブルに対してのみではなく、別テーブルに対して行を追加することが可能です。
例では、table_name1のnumber_columnの値によって追加先のテーブルをtable_nameAとtable_nameBとで振り分けています。
INSERT ALL WHEN number_column < 1000 THEN INTO table_nameA ELSE INTO table_nameB SELECT number_column, string_column FROM table_name1