- SQL の INSERT 文の基本を理解したい!
このような方に向けて書きました。
SELECTに続いて重要なクエリが今回ご紹介するINSERTです。
INSERTはテーブルにデータを追加するクエリになります。
具体例を挙げながら丁寧に解説していきます。
INSERT の基本

テーブルに新しい行を挿入するのがINSERTです。
基本構文は以下の通り。
INSERT INTO テーブル名 (列1, 列2, ...)
VALUES (値1, 値2, ...);| 句 | 効果 |
|---|---|
| INSERT INTO | 挿入先のテーブルを指定 |
| テーブル名 | テーブル名を指定 |
| 列名リスト | 挿入する列名 省略する場合、全列に値を提供する |
| VALUES | 挿入するデータの値を指定 |
特定の列にデータを挿入
以下はemployeesというテーブルに新しいレコードを追加するためのクエリです。
INSERT INTO employees (name, age, department)
VALUES ('John Doe', 30, 'Sales');INSERT INTO employeesとすることで、データ追加先のテーブルを定義しています。
続いて(name, age, department)としているので、name, age, departmentの3つのカラムにデータが入ります。
最後に実際に挿入する値をVALUES ('John Doe', 30, 'Sales')と指定します。
上記を実行することで、employeesテーブルに、以下の新しい従業員が追加されます。
このクエリを実行すると、employeesテーブルに次のような新しいレコードが追加されます:
| name | age | department |
|---|---|---|
| John Doe | 30 | Sales |
すべての列にデータを挿入
以下のクエリもemployeesテーブルに新しいレコードを追加するクエリです。
ただし、先ほどのクエリとは違ってカラムの指定がありません。そのため、全てのカラムに対して値を挿入します。
INSERT INTO employees
VALUES (1, 'John Doe', 30, 'Sales');INSERT INTO employeesでは、employeesテーブルにデータを挿入することを宣言しています。
続いて実際に挿入する値をVALUES (1, 'John Doe', 30, 'Sales')として指定。この場合には、指定された順番でテーブルの全カラムに対して値が挿入されます。
ここでは、列の並びが以下であると仮定します。
- id
- name
- age
- department
クエリ実行により追加されるレコードは以下になります。
| id | name | age | department |
|---|---|---|---|
| 1 | John Doe | 30 | Sales |
ただし、今回の方法では順番だけを頼りにデータをINSERTしていますから、列の並びが違う場合には予期した通りの並びにならない点には注意です。
一つの INSERT 文で複数行を挿入
値の部分には、複数のペアを指定することができます。
INSERT INTO employees (name, age, department)
VALUES ('John Doe', 30, 'Sales'),
('Jane Smith', 25, 'Marketing'),
('Sam Brown', 35, 'IT');構造としては一行ずつ追加していくクエリと同様ですが、追加する値をタプル()で囲う部分が異なります。
クエリ実行により、以下のレコードが順次追加されていきます。
| id | name | age | department |
|---|---|---|---|
| 1 | John Doe | 30 | Sales |
| id | name | age | department |
|---|---|---|---|
| 2 | Jane Smith | 25 | Marketing |
| id | name | age | department |
|---|---|---|---|
| 3 | Sam Brown | 35 | IT |
この方法は一つのINSERTクエリを実行するので、INSERTを3回実行するよりもパフォーマンスが向上します。
別のテーブルからデータを選択して挿入
別テーブルからデータを持ってきて、対象のテーブルに挿入します。
INSERT INTO employees (name, age, department)
SELECT name, age, 'New Department'
FROM old_employees
WHERE department = 'Old Department';つまり、この場合には以下の処理を行なっています。
old_employeesテーブルから特定の条件に一致するレコードを選択- 取得したレコードを
employeesテーブルに挿入
まずINSERT INTO employees (name, age, department)を説明します。
これは最終的に挿入する「先」のテーブルを定義しています。つまり、employeesテーブルにデータを挿入します。
それと同時に、挿入するデータのカラムをタプルで指定しています。ここではname、age、departmentを指定しました。
続いて、SELECT name, age, 'New Department' FROM old_employeesについてです。
これはold_employeesというテーブルのnameとage列をそのまま選択して、departmentカラムには固定値として'New Department'を一律で入れています。
最後にWHERE department = 'Old Department'について解説します。
ここではdepartmentカラムの値が'Old Department'であるレコードが対象になります。
例えばold_employeesテーブルが以下だったとします。
| name | age | department |
|---|---|---|
| John Doe | 30 | Old Department |
| Jane Smith | 25 | Marketing |
| Sam Brown | 35 | Old Department |
クエリ実行後は、以下の状態になります。
| name | age | department |
|---|---|---|
| John Doe | 30 | New Department |
| Sam Brown | 35 | New Department |
INSERT を扱う際の注意点

INSERTはデータを挿入するという操作上、少し気をつけることがあります。
ざっと理解を進めておきましょう。
データ型の扱い
INSERT文では、列と値の型が一致しないとエラーが発生します。
たとえば、列の型が「整数型」なのに「文字列」を挿入するのは NG です。
INSERT INTO employees (name, age)
VALUES ('John Doe', 'thirty'); -- エラー:age列は整数型AUTO_INCREMENT 列について
employeesテーブルの定義が以下だったとします。
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
age INT,
department VARCHAR(255)
);このように定義されたテーブルに対して、以下のINSERT文を実行すると、idカラムは自動的にインクリメントされます。
INSERT INTO employees (name, age, department)
VALUES ('John Doe', 30, 'Sales');例えばこのクエリを実行する前にemployeesテーブルにレコードがない場合には、以下の結果になります・。
| id | name | age | department |
|---|---|---|---|
| 1 | John Doe | 30 | Sales |
さらにレコードを追加します。
INSERT INTO employees (name, age, department)
VALUES ('Jane Smith', 25, 'Marketing');テーブルの内容は次のようになります:
| id | name | age | department |
|---|---|---|---|
| 1 | John Doe | 30 | Sales |
| 2 | Jane Smith | 25 | Marketing |
エラーハンドリング
データベースによっては、挿入時にエラーが発生した場合の処理を制御するオプションが提供されています。
例えば、MySQLではINSERT IGNOREやON DUPLICATE KEY UPDATEなどがそれに当たります。
-- 重複エラーを無視する
INSERT IGNORE INTO employees (id, name, age, department)
VALUES (1, 'John Doe', 30, 'Sales');
-- 重複した場合は更新する
INSERT INTO employees (id, name, age, department)
VALUES (1, 'John Doe', 30, 'Sales')
ON DUPLICATE KEY UPDATE age = 30, department = 'Sales';まとめ:INSERT文を使いこなしてデータの挿入をマスターしよう!

以上で、基本的なINSERT文の解説は以上です。
SELECT文に比べるとバリエーションは少ないので、ごく短期間でマスターできるはずです。
ぜひ本記事を参考に、SQL 操作のスキルを上げていってください。

コメント