作記録

記憶代わり

PostgreSQLの内部結合(INNER JOIN)と外部結合(OUTER JOIN)の動きについて

1. 前提テーブル

1-1. weatherテーブル

city temp_lo temp_hi prcp date
San Francisco 46 50 0.25 1994-11-27
San Francisco 43 57 0 1994-11-29
Hayward 37 54 1994-11-29

1-2. citiesテーブル

name location
San Francisco (-194, 53)

2. 定義

2-1. 内部結合(INNER JOIN)のSQL

SELECT
    weather.city,
    weather.temp_lo,
    weather.temp_hi,
    weather.prcp,
    weather.date,
    cities.location
FROM
    weather
      INNER JOIN cities ON weather.city = cities.name;

2-2. 左外部結合(LEFT OUTER JOIN)のSQL

SELECT
    weather.city,
    weather.temp_lo,
    weather.temp_hi,
    weather.prcp,
    weather.date,
    cities.location
FROM
    weather
        LEFT OUTER JOIN cities ON weather.city = cities.name;

2-3. 右外部結合(RIGHT OUTER JOIN)のSQL

SELECT
    weather.city,
    weather.temp_lo,
    weather.temp_hi,
    weather.prcp,
    weather.date,
    cities.location
FROM
    weather
        LEFT OUTER JOIN cities ON weather.city = cities.name;

3. 定義

結合元テーブル

FROM句で指定したテーブルを結合元テーブルという。
上記2のSQLでは、weather がそれにあたる。

結合先テーブル

INNER JOIN句で指定したテーブルを結合先テーブルという。
上記2のSQLでは、cities がそれにあたる。

4. 内部結合(INNER JOIN)と外部結合(OUTER JOIN)のうごき

4-1. 上記2-1の内部結合(INNER JOIN)のSQLを投げた場合

  1. 結合元テーブルの全ての行を読み取る。
  2. 結合先テーブルの行を1つずつ読み取り、ON句で指定した条件に一致した結合先テーブルの行のみを結合元テーブルに結合する。
    つまり、条件に一致しない結合先テーブルの行は捨てられる。

4-2. 上記2-2の左外部結合(LEFT OUTER JOIN)のSQLを投げた場合

  1. 結合元テーブルの全ての行を読み取る。
  2. 結合先テーブルの行を1つずつ読み取り、ON句で指定した条件に一致した結合先テーブルの行を結合元テーブルに結合する。
    条件に一致しない結合先テーブルの行はNULLとして結合する。

4-3. 上記2-3の右外部結合(RIGHT OUTER JOIN)のSQLを投げた場合

  1. 結合元テーブルの全ての行を読み取る。
  2. 結合先テーブルの行を1つずつ読み取り、ON句で指定した条件に一致した結合先テーブルの行を結合元テーブルに結合する。
    条件に一致しない結合先テーブルの行は、結合元テーブルの行がNULLとして結合先テーブルの行と結合する。