Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLのinsertの構文や、DBMSごとの一括挿入、カラム名記述の省略についてまとめています。

SQL insertの構文

insertはテーブルにレコードを挿入するSQLです。insertの構文は以下の通りです。

INSERT INTO テーブル名 (カラム名,カラム名…) VALUES(値,値…);

以下は、employees(社員)テーブルに、1レコード挿入する例です。

INSERT `employees`(
	`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`
) 
VALUES 
	(
		1, '1982-01-01', 'Taro', 'Yamada', 'M', '2002-04-01'
	)

実行するとこうなります。emp_no=1のレコードが挿入されました。

mysql> select * from employees limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|      1 | 1982-01-01 | Taro       | Yamada    | M      | 2002-04-01 |
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
+--------+------------+------------+-----------+--------+------------+

【関連記事】
MySQL Insert サンプルコード集 一文で一括挿入する方法とは?

DBMSごとのinsertの構文

Oracleのinsertの構文

Oracleでのinsert文の例です。

INSERT INTO purchasing.vendors
VALUES (9016,
       'Secure Systems, Inc.',
       'Jane Secret',
       '454-255-2087',
       '1111 Encryption Way',
       'Hush',
       'MD',
       '00007',
       'discount rates are secret');

Oracleでは複数行の同時insertの書式が他のDBMSとは異なります。各行で異なるテーブルにinsert指定ができるんですね。以下は、日曜~土曜までの売上を一括でinsertする例です。

INSERT ALL
      INTO sales (prod_id, cust_id, time_id, amount)
      VALUES (product_id, customer_id, weekly_start_date, sales_sun)
      INTO sales (prod_id, cust_id, time_id, amount)
      VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)
      INTO sales (prod_id, cust_id, time_id, amount)
      VALUES (product_id, customer_id, weekly_start_date+2, sales_tue)
      INTO sales (prod_id, cust_id, time_id, amount)
      VALUES (product_id, customer_id, weekly_start_date+3, sales_wed)
      INTO sales (prod_id, cust_id, time_id, amount)
      VALUES (product_id, customer_id, weekly_start_date+4, sales_thu)
      INTO sales (prod_id, cust_id, time_id, amount)
      VALUES (product_id, customer_id, weekly_start_date+5, sales_fri)
      INTO sales (prod_id, cust_id, time_id, amount)
      VALUES (product_id, customer_id, weekly_start_date+6, sales_sat);

また、WHENと組み合わせて条件成立時のみinsertを実行することも可能です。

以下は、注文の合計(order_total)の額によって、insert先のテーブル名を変更するSQLです。

INSERT ALL
   WHEN order_total <= 100000 THEN
      INTO small_orders
   WHEN order_total > 1000000 AND order_total <= 200000 THEN
      INTO medium_orders
   WHEN order_total > 200000 THEN
      INTO large_orders
   SELECT order_id, order_total, sales_rep_id, customer_id
      FROM orders;

参考)Oracle公式ドキュメント:INSERT

SQL Serverのinsertの構文

SQL Serverでは、insert文のカラム指定を省略することが可能です。省略した場合、valuesで全てのカラムに対応する値を指定する必要があります。

INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414');  

SQL Serverで複数のレコードを1行でinsertするには以下のように記述します。

INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923');  

SQL Serverでテーブルのカラム列と違う順序で指定するには、以下のように全てのカラム名を記述し、valuesの内容も対応する値を同様の順番で指定します。なお、テーブルの列の順序は、UnitMeasureCode、Name、ModifiedDate です。

INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,  
    ModifiedDate)  
VALUES (N'Square Yards', N'Y2', GETDATE());  

参考)INSERT (Transact-SQL) – SQL Server | Microsoft Docs

MySQLのinsertの構文

MySQLで、複数レコードを同時にinsertするには以下のように記述します。対象テーブルは1つで、挿入するレコードの内容のみ複数指定が可能です。

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5 INSERT 構文

MySQLでは、ON DUPLICATE KEY UPDATE句を指定すると、insert時にすでに値が存在する場合はupdateを実行することが可能です。重複エラー対策が、簡単に記述できるんですね。

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5.3 INSERT … ON DUPLICATE KEY UPDATE 構文

PostgreSQLのinsertの構文

PostgreSQLで、全てデフォルト値の行を挿入するには、以下のように記述します。

INSERT INTO films DEFAULT VALUES;

PostgreSQLの複数行同時insertの構文は以下の通り。指定できるテーブル名は1つで、insert内容のみを複数指定可能です。

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

PostgreSQLの独自拡張RETURNINGは、指定した値をSQLの返り値として返します。以下の例ではdidカラムのデフォルト値を返します。

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

RETURNINGと、列名リスト省略時に一部の列のみを指定できる点は、PostgreSQLの独自拡張です。

参考)PostgreSQL公式ドキュメント:INSERT

まとめ

ポテパンダの一言メモ
  • insertは、レコードを挿入するSQL
  • DBMSによって、複数レコードを1文で挿入する拡張が用意されている
  • DBMSによっては、カラム名の記述は全省略や、一部省略が可能

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。