スライドショー

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

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

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

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

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

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

INSERT文の基礎

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

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

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

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

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

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

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

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


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

クエリ

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学習の一助となれば幸いです。

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

平山 晃

平山 晃

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

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説