SQL NATURAL JOIN -- 自動カラムマッチング
同じ名前のカラムを自動的にマッチするSQL NATURAL JOINを理解します。便利だが本番スキーマではリスクがある理由を学びます。
Performance
詳細な説明
NATURAL JOINとは?
NATURAL JOINは同じ名前を持つすべてのカラムで2つのテーブルを自動的に結合します。ON句は書きません。データベースが結合条件を推論します。
構文
SELECT *
FROM orders
NATURAL JOIN customers;
ordersとcustomersの両方にidとcustomer_idという名前のカラムがある場合、結合条件はorders.id = customers.id AND orders.customer_id = customers.customer_idになります。これはほぼ確実に意図したものではありません。
INNER JOINとの違い
| 機能 | INNER JOIN | NATURAL JOIN |
|---|---|---|
| ON句 | 必須(明示的) | 禁止(暗黙的) |
| マッチカラム | 自分で選択 | すべての同名カラム |
| 結果の重複カラム | 両方表示 | 1つにマージ |
| 安全性 | 予測可能 | スキーマ依存 |
隠れた危険
NATURAL JOINの動作はスキーマの変更時に暗黙的に変わります:
- 誰かが両テーブルに
updated_atカラムを追加。 - NATURAL JOINが
updated_atでもマッチするようになり、意味のある結果はほとんど生まれない。 - コードの変更なく、スキーマの変更のみでクエリが壊れる。
これにより、NATURAL JOINは脆弱であり、本番コードには不適切です。
NATURAL JOINが許容される場合
- タイピング速度が安全性より重要なSQLコンソールでのアドホック探索。
- カラム命名規則が正しいマッチを保証する管理されたスキーマ(まれ)。
- 暗黙的な結合条件の概念を実演する教育的文脈。
USINGという代替手段
より安全な中間的アプローチはUSING句で、結合する同名カラムを指定できます:
SELECT *
FROM orders
JOIN customers USING (customer_id);
これは安全であるために十分明示的でありながら、完全なON句よりも短くなります。
ユースケース
NATURAL JOINは開発中の簡単なアドホッククエリに使用するのが最適です。本番コードでは、ON句付きの明示的なINNER JOINまたはよりクリーンな代替手段としてJOIN ... USINGを使用してください。