【MySQL】JOINでテーブル同士を結合して取得・表示する

mysqlMySQL
書いてる人
あいりゅー

プログラミングを学びながら更新しています。
iPhone/iPad/Mac/Apple WatchなどのApple製品はこちらで主に更新しています。
麻雀の反省をひたすら掲載してるブログもやってます。

あいりゅーをフォローする

このページについて

このページではMySQLのJOINを使ってテーブル同士を結合して、それを取得・表示する方法を紹介しています。

JOIN

joinは複数のテーブルを結合する時に使われます。これの便利なところは

  • テーブルAとテーブルBに断片的にデータが登録されていても、1つに復元可能
  • テーブルAの内容を変更すれば完成後のテーブルも変化する

と言ったところでしょうか。これはいろんなケースにおいて便利です。例えば

  • シャドウバースのようにカードの能力が変化した時
  • 対人オンラインゲームにおいてスキルやキャラクターのステータスが変化した時

例えばカードゲームやオンラインゲームの攻略サイト的なものを運営しているとします。そして何らかのバランス調整により、多くのカードやスキルに変更が加わりました。まずやる作業としてもそれらの変更点を記事に反映するところからなんですが、カードの事を1ページでしか取り扱っていなかった場合は簡単ですよね。そこ一箇所変更するだけなので。しかしそのカードの事を10ページで扱っていた場合を考えると、それら10ページ全てを手動更新しなければなりません。

しかし今回の結合を上手に扱えば、「データベースにはカードのデータは1つ。それを必要に応じて呼び出すだけ」なので、たとえ100枚一気にバランス調整が来てもデータベースの100箇所を更新するだけで良く、実際のページ全てを確認して修正する必要はありません。更には「結合は必要な部分だけをうまく組み合わせて取得・表示できる」機能もあるので、仮に消滅した効果があるとします。データベースで正しく変更できれば、結果として表示されるテーブルからはちゃんと消滅したものは消えます。

ここまで長々と書いてきましたが、欲しいデータ同士をくっつけて表示できるという点はやはり便利です。実際に使い方も併せて紹介してきます。

JOIN構文

joinの基本的な書き方は以下の通りです。

select 使うカラム from テーブルA join テーブルB on テーブルA = テーブルB;

selectについてはこちらを参照してください。使うカラムは「最終的にテーブルに表示したいカラム」です。1つのカラムのみを使う場合はテーブル名.カラム名と書くだけでOKですが、複数使う場合は

テーブル名.カラム名,テーブル名.カラム名

と書く必要があります。テーブルAとBに関しては特に書くことはないと思います。みたまんまですね。そしてon以降のテーブルAとBですね。これは「テーブル同士をどういうふうに結合するか」を指定します。つまりこの場合はテーブルAとテーブルBを目印にそれぞれ一致するものを結合という意味になります。一致するものがあればそれらを結合しますが、一致しない場合は省略されます。

今回は2つのテーブルをあらかじめ作成しておく必要がありますが、この2つを使います。1つ目は「ポケモンクエストでカメックスが覚える技一覧」です。このテーブルはnoにユニークとプライマリを与えています。そして2のなみのりですが、カメックスは覚えません。これも後で少し触れていきます

カメックスが覚える技リスト

みての通り、技名しか書いておりません。これだけだとポケモンに詳しい人でない限り、技のタイプすらわかりませんね。次に使うのが、「ポケモンクエストで登場する技のリスト(一部)」です。全てを登録すると長くなるので一部だけですが、カメックスが覚えない技も混ぜています。

ポケモンクエストの技一覧

それでは結合してみます。今回は「カメックスのテーブルに技リストをくっつける」という順番で、使うカラムは「技名・技タイプ・技威力・技効果」の4つです。文は以下の通りです。

select skill_list.name,skill_list.type,skill_list.atk,skill_list.eff
from kame join skill_list on kame.name = skill_list.name;

見やすいように改行しましたが、実際に入力する時は改行しなくてOKです。このように入力する事で得られるテーブルは以下。

結合後のテーブル

このように「カメックスが覚える技の名前と技一覧の名前で一致するものだけを取得し、使うカラムに併せて表示する」ということが可能です。ちなみにカメックスが覚える技一覧ではレコードが10あったと思いますが、結果は9になっていますね。これは技一覧の方になみのりが無かったために省略されたことが原因です。もう一度言いますがカメックスはなみのりは覚えません。

結果をソートする

今回作ったテーブルでもOKっていう方も居れば、ソートして見やすくしたいって方もいると思います。なのでorder byでソートしましょう。文の末尾にorder byを与えるだけでOKです。

select kame.name,skill_list.atk,skill_list.type,skill_list.eff
from kame join skill_list on kame.name = skill_list.name order by atk;

このように実行すると、atkの低いものから順番に並ぶようになります。

order by atk

逆順にしたい時はdescを付与します。

order by atk desc

まとめ

以上が結合の基本的な使い方になります。これらは内部結合と呼ばれていて、不要なものや結合できないものは省略されます。そのため必要な物を素早く取得できるというメリットがあります。うまく使ってデータの管理・保守などを行っていきましょう。

MySQLの用語集
MySQLでよく使う・よく見る用語集です。知っておくと検索とかも便利になります。
ローカル環境の整え方
MAMPを使ってローカル環境を整える方法を紹介。
MySQLデータベースに接続する方法
MAMPのデータベースと、レンタルサーバーのデータベースに接続する方法
MySQLの基本コマンド
MySQLへ接続してまず使う基本コマンドの一覧です。
データベースの作成
ターミナル・phpMyAdminでのデータベースの作成方法をそれぞれ解説。
テーブルの作成
ターミナル・phpMyAdminのそれぞれでテーブルを作成する方法と、作成と同時にPRIMARYやUNIQUEの付与などの方法を紹介。
キーの種類と機能
カラムに設定出来るキーの種類と機能を解説。
正規化
リレーショナルデータベースを使う上で必須となる正規化について。データの追加や更新などで手間を省く方法としても使えます。
ALTER TABLE
ALTER TABLE構文を使って作成済みのテーブルに対して操作を行う。PRIMARYの付与やカラムの移動・名前変更・追加・削除なども行えます。
INSERT構文
INSERT構文を使って指定テーブルにデータ(行)を挿入する方法の解説です。
UPDATE構文
UPDATE構文を使って指定テーブルのカラムを一括更新、もしくは指定レコードの指定カラムのみを更新する方法の解説です。
SELECT構文
SELECT構文を使って指定したテーブルからデータを取得する方法の解説です。
JOIN
JOINを使ってテーブル同士を結合する方法の解説です。
タイトルとURLをコピーしました