sql >> データベース >  >> RDS >> Mysql

MySQLクエリで、なぜwhereの代わりにjoinを使用するのですか?

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

    1. FROM句のコンマ区切りリストに含まれるテーブルを一覧表示します
    2. 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構文がより冗長であると不満を言う人もいるかもしれませんが、それがそれを明確にしているのです。明確であるほど、理解と維持が容易になります。



    1. SQLスキーマのみをバックアップしますか?

    2. ORACLE-サブクエリでカウントを選択

    3. 実行計画の品質に対する10の一般的な脅威

    4. PerconaXtraBackupとMySQLEnterpriseBackupの比較:パート1