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つずつ読み取り、ON句で指定した条件に一致した結合先テーブルの行のみを結合元テーブルに結合する。
つまり、条件に一致しない結合先テーブルの行は捨てられる。
4-2. 上記2-2の左外部結合(LEFT OUTER JOIN)のSQLを投げた場合
- 結合元テーブルの全ての行を読み取る。
- 結合先テーブルの行を1つずつ読み取り、ON句で指定した条件に一致した結合先テーブルの行を結合元テーブルに結合する。
条件に一致しない結合先テーブルの行はNULLとして結合する。
4-3. 上記2-3の右外部結合(RIGHT OUTER JOIN)のSQLを投げた場合
- 結合元テーブルの全ての行を読み取る。
- 結合先テーブルの行を1つずつ読み取り、ON句で指定した条件に一致した結合先テーブルの行を結合元テーブルに結合する。
条件に一致しない結合先テーブルの行は、結合元テーブルの行がNULLとして結合先テーブルの行と結合する。