【SQL】INSERT文を使ってデータを追加する方法を解説

  • 2024.08.16
       
【SQL】INSERT文を使ってデータを追加する方法を解説

SQLのINSERT文は、データベースにデータを挿入するのに使用するクエリです。本記事では、INSERT文の基本的な使い方からCASE式やJOIN句との併用方法を中心に解説します。ぜひ参考にしてください。

INSERT文とは

SQLのINSERT文は、データベースのテーブルに新しいレコードを挿入するクエリです。挿入するデータの内容としては固定値のみならず、ほかのテーブルからデータを引っ張ってきたり、CASE式で分岐処理を行った値やJOIN句でテーブル結合した結果を挿入する方法など、さまざまな方法があります。

【基本構文】

INSERT文の基本的な構文は、データを挿入するテーブルを指定し、続けて各カラム名とそれに対応するデータの値を指定します。

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

テーブル名のあとにカッコで、カラム1, カラム2…とカラム名をカンマで区切って並べます。そして、VALUESのあとのカッコに、各カラムに登録する値を同様に並べます。なお、この際カラム名と値のカラム数を一致させる必要があります。

あなたのご希望に沿った案件が必ず見つかります
【フリーランス向け】高収入好待遇の案件をご紹介

TECH MANIA フリーランス

≫まずは簡単60秒で無料お問い合わせから≪

INSERT文の使い方

INSERT文の具体的な使い方を解説していくにあたって、サンプルとして「テスト(test)」テーブルを用意しました。

「テスト(test)」テーブル

ID(id)氏名(name)性別(gender)点数(point)
1001秋山80
1002久保田100
1003佐々木65
1004佐藤75

単一レコードの追加

ここに、新たに鈴木さんのレコードを追加します。この場合、以下のようなINSERT文になります。

【実行コード】

INSERT INTO test (id,name,gender,point) 
VALUES (1005,'鈴木','女',60);

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山80
1002久保田100
1003佐々木65
1004佐藤75
1005鈴木60

鈴木さんのレコードが追加されました。

複数のレコードを一度に追加

一つのSQL文で、複数のレコードをテーブルに追加することもできます。

【実行コード】

INSERT INTO test (id,name,gender,point) 
VALUES (1006,'田中','男',90),(1007,'土屋','女',55);

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山80
1002久保田100
1003佐々木65
1004佐藤75
1005鈴木60
1006田中90
1007土屋55

田中さんと土屋さんのレコードが追加されました。

カラム名は省略できる

次のように、カラム名は省略することもできます。

【実行コード】

INSERT INTO test
VALUES (1005,'鈴木','女',60);

この場合、値を記述する順序がテーブルのカラムと一致している必要があります。

ただし、テーブルの構造が変わった場合やカラムの順序を間違えた場合はデータを正しく挿入できないケースがあります。そのため、カラム名を明示することが推奨されています。

INSERTするデータを別のテーブルから取得する

INSERT文では、挿入する値を直接入力しますが、サブクエリ(副問合せ)としてSELECT句を使用することで、別のテーブルから取得したデータをテーブルに挿入することができます。

例として、先ほどのテスト(test)テーブルから、点数(point)が60点未満の生徒のレコードを新しいテーブル「再テスト(retest)」テーブルに追加します。

「テスト(test)」テーブル

ID(id)氏名(name)性別(gender)点数(point)
1001秋山80
1002久保田100
1003佐々木65
1004佐藤75
1005鈴木60
1006田中90
1007土屋55

【実行コード】

INSERT INTO retest (id,name,gender,point)
SELECT id,name,gender,point
FROM test
WHERE point < 60;

クエリ内の WHERE句で「WHERE point < 60」という条件を設定しています。この指定によって、testテーブルからpointカラムの値が60点未満に該当するレコードのみが抽出されます。

WHERE句は、特定の条件下でのデータの絞り込みに使用されます。詳しくは、当ブログの【SQL入門1】WHEREで検索条件を指定する方法を解説で、WHEREの基本を詳しく解説しています。ぜひ参考にしてください。

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1007土屋55

60点未満の生徒のデータだけが抽出され、新しいテーブルに登録されました。

DEFAULT値を使ったINSERT文

DEFAULT値とは、データベーステーブルの設計時に、各カラムに予め設定できるデフォルト値を指します。この値は、INSERT文で該当のカラムに明示的な値が提供されなかった場合に使用されます。これにより、すべてのデータを都度入力することなく、デフォルト値でデータを挿入できます。

