SQL NATURAL JOIN -- 自動カラムマッチング

同じ名前のカラムを自動的にマッチするSQL NATURAL JOINを理解します。便利だが本番スキーマではリスクがある理由を学びます。

Performance

詳細な説明

NATURAL JOINとは?

NATURAL JOIN同じ名前を持つすべてのカラムで2つのテーブルを自動的に結合します。ON句は書きません。データベースが結合条件を推論します。

構文

SELECT *
FROM orders
NATURAL JOIN customers;

orderscustomersの両方にidcustomer_idという名前のカラムがある場合、結合条件はorders.id = customers.id AND orders.customer_id = customers.customer_idになります。これはほぼ確実に意図したものではありません

INNER JOINとの違い

機能 INNER JOIN NATURAL JOIN
ON句 必須(明示的) 禁止(暗黙的)
マッチカラム 自分で選択 すべての同名カラム
結果の重複カラム 両方表示 1つにマージ
安全性 予測可能 スキーマ依存

隠れた危険

NATURAL JOINの動作はスキーマの変更時に暗黙的に変わります:

  1. 誰かが両テーブルにupdated_atカラムを追加。
  2. NATURAL JOINがupdated_atでもマッチするようになり、意味のある結果はほとんど生まれない。
  3. コードの変更なく、スキーマの変更のみでクエリが壊れる。

これにより、NATURAL JOINは脆弱であり、本番コードには不適切です。

NATURAL JOINが許容される場合

  • タイピング速度が安全性より重要なSQLコンソールでのアドホック探索
  • カラム命名規則が正しいマッチを保証する管理されたスキーマ(まれ)。
  • 暗黙的な結合条件の概念を実演する教育的文脈

USINGという代替手段

より安全な中間的アプローチはUSING句で、結合する同名カラムを指定できます:

SELECT *
FROM orders
JOIN customers USING (customer_id);

これは安全であるために十分明示的でありながら、完全なON句よりも短くなります。

ユースケース

NATURAL JOINは開発中の簡単なアドホッククエリに使用するのが最適です。本番コードでは、ON句付きの明示的なINNER JOINまたはよりクリーンな代替手段としてJOIN ... USINGを使用してください。

試してみる — SQL JOIN Visualizer

フルツールを開く