PostgreSQLで内部結合を行う方法
PostgreSQLのINNER JOIN構文を使用すると、テーブル同士を内部結合することができます。
SELECT * FROM テーブル名1
INNER JOIN テーブル名2 ON 結合条件
INNER JOINを使用した具体的なSQLのコード例
PostgreSQLでINNER JOINを使用してテーブルを結合する処理について、具体的なSQL例を紹介して解説します。
前提として、以下のstudentsテーブルとhigh_schoolsテーブルを使用します。
上記2つのテーブルを使用して、以下の3つの例について段階的に解説していこうと思います。
- INNER JOINで結合した全データを取得する
- 結合したデータから取得するカラムを限定する
- WHERE文で条件を指定して取得するレコードを限定する
INNER JOINで結合した全データを取得する
studentsテーブルとhigh_schoolsテーブルという2つのテーブルを結合して、どの生徒がどの高校に在籍しているかを一目でわかるようなデータを取得する場合、以下のようにSQLを記述します。
SELECT * FROM students
INNER JOIN high_schools ON students.high_school_id = high_schools.id
実行結果は以下の通りで、studentsテーブルのhigh_school_idカラムにデータを保持している10人分がhigh_schoolsテーブルと結合され、合体したレコードが丸々取得できます。
studentsテーブルのidが11と12のデータは、high_school_idカラムがnullであり、紐づくhigh_schoolsテーブルのデータが存在しないため、内部結合では弾かれてしまいます。
以下では、ここからカラムを限定してデータを取得する方法を解説します。
結合したデータから取得するカラムを限定する
例えば、studentsテーブルのnameカラム(生徒の名前)とhigh_schoolsテーブルのnameカラム(高校の名前)だけを取得する場合は、下記のようにSQLを記述します。
SELECT
students.name AS student_name,
high_schools.name AS high_school_name
FROM
students
INNER JOIN
high_schools
ON
students.high_school_id = high_schools.id
実行結果は次のように、期待通り生徒の氏名とその生徒が所属する高校名のみをまとめて取得できます。
以下では、ここから更に条件を指定して、取得するレコードを絞る方法を解説します。
WHERE文で条件を指定して取得するレコードを限定する
上記で取得したデータから、high_schoolsテーブルのis_public_schoolがfalseの生徒のデータだけ(つまり、私立高校に通う生徒のみ)を取得する場合、下記のようにWHERE文で条件を指定します。
SELECT
students.name AS student_name,
high_schools.name AS high_school_name
FROM
students
INNER JOIN
high_schools
ON
students.high_school_id = high_schools.id
WHERE
high_schools.is_public_school = false
実行結果は以下のようになり、私立学校である大宮学園高校に所属する生徒のレコードだけが取得できます。