SQL(MySQL)入門!2つのテーブルを接続しよう


INNER JOINとは

2つのテーブルを繋ぐSQL

Relationとは

「関連性」

MySQLはRelational Database(通称 RDB)である

関連性を重視したデータベースのこと

複数のテーブルでさまざまなデータを管理することで、効率よく重複なくデータを管理し、それをINNER JOINなどのSQLを使ってあとから繋いで、見やすく管理することができる

実際にやってみよう

「商品テーブル」...料理名や種類、価格を管理しているテーブル

CREATE TABLE 商品(
    id INT(11) PRIMARY KEY AUTO_INCREMENT,
    カテゴリー VARCHAR(45),
    商品名 VARCHAR(100),
    価格 SMALLINT(6)
);

データを挿入

INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (1,'和食','肉じゃが定食',900);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (2,'和食','すきやき',2000);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (3,'和食','焼き魚定食',1200);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (4,'和食','なすのおひたし',600);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (5,'洋食','オムライス',1200);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (6,'洋食','ビーフシチュー',1800);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (7,'中華','酢豚定食',1200);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (8,'中華','チャーハン',500);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (9,'中華','おつまみメンマ',250);
INSERT INTO `商品` (`id`,`カテゴリー`,`商品名`,`価格`) VALUES (10,'中華','ザーサイ',120);

しかし、このテーブルには問題点が2つあります。

  • カテゴリーに文字を使ってしまって、データを節約できていない(「和食」という2文字で8byte使ってしまうので、データ量が増えてきたときに容量を圧迫してしまう恐れがあるので適切ではない)
  • データ入力時に「和食」などと正確に入力しないとエラーになるので、保守性が悪い

ということで、この問題を解決するには...

カテゴリーだけをまとめた"カテゴリーテーブル"を作る

CREATE TABLE カテゴリー(
    id INT(11) PRIMARY KEY AUTO_INCREMENT,
    カテゴリー名 VARCHAR(45)
);

データを挿入

INSERT INTO `カテゴリー` (`id`,`カテゴリー名`) VALUES (1,'和食');
INSERT INTO `カテゴリー` (`id`,`カテゴリー名`) VALUES (2,'洋食');
INSERT INTO `カテゴリー` (`id`,`カテゴリー名`) VALUES (3,'中華');

"商品"と"カテゴリー"をガッチャンコ

カテゴリーテーブルのidを商品テーブルのカテゴリーと紐付けていくことで、文字ではなく数字で管理することができるようになる(数字だと1byte程度の容量で済むので、データを節約することができる)

商品テーブルのカテゴリーカラムを数字に変更する

UPDATE 商品 SET カテゴリー=1 WHERE カテゴリー="和食";
UPDATE 商品 SET カテゴリー=2 WHERE カテゴリー="洋食";
UPDATE 商品 SET カテゴリー=3 WHERE カテゴリー="中華";

商品テーブルのカテゴリーカラムのデータ型を変更する

テーブル作成時、カテゴリーカラムはVARCHAR型で作っていたが、今は数字に変わっているのでINT型*に変更してあげる必要がある

ALTER TABLE 商品 MODIFY カテゴリー INT;

いよいよ INNER JOIN の出番です

SELECT * FROM テーブル名1 INNER JOIN テーブル名2 ON テーブル名1.id(カラム名) = テーブル名2.id;

SELECT * FROM 商品 INNER JOIN カテゴリー ON 商品.カテゴリー = カテゴリー.id;

実行結果がこちら

商品テーブル作成時のデータはこんな感じ

 補足

PRIMARY KEY はテーブルに 1 つしか設定できませんが、対象となるカラムは 1 つだけではなく複数のカラムの組み合わせに対して設定することができます。
例えば 2 つのカラムの組み合わせに対して設定した場合、 2 つのカラムに格納されている値の組み合わせが他のデータと重複することはできなくなります。

書式はこちら↓

CREATE TABLE データベース名.テーブル名
  (1つ目のカラム名 データ型 NOT NULL, 2つ目のカラム名 データ型 NOT NULL, 
   PRIMARY KEY(1つ目のカラム名, 2つ目のカラム名));

結合のいくつかの例

公式リファレンスより抜粋

SELECT * FROM table1, table2;

SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.id;

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;

SELECT * FROM table1 LEFT JOIN table2 USING (id);

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id
LEFT JOIN table3 ON table2.id=table3.id;