【MySQL入門】INSERT文を使いこなす!基本からSELECT句まで一挙紹介

皆さんMySQLつかっていますか?

今回はINSERT文について紹介していきます。

INSERTはデータを追加するためのクエリです。

INSERTがなければデータベースは単なる空のテーブルに過ぎないわけで、データベースと非常に密接に関係したクエリとも言えますね。

データベースの要となる追加の構文、しっかりとマスターしていきましょう!

目次

INSERT文の基礎

まずはINSERT文の基本的な使い方から学びましょう。

基本の書式は次のようになります。

INSERT INTO テーブル名 (カラム名1, カラム名2, ……)
VALUE(値a1, 値a2, ……),
(値b1, 値b2, ……),
……;

今まで見てきたシンプルなクエリと比べると少し長めです。

ただ、やっていることはとてもシンプルで、「テーブル名」のテーブルにある「カラム名」のそれぞれのカラムに「値a1値a2, ……」の値を挿入していく、というものです。

実際にクエリをつかって動かしてみましょう。

まずはデータベースを作り、INSERTするためのテーブルまで作成しましょう。

データベースやテーブルの作成に不安のある方はこちらで復習できますので、是非ご覧ください。


【MySQL入門】CREATE TABLE文でテーブルを作成する方法
更新日:2024年3月1日

クエリ

CREATE DATABASE insert_db;
USE insert_db;
CREATE TABLE insert_table (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `age` INT,
  PRIMARY KEY (`id`));

DESC insert_table;

実行結果

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(45) | NO   |     | NULL    |       |
| age   | int(11)     | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

ひとまずこのようなテーブルができたことを確認してください。

INSERT文を実際に使う

それでは実際にINSERTをつかって、テーブルの中身を埋めていきましょう。

カラム名を省略したINSERTの書き方

一番シンプルな使い方は次のような書き方になります。

INSERT INTO insert_table VALUE (1,'タロー',25);

実行結果

Query OK, 1 row affected (0.03 sec)
SELECT * FROM insert_table;

+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | タロー |  25 |
+----+--------+-----+
1 row in set (0.00 sec)

INSERTは(カラム名)の指定が省略可能で、省略した場合はVALUE以下の値ですべてのカラムの値を指定する必要があります。

今回の例で行くと、id、名前、年齢すべてをVALUE以下で記入しているのが確認できますね。

カラム名を省略しないINSERTの書き方

カラム名を省略しない書き方は次のようになります。

INSERT INTO insert_table (id, name) VALUE (2,'ジロー');

実行結果

Query OK, 1 row affected (0.10 sec)

SELECT * FROM insert_table;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | タロー |   25 |
|  2 | ジロー | NULL |
+----+--------+------+
2 rows in set (0.00 sec)

このように、カラム名を指定した書き方では指定したカラムに合わせて値をVALUE以下に記入する必要があります。

今回は年齢を記入しなかったので、ageカラムがNULLになっていますね。

INSERTで値の無かったカラムにはNULLが設定されます。

カラムにNOT NULL制約をかけていた場合、INSERT自体がエラーになってしまいますので、カラムの設定をしっかり理解した上でINSERTは行うようにしましょう。

複数のレコードを同時に挿入する

INSERTは複数のレコードを同時に挿入することができます。

方法はかんたんで、VALUE以下の()を増やしていくだけです。

実際にクエリを見てみましょう。

INSERT INTO insert_table 
VALUE (3,'サブロー',21), (4,'シロー',20), (5,'ゴロー',19);

実行結果

Records: 3  Duplicates: 0  Warnings: 0

SELECT * FROM insert_table;          
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | タロー   |   25 |
|  2 | ジロー   | NULL |
|  3 | サブロー |   21 |
|  4 | シロー   |   20 |
|  5 | ゴロー   |   19 |
+----+----------+------+
5 rows in set (0.00 sec)

SELECT句を使った応用

ここではSELECT句を使った少々応用的なINSERTの使い方を紹介します。

今まではひとつのテーブルに対して値を挿入する方法を見てきましたが、時には他のテーブルにある値を別のテーブルにも記入したい場合があります。

