SQL の内部結合(INNER JOIN)と内部結合 (OUTER JOIN)
ほんとに何回やっても覚えられないので、ここにまとめる。
前提
- MSSQL (SQL Server 2019) を使う
- 記事の最後のほうにまとめてあるサンプルデータをデータベースに投入してあるものとする
内部結合と外部結合
内部結合は両辺の積集合、外部結合は両辺の和集合である。私はこれで遂に大筋の理解ができたものの、あんまり最初の方にこれを言ってくれる文書がなかったので、本記事では最初に言っておく。
※ 積集合は
ON について
内部結合にせよ外部結合にせよ、ON
でテーブルの左辺(SELECT FROM
で指定する方)と右辺(JOIN
で結合したい方)を接続する基準となる列を指定する。
INNER JOIN
INNER JOIN
は両辺のテーブルについて右辺と左辺の積を取る。ON で示される結合基準に基づき、左辺と右辺のどちらかのデータが存在しなければ、その列は除去される。
SELECT
users.username,
users.country,
countries.gdp,
countries.population
FROM users
INNER JOIN countries ON users.country = countries.country
OUTER JOIN
OUTER JOIN
は両辺の和を取る。つまり、片方の辺にしかデータが存在しない場合でも、その列は保持されたままデータを取り出せる。「片方の辺」の基準は LEFT
か RIGHT
で指定する。なお、存在しないデータは NULL
が充当される。
LEFT OUTER JOIN
LEFT OUTER JOIN
は左辺(SELECT ... FROM
で選ぶ方)の列を基準として両辺の和を取る。左辺にしかないデータは保持される一方で、右辺にしかないデータは除去される。
SELECT *
FROM users
LEFT OUTER JOIN countries ON users.country = countries.country
RIGHT OUTER JOIN
RIGHT OUTER JOIN
は右辺 (RIGHT OUTER JOIN
で選ぶ方)の列を基準として両辺の和を取る。右辺にしかないデータは保持される一方で、左辺にしかないデータは除去される。
SELECT *
FROM users
RIGHT OUTER JOIN countries ON users.country = countries.country
FULL OUTER JOIN
例えば LEFT OUTER JOIN
は左辺にしかないデータだけは保持される一方で、右辺にないデータは除去されていた。このとき、右辺にしかないデータも保持したいときがある。
このときに用いるのが FULL OUTER JOIN
である。FULL OUTER JOIN
では左辺にしかないデータでも右辺にしかないデータでも除去されずに保持される。
SELECT *
FROM users
FULL OUTER JOIN countries ON users.country = countries.country
メモ: サンプルデータの作成
MSSQL でやっている。面倒なことは面倒な奴に任せるべきなので、テストデータは ChatGPT を使って生成した。
Discussion