目的
- SQLのテーブル結合の基礎をまとめる。
テーブル結合とは?
- 文字通りテーブルを結合することである。
- 結合は物理的にくっ付くのではない。(したがってテーブル結合を解除するSQL文などがあるわけではない)
- あくまで結合はデータを取得する為だけに一時的に結合する物である。
- テーブル結合を使用する例を下記に記載する。
-
下記の様なusersテーブルとage_rangesテーブルが存在するとする。
-
usersテーブル
カラム名 格納される値の情報 id 数値が自動インクリメントされて格納される name ユーザ名を表す文字列 age_renge_id ユーザの年齢層を識別するID -
age_rengesテーブル
カラム名 格納される値の情報 id 数値が自動インクリメントされて格納される age_range 年齢層を指定する文字列(20代など)
-
-
下記の様にダミーデータが格納されている物とする。
-
usersテーブル
id name age_renge_id 1 miriwo 2 -
age_rengesテーブル
id age_renge 1 未成年 2 20代 3 30代
-
-
usersテーブルとage_rangesテーブルの内容を掛け合わせて下記の様に表示したい時に結合を使用する。(年齢層をidではなく文字列で表現したい)
id name age_renge 1 miriwo 20代
-
例
-
先に定義したusersテーブルとage_rangesテーブルに格納されているダミーデータを用いて、テーブル結合を使用して下記の様に出力する方法をまとめる。
id name age_renge 1 miriwo 20代 -
一旦下記のSQLを実行してテーブル結合を行い全てのカラムの値を出力する。
mysql> select * from users join age_ranges on users.age_range_id = age_ranges.id where users.id = 1;
-
下記の様に結合後のusersテーブルのidが1のカラムが全て出力される。
+------+--------+--------------+------+-------+ | id | name | age_range_id | id | name | +------+--------+--------------+------+-------+ | 1 | miriwo | 2 | 2 | 20代 | +------+--------+--------------+------+-------+
-
全てのカラムが出力されてしまったのは
select *
と指定してしまっているからである。下記の様な形でデータが得られる様にselectの部分を修正する。id name age_renge 1 miriwo 20代 -
下記を実行することにより意図した形でデータを出力することができる。
mysql> select users.id, users.name, age_ranges.name as age_renge from users join age_ranges on users.age_range_id = age_ranges.id where users.id = 1;
-
実行結果を下記に記載する。
+------+--------+-----------+ | id | name | age_renge | +------+--------+-----------+ | 1 | miriwo | 20代 | +------+--------+-----------+
解説
-
最終的に実行したSQL文の解説を行う。
-
下記にコメント付きで先のSQL文を記載する。
mysql> -- 最終的に出力するカラムを指定している。usersテーブルのidカラム、usersテーブルのnameカラム、age_rangesテーブルのnameカラムをage_rengeと改名して表示する命令である。 select users.id, users.name, age_ranges.name as age_renge -- from テーブル名でメインのテーブルを指定している。 from users -- join テーブル名で結合を行うテーブルを指定している。 join age_ranges -- on メインテーブル名.カラム名 = 結合を行うテーブル名.カラム名で結合ルールを指定している。 -- 「usersテーブルのage_range_idカラムに格納されている数字とage_rangesテーブルのidカラムの数字が一致する物を結びつけてください」という意味である。 on users.age_range_id = age_ranges.id -- ここまでのルールで取得できたデータでusersテーブルのidカラムが1の物だけ出力する命令である。 where users.id = 1;