- 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 操作のスキルを上げていってください。
コメント