テスト(test)テーブルで、点数(point)カラムのデフォルト値を「-」として設定します。

【実行コード】

CREATE TABLE test(
 id INT AUTO_INCREMENT PRIMARY KEY,
 name VARCHAR(50) NOT NULL,
 gender VARCHAR(10) DEFAULT -,
 point INT NOT NULL
);

上記のテーブル定義の「gender VARCHAR(10) DEFAULT -」部分があることで、性別(gender)カラムに特定の値を指定しない場合、「-」と自動で挿入されるようになります。

次に、新しい生徒のデータを挿入しますが、性別(gender)は指定せず、デフォルトの値を使用します。

【実行コード】

INSERT INTO test (id,name,point)
VALUES (1008,'野村',70);

上記のINSERT文では、性別(gender)についての指定がないため、デフォルトの値である「-」が表示されます。

【実行結果】

ID(id)氏名(name)性別(gender)点数(point)
1001秋山80
1002久保田100
1003佐々木65
1004佐藤75
1005鈴木60
1006田中90
1007土屋55
1008野村70

CASE式との併用

CASE式は条件分岐処理を行うクエリで、データごとに指定条件にあてはまるかを判定し、判定結果に応じて異なる処理を行います。INSERT文は、「CASE式」と併用することでCASE式で返された値を挿入できます。

「テスト(test)」テーブル

ID(id)氏名(name)性別(gender)点数(point)
1001秋山80
1002久保田100
1003佐々木65
1004佐藤75
1005鈴木60
1006田中90
1007土屋55

下記のコードはテストの点数ごとに成績を付けています。

【実行コード】

CREATE TABLE grades(
 id INT AUTO_INCREMENT PRIMARY KEY,
 name VARCHAR(50) NOT NULL,
 point INT NOT NULL,
 grade VARCHAR(10),
);

【実行コード】

INSERT INTO grades(id,name,point,grade)
VALUES(
SELECT name,point,
CASE point
 WHEN point >= 90 THEN '秀'
 WHEN point >= 80 THEN '優'
 WHEN point >= 70 THEN '良'
 WHEN point >= 60 THEN '可'
 ELSE 不可
END AS grade
FROM test
);

【実行結果】

ID(id)氏名(name)点数(point)成績(grade)
1001秋山80
1002久保田100
1003佐々木NULL不可
1004佐藤75
1005鈴木60
1006田中90
1007土屋55不可

テーブル結合した結果をINSERTする

INSERT文は、JOIN句でテーブル結合させた結果をINSERTすることも可能です。

説明にあたって新たに以下のテーブルを使用します。

「生徒(student)」テーブル

学籍番号(number)氏名(name)部活ID(club_id)
1菊池1
2鈴木3
3田中4
4山田1

「運動部(sport_club)」テーブル

ID(id)競技(sport)
1野球
2サッカー
3バスケットボール

「生徒」テーブルの「部活」カラムと「運動部」テーブルの「ID」カラムを紐づけ、結合条件を満たす場合に、「生徒」テーブルの「氏名」カラムと「運動部」テーブルの「競技」カラムを表示します。

【実行コード】

SELECT student.name,sport_club.sport FROM student JOIN sport_club ON student.club_id = sport_club.id;

【実行結果】

氏名
(name)
競技
(sport)
菊池野球
鈴木バスケットボール
山田野球

共通する値がない「生徒」テーブルの田中さん、「運動部」テーブルの「サッカー」が表示されていません。

これとINSERT文を併用します。新たなテーブル「運動部所属者(sport_student)」テーブルに運動部に属する生徒のデータを挿入します。

【実行コード】

INSERT INTO sport_student (name,sport)
SELECT student.name,sport_club.sport FROM student JOIN sport_club ON student.club_id = sport_club.id;

【実行結果】

氏名
(name)
競技
(sport)
菊池野球
鈴木バスケットボール
山田野球

INSERT文のカッコ内とSELECT句内の抽出カラムが対応しているのが分かります。

まとめ

私たちが日々行うデータの操作の中でも、INSERT文はよく利用される命令の一つです。本記事で紹介した知識を活用して、日々のデータベース作業を効率良く進めていきましょう。

以下では、SQLに関するさまざまな記事を取り上げています。SQLに関する疑問や興味がある方は、ぜひ併せて参考にしてみてください。

SQL関連記事

     

Otherカテゴリの最新記事