Chapter 07

データの検索⑤

JboyHashimoto
JboyHashimoto
2022.10.11に更新
このチャプターの目次

テーブル結合

最初にテーブルを4つ作ったのは、テーブル結合をするためでした。JOINと呼ばれているものですね。
筆者はJOINに嫌な思いをさせれたことがあって、好きではないですね。(笑)
教えている人がわからない方法で教えるから理解できなかっただけですけどね!

今回は、JOINするとどうなるのかを再現するだけなので、本に載っている難しいことはしません。学習を少しでも楽しめたらいいかなと思って、自分の好きなジャンルをデータ化して検索するのをやってみました。
本に書いてあることをそのままやっても実は分かってなかったりするので、サンプルのSQLを書き換えてJOINしてどんな結果になるのが、理解をする最短の方法だと思っています。

やること

テーブルをくっつけて表示するだけ!
簡単ですよね。でもこれ、お作法があってですね、決まった書き方をしないと単純なテーブル結合も失敗しちゃうんですよね💦

今回は内部結合をやってみます。INNER JOINと呼ばれているものですね。結合演算と呼ばれていて最もよく使われているそうです。

こちらがサンプルになります。
AクラスからDクラスまでのテーブルを内部結合して、データを表示します。左から、テーブルが並んで表示されます。

/*クラステーブルを4つ結合する*/
SELECT
  a.class_id,
  a.student_name,
  a.class_score,
  b.class_id,
  b.student_name,
  b.class_score,
  c.class_id,
  c.student_name,
  c.class_score,
  d.class_id,
  d.student_name,
  d.class_score
FROM
  ClassA AS a
INNER JOIN
  ClassB AS b
ON a.class_id = b.class_id
INNER JOIN
  ClassC AS c
ON b.class_id = c.class_id
INNER JOIN
  ClassD AS d
ON c.class_id = d.class_id;

実行結果

mysql> /*クラステーブルを4つ結合する*/
mysql> SELECT
    ->   a.class_id,
    ->   a.student_name,
    ->   a.class_score,
    ->   b.class_id,
    ->   b.student_name,
    ->   b.class_score,
    ->   c.class_id,
    ->   c.student_name,
    ->   c.class_score,
    ->   d.class_id,
    ->   d.student_name,
    ->   d.class_score
    -> FROM
    ->   ClassA AS a
    -> INNER JOIN
    ->   ClassB AS b
    -> ON a.class_id = b.class_id
    -> INNER JOIN
    ->   ClassC AS c
    -> ON b.class_id = c.class_id
    -> INNER JOIN
    ->   ClassD AS d
    -> ON c.class_id = d.class_id;
+----------+--------------+-------------+----------+--------------+-------------+----------+--------------+-------------+----------+--------------+-------------+
| class_id | student_name | class_score | class_id | student_name | class_score | class_id | student_name | class_score | class_id | student_name | class_score |
+----------+--------------+-------------+----------+--------------+-------------+----------+--------------+-------------+----------+--------------+-------------+
| 0001     | 坂柳         |         100 | 0001     | 一ノ瀬       |         100 | 0001     | 龍園         |          60 | 0001     | 綾小路       |         100 |
| 0002     | 橋本         |          90 | 0002     | 神崎         |          90 | 0002     | 伊吹         |          50 | 0002     | 堀北         |          95 |
| 0003     | 神室         |          87 | 0003     | 柴田         |          87 | 0003     | 石崎         |          56 | 0003     | 櫛田         |          92 |
| 0004     | 葛木         |          95 | 0004     | 姫乃         |          84 | 0004     | 椎名         |         100 | 0004     | 軽井沢       |          78 |
+----------+--------------+-------------+----------+--------------+-------------+----------+--------------+-------------+----------+--------------+-------------+
4 rows in set (0.00 sec)

横にスクロールしないと、CクラスとDクラスの生徒のデータが見れないですね(笑)
これ後で、データ追加しちゃったんですけど、JOINしてみたら、idが0004までの生徒さんしか表示されてないですね。どうなるんだろうと、実行してみたら、検索条件が1001~1004までのデータしか、クラス毎に表示されなくなるようですね。
出ないと見た目が崩れてしまうでしょうね😅