【PostgreSQL】INNER JOINでテーブル同士を内部結合する方法

PostgreSQL

PostgreSQLで内部結合を行う方法

PostgreSQLのINNER JOIN構文を使用すると、テーブル同士を内部結合することができます。

SELECT * FROM テーブル名1
INNER JOIN テーブル名2 ON 結合条件

INNER JOINを使用した具体的なSQLのコード例

PostgreSQLでINNER JOINを使用してテーブルを結合する処理について、具体的なSQL例を紹介して解説します。

前提として、以下のstudentsテーブルとhigh_schoolsテーブルを使用します。

studentsテーブル
high_schoolsテーブル

上記2つのテーブルを使用して、以下の3つの例について段階的に解説していこうと思います。

  1. INNER JOINで結合した全データを取得する
  2. 結合したデータから取得するカラムを限定する
  3. 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

実行結果は以下のようになり、私立学校である大宮学園高校に所属する生徒のレコードだけが取得できます。

タイトルとURLをコピーしました