| 内部結合と外部結合 |
|---|
| ON条件が両テーブルで一致する行のみ。一致しない行はどちら側でも破棄されます。 | SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id; |
| 左テーブルのすべての行。一致がない部分の右側の列はNULLになります。 | SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id; |
| 右テーブルのすべての行。一致がない部分の左側の列はNULLになります。 | SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id; |
| 両テーブルのすべての行。一致しない側はNULLで埋められます。 | SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id; |
| 交差結合と自己結合 |
|---|
| 直積。左の各行が右のすべての行とペアになります。ON句はありません。 | SELECT u.name, o.total FROM users u CROSS JOIN orders o; |
| 別名(エイリアス)を使ってテーブルをそれ自体に結合します。1つのテーブル内で行を比較します。 | SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id; |
| 高度な結合 |
|---|
| FROM内のサブクエリを外側の行ごとに評価します。サブクエリは外側のテーブルの列を参照できます。 | SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o; |
| 同じ名前の列で結合します。ON句はありません。意図しないキーの衝突に注意してください。 | SELECT u.name, o.total FROM users u NATURAL JOIN orders o; |