複数の支社のある会社の社員名簿で、社員が転属するようなケースですね。

そこで利用できるのがINSERT INTO SELECT構文です。

SELECT自体はクエリとして使い慣れている方も多いでしょう。

今回もテーブル全体を表示するのに活躍しています。

これをINSERT INTOの句に使うことで、SELECTで選びだしたものをテーブルに挿入する、という方法が使えるようになるのです。

さっそく書式をみてみましょう。

INSERT INTO テーブル名1 (カラム名A, カラム名B, ……)
SELECT テーブル名2.カラム名 FROM テーブル名2 WHERE 条件;

INSERT文のVALUE以下が丸々SELECTに置き換わったような構造をしています。

もうひとつ特徴的なのが、SELECTで指定するカラム名はどちらのテーブルを使うかを明示するため、テーブル名2.カラム名という書き方になっています。

テーブル名とカラム名をピリオド(.)でつなぐ書き方ですね。

これはカラム名の出どころを明らかにしたいときにしばしば出てくるので、合わせて覚えておいてください。

それでは実際に動かしてみましょう。

まず参照元となるテーブル2を作ります。

CREATE TABLE insert_table2 (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `age` INT,
  PRIMARY KEY (`id`));

INSERT INTO insert_table2 
VALUE (1,'ハナコ',27), 
(2,'アン',34), 
(3,'オシン',52), 
(4,'ジュン',25), 
(5,'エリー',22);

SELECT * FROM insert_table2;

実行結果

+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | ハナコ |   27 |
|  2 | アン   |   34 |
|  3 | オシン |   52 |
|  4 | ジュン |   25 |
|  5 | エリー |   22 |
+----+--------+------+
5 rows in set (0.00 sec)

ここまでは問題ありませんね。

では、このinsert_table2から、即戦力になりそうな30歳以上の人をinsert_tableに移行させてみましょう。

クエリは次のようになります。

ALTER TABLE insert_table CHANGE id id INT AUTO_INCREMENT;

INSERT INTO insert_table (name, age)
SELECT insert_table2.name, insert_table2.age
FROM insert_table2
WHERE insert_table2.age >= 30; 

SELECT * FROM insert_table;

実行結果

+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | タロー   |   25 |
|  2 | ジロー   | NULL |
|  3 | サブロー |   21 |
|  4 | シロー   |   20 |
|  5 | ゴロー   |   19 |
|  6 | アン     |   34 |
|  7 | オシン   |   52 |
+----+----------+------+
7 rows in set (0.00 sec)

最初のクエリはテーブル1のidにオートインクリメントを設定しておきました。

テーブルに追加する場合、idを主キーにしておくと重複や未設定の問題が生じます。

それを回避するための一時しのぎです。

クエリの2つ目が本丸のINSERT INTO SELECT構文です。

これは、テーブル1であるinsert_tableのname, ageに対して、テーブル2のname, ageカラムの情報を書き込む。

ただし、ageが30以上であること、というクエリになります。

実行結果をみると、確かにageが30以上の二人がテーブル1に追加されているのが確認できますね。

まとめ

いかがでしたか?

今回はINSERT文について、基本的な使い方から、少し応用のINSERT INTO SELECT構文まで紹介しました。

データの追加について、INSERT自体はそこまで難しいものではないことが体感できたのではないでしょうか。

INSERT文はSQLを構成するデータの新規追加・読み込み・変更・消去の第一歩です。

ここから一歩ずつMySQLを習得していき、最後はSQLが自在に操れることが一つの到達点と言えるでしょう。

頂上を目指し、まずは一歩ずつ前に進んでいきましょう。

この記事が皆様のMySQL学習の一助となれば幸いです。

この記事を書いた人

フリーのエンジニア・ライター。
プログラミング、ライティング、マーケティングなど、あらゆる手段を駆使して、
ハッピーなフルリモートワーカーを目指し中。

最近興味がある分野は深層強化学習。
積みゲー、積ん読がどんどん増加しているのがここ数年の悩み。
実は侍エンジニア塾の卒業生だったりします。

目次