【SQL】複数テーブル同士の結合について
今回は複数のテーブル同士の結合について学んだことをアウトプットしていきます。
リレーションシップ
他のテーブルにある行と関連付けるために、外部キーを利用してリレーションシップを構成する。(結合)
外部キーとは?
外部キーとは、関連する他テーブルのある行(主キー列など)の値を記述したもの。
例えばUserテーブルが主テーブルでPostテーブルが付随する1対多な場合、Userテーブルを参照するために、Postテーブルに外部テーブルとして、外部キーのuser_idカラムを作る。
その外部キー(user_id)の中身に参照先の主テーブルの主キー(id)を格納して紐づける。
結合
結合を使用することで、複数のテーブル同士を繋いで、互いの表の中のデータを取り出すことができる。
また、結合はテーブルをまるっと繋ぐことではなく、結合条件が満たされた時にのみ、その満たされた条件に関する行を1つ1つその場に応じて結合されていく。
JOIN句
JOINで結合する時は内部結合が行われる。
(基本的に内部結合が一番利用される)
SELECT 日付, 名前 AS 費目, メモ FROM 家計簿 (主テーブル) JOIN 費目 (結合したい別のテーブル) ON 家計簿.費目ID = 費目.ID
JOINで結合先のテーブルを決めたら、その結合の条件をON句で指定する。
上記の結合指示しているSQL文は、
①JOINで結合したい費目テーブルを指定 ②FROMで主テーブルである家計簿テーブルを指定 ③ON句で指定した結合条件に則って、家計簿テーブルの費目IDと費目テーブルのIDが同じなら、その一致した行だけ取り出して結合する(全てのテーブルを結合するのではなく、一致したとこだけ結合する)
ON句
ON句が結合条件を書く時に記述するSQL
例として、下記のSQL文は家計簿テーブルの費目IDと費目テーブルのIDが同じ場合に結合するという意味の結合条件です。
ON 家計簿.費目ID = 費目.ID
INNER JOIN
INNER JOINはJOINとほぼ同じ意味で、基本的にRailsではINNER JOINでSQLを発行して内部結合が行われる。
基本的にRailsではINNER JOINの方が利用される。
Railsのjoinsメソッド
このINNER JOINはRailsでいう「joins」メソッドで同じ動きをする。
joinsメソッドは、Railsでアソシエーションしてある場合に使用できる。(belong_toとかで紐付けを先に定義しておく)