このページについて
このページでは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の低いものから順番に並ぶようになります。
逆順にしたい時は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を使ってテーブル同士を結合する方法の解説です。