MySQLの内部結合
更新日 : 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
カラム名:id
データ型:整数型
これが商品テーブルとの結合条件で利用するカラム - 種別名
カラム名:category_name
データ型:文字列(30文字まで)
- 種別id
データベース名は任意の場所へ、テーブル作成は以下の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.name
やcategories.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万円以上のものを取得できます。
タグ
-
前の記事
MySQLでDELETE(レコード削除)
-
次の記事
MySQLの外部結合