MySQLのCRUD(Create・Read・Update・Delete)をすべて学んだところで、リレーショナルデータベースの特徴的な機能の1つであるテーブル結合について説明します。 まずは内部結合から見ていきます。外部結合とそれほど書式は変わりませんが、取得できるデータに違いが出るので、内部結合と外部結合の違いについては理解しておきましょう。

MySQLの内部結合

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2019年06月18日

MySQLのCRUD(Create・Read・Update・Delete)をすべて学んだところで、リレーショナルデータベースの特徴的な機能の1つであるテーブル結合について説明します。

まずは内部結合から見ていきます。外部結合とそれほど書式は変わりませんが、取得できるデータに違いが出るので、内部結合と外部結合の違いについては理解しておきましょう。

内部結合の書式

まずは書式から見ていきましょう。

SELECT
	カラム名1,
	カラム名2,
	...
FROM
	データベース名.左テーブル名
INNER JOIN
	データベース名.右テーブル名
	ON
		結合条件
(WHEREなど)

内部結合のキーワードはINNER JOIN 〜〜 ON 〜〜の部分です。

INNER JOIN テーブル名で右側から結合するテーブル名を指定します。また、ON 結合条件で、左のテーブルと右のテーブルの結合条件を記載します。結合条件に従って左テーブルと右テーブルが結合され、擬似的に1つのテーブルのようにカラムデータを取得できます。

実際にテーブルとレコードを入れて、結合してみる

内部結合・外部結合とはで例に出した以下の画像のテーブルを実際に作成して内部結合を試してみたいと思います。

このテーブル情報を、以下のような設計で考えてみます。

  • 商品テーブル
    • 商品id
      カラム名:id
      データ型:整数型
    • 商品名
      カラム名:name
      データ型:文字列(30文字まで)
    • 価格
      カラム名:price
      データ型:整数型
    • 種別id
      カラム名:category_id
      データ型:整数型
      これが種別テーブルとの結合条件で利用するカラム
  • 種別テーブル
    • 種別id
      カラム名:id
      データ型:整数型
      これが商品テーブルとの結合条件で利用するカラム
    • 種別名
      カラム名:category_name
      データ型:文字列(30文字まで)

データベース名は任意の場所へ、テーブル作成は以下のSQLで作成してみてください。

CREATE TABLE goods (id int, name varchar(30), price int, category_id int);

CREATE TABLE categories (id int, category_name varchar(30));

テーブル作成後、データを追加していきましょう。

INSERT INTO goods (id, name, price, category_id) VALUES
(1, 'テレビA', 100000, 1),
(2, '洗濯機A', 70000, 1),
(3, 'カメラA', 50000, 4),
(4, 'ゲームA', 6000, 2),
(5, 'ゲームB', 8000, 2),
(6, '冷蔵庫A', 75000, 1);

INSERT INTO categories (id, category_name) VALUES
(1, '家電'),
(2, 'ゲーム'),
(3, '家具');

これでレコードも追加できました。

内部結合でデータを取得してみる

実際に内部結合でデータを取得してみましょう。書式に従い、以下のSQLを実行してみましょう。

SELECT
	*
FROM
	goods
	INNER JOIN
		categories
		ON
		categories.id = goods.category_id;

これを実行すると以下のようにデータが取得できます。

2つのテーブルが結合され、categories.id(カテゴリーテーブルのid)とgoods.category_id(商品テーブルのカテゴリーid)が一致するレコードを取得しています。

SELECT *とすることで、すべてのカラムの情報を取得しています。商品名とカテゴリー名だけを取得したい場合には以下のようなSQLを実行します。

SELECT
	goods.name,
	categories.category_name
FROM
	goods
	INNER JOIN
		categories
		ON
		categories.id = goods.category_id;

これで商品名とカテゴリー名だけがきれいに取得できています。

goods.namecategories.category_nameのように、テーブルを結合する場合には取得したいカラムがあるテーブル名.取得したいカラム名とするのが基本です。

まとめ

MySQLの内部結合について見ていきました。INNER JOIN句を利用することにより、2つのテーブルで両方とも存在するレコードを1つのテーブルに存在するデータかのように取得ができます。

FROM句の後ろにテーブル名を記載するのがSELECT文の基本でしたが、感覚的にはFROM以降にある

goods
INNER JOIN
	categories
	ON
	categories.id = goods.category_id

の部分が1つのテーブルを表してるように見えるかと思います。

そのため、ここからさらにWHERE句などを追加する場合には

SELECT
	goods.name,
	goods.price,
	categories.category_name
FROM
	goods
	INNER JOIN
		categories
		ON
		categories.id = goods.category_id
WHERE
	goods.price >= 50000;

のようにすれば、商品が5万円以上のものを取得できます。