1. ホーム
  2. sql

[解決済み] MySQLのクエリでは、なぜwhereの代わりにjoinを使うのですか?

2022-09-11 09:12:36

質問

2つ以上のテーブルを結合するには、joinかwhereのどちらかを使用するようです。どちらか一方の利点は何ですか?

どのように解決するのですか?

複数のテーブルを含むクエリは、テーブル "A" からテーブル "B" に結果をリンクするために、何らかの形式の関連付けを必要とします。 これを行う伝統的な (ANSI-89) 手段は、次のとおりです。

  1. FROM 句に関係するテーブルをカンマ区切りでリストアップします。
  2. WHERE句にテーブル間の関連付けを記述します。

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id
    
    

ANSI-92 JOIN構文を使って書き直したクエリがこちらです。

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 の順序を制御する能力 - テーブルがスキャンされる順序
  • JOINの前にテーブルのフィルタ基準を適用する機能

メンテナンスの観点から


ANSI-89よりもANSI-92のJOIN構文を使用する理由は数多くあります。

  • JOIN基準がWHERE句から分離されているため、より読みやすい。
  • JOIN条件を見逃す可能性が低くなる
  • INNER 以外の JOIN タイプに対する一貫した構文のサポートにより、他のデータベースでもクエリーを簡単に使用できるようになりました。
  • WHERE 句は、結合されたテーブルのデカルト積のフィルタリングとしてのみ機能する。

設計の観点から


ANSI-92 JOIN構文はパターンであり、アンチパターンではありません。

  • クエリの目的がより明確である。アプリケーションで使用されるカラムが明確である。
  • 可能な限り厳密な型付けを使用するというモジュール性のルールに従います。 明示的な方がほぼ普遍的に良い。

結論


慣れや快適さを除けば、ANSI-92 JOIN構文ではなくANSI-89 WHERE句を使い続けることに何の利点も見当たりません。ANSI-92 構文はより冗長であると不満を持つ人もいるかもしれませんが、それが明示的である理由です。 より明示的であればあるほど、理解や保守が容易になります。