複数のテーブルを含むクエリでは、テーブル「A」の結果をテーブル「B」にリンクするために、何らかの形式の関連付けが必要です。これを行う従来の(ANSI-89)手段は、次のとおりです。
- FROM句のコンマ区切りリストに含まれるテーブルを一覧表示します
-
WHERE句でテーブル間の関連付けを記述します
SELECT * FROM TABLE_A a, TABLE_B b WHERE a.id = b.id
ANSI-92JOIN構文を使用して書き直されたクエリは次のとおりです。
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
パフォーマンスの観点から:
サポートされている場合(Oracle 9i +、PostgreSQL 7.2以降、MySQL 3.23以降、SQL Server 2000以降)、どちらの構文を使用してもパフォーマンス上の利点はありません。オプティマイザはそれらを同じクエリと見なします。ただし、ANSI-92構文を使用すると、より複雑なクエリにメリットがあります。
- JOINの順序を制御する機能-テーブルがスキャンされる順序
- 参加する前にテーブルにフィルター基準を適用する機能
メンテナンスの観点から:
ANSI-89よりもANSI-92JOIN構文を使用する理由はたくさんあります:
- JOIN基準はWHERE句とは別のものであるため、読みやすくなります
- JOIN基準を見逃す可能性が低い
- INNER以外のJOINタイプの一貫した構文サポートにより、他のデータベースでクエリを簡単に使用できるようになります
- WHERE句は、結合されたテーブルのデカルト積のフィルタリングとしてのみ機能します
設計の観点から:
ANSI-92 JOIN構文はパターンであり、アンチパターンではありません:
- クエリの目的はより明確です。アプリケーションで使用される列は明確です
- 可能な限り厳密な型付けを使用することに関するモジュール性の規則に従います。 Explicitは、ほぼ普遍的に優れています。
結論
慣れや快適さが不足しているため、ANSI-92JOIN構文の代わりにANSI-89WHERE句を使用し続けることにメリットはありません。 ANSI-92構文がより冗長であると不満を言う人もいるかもしれませんが、それがそれを明確にしているのです。明確であるほど、理解と維持が容易になります。