新しい表を作成した時点では、その表には何もデータが含まれていません。 表に新しい行を挿入するには、INSERT ステートメントを使います。 このステートメントには、次の 2 種類の形式があります。
全選択とは、 INSERT または CREATE VIEW ステートメントの中で、 または述部の後で使われている SELECT ステートメントのことです。 括弧で囲まれている全選択は、 一般に副照会 と呼ばれます。
表作成時に選んだデフォルト・オプションに応じて、 挿入するどの行についても、 列ごとに値を指定するか省略時値を受け入れるかのどちらかになります。 さまざまなデータ・タイプの省略時値については、 SQL 解説書 を参照してください。
次のステートメントでは、VALUES 文節を 使って、PERS 表に 1 行分のデータを挿入しています。
INSERT INTO PERS VALUES (12, 'Harris', 20, 'Sales', 5, 18000, 1000, '1950-1-1')
次のステートメントでは、VALUES 文節を使って、ID、NAME、 および JOB しかわかっていない 3 行を PERS 表に挿入しています。 列が NOT NULL として定義されており、その列に省略時値がないなら、 その列には必ず値を指定しなければなりません。
CREATE TABLE ステートメントの列定義の中の NOT NULL 文節には、 WITH DEFAULT 句を指定できます。 列が NOT NULL WITH DEFAULT として定義されているか、 または WITH DEFAULT 10 のように定数の省略時値が指定されている場合、 列リストの中にその列を指定しないなら、 挿入する行のその列には省略時値が挿入されます。 たとえば、CREATE TABLE ステートメントにおいて、DEPT 列についてのみ省略時値が指定されており、 それが 10 だったとします。 その場合、部署番号 (DEPT) は 10 に設定され、 明示的に値を指定するその他のすべての列は NULL に設定されます。
INSERT INTO PERS (NAME, JOB, ID) VALUES ('Swagerman', 'Prgmr', 500), ('Limoges', 'Prgmr', 510), ('Li', 'Prgmr', 520)
ここまでの挿入結果は、 次のステートメントによって調べることができます。
SELECT * FROM PERS ID NAME DEPT JOB YEARS SALARY COMM BIRTH_DATE ------ --------- ------ ----- ------ --------- --------- ---------- 12 Harris 20 Sales 5 18000.00 1000.00 01/01/1950 500 Swagerman 10 Prgmr - - - - 510 Limoges 10 Prgmr - - - - 520 Li 10 Prgmr - - - -
この場合は、すべての列に値が指定されたわけではありませんでした。 NULL 値はダッシュ (-) として表示されています。 これが機能するためには、列名のリストが、 順序の点でもデータ・タイプの点でも、VALUES 文節に指定されている値に対応していなければなりません。 最初の例の場合のように列名のリストを省略する場合、 VALUES の後のデータ値のリストの順序は挿入先の表の列の順序と同じでなければならず、 値数は表の列数と同じでなければなりません。
どの値も、挿入先の列のデータ・タイプとそれぞれ互換性のあるものでなければなりません。 NULL 可能として定義されている列の値が指定されていないなら、 挿入される行のその列の値は NULL になります。
次の例では、 行の中の YEARS、COMM、および BIRTH_DATE 列に値が指定されていないため、 それらの列に NULL 値が挿入されます。
INSERT INTO PERS (ID, NAME, JOB, DEPT, SALARY) VALUES (410, 'Perna', 'Sales', 20, 20000)
INSERT ステートメントの第 2 の形式は、 別の表の行の値を使って表にデータを入れる場合にたいへん便利なものです。 前述のように、 この場合には VALUES を使わず、全選択を指定して、 他の表や視点に含まれている行から選んだ列を指定します。
次の例では、 STAFF 表から部署 38 のメンバーのデータを選択し、 それを PERS 表に挿入しています。
INSERT INTO PERS (ID, NAME, DEPT, JOB, YEARS, SALARY) SELECT ID, NAME, DEPT, JOB, YEARS, SALARY FROM STAFF WHERE DEPT = 38
この挿入操作を実行した後で次の SELECT ステートメントを実行すると、 その結果は INSERT ステートメントの全選択と同じになります。
SELECT ID, NAME, DEPT, JOB, YEARS, SALARY FROM PERS WHERE DEPT = 38
結果は、次のとおりです。
ID NAME DEPT JOB YEARS SALARY ------ --------- ------ ----- ------ --------- 30 Marenghi 38 Mgr 5 17506.75 40 O'Brien 38 Sales 6 18006.00 60 Quigley 38 Sales - 16808.30 120 Naughton 38 Clerk - 12954.75 180 Abrahams 38 Clerk 3 12009.75