シナリオ:
login_log
と ip_location
という 2 つのテーブルがあります。 目標は、login_log
に記録されている、 に存在しない のすべての IP アドレスを識別することです。ip_location
SQL ソリューション:
いくつかの SQL アプローチでこれを実現できます。 3 つの一般的な方法を調べてみましょう:
サブクエリ:NOT EXISTS
このメソッドは一般に効率的で、幅広い互換性があります。
<code class="language-sql">SELECT ip FROM login_log WHERE NOT EXISTS ( SELECT 1 FROM ip_location WHERE login_log.ip = ip_location.ip );</code>
の各 IP アドレスが login_log
に対応するエントリがあるかどうかを確認します。一致するものが見つからない場合は、IP アドレスが結果に含まれます。 多くの場合、サブクエリでは ip_location
の方が SELECT 1
より効率的であることに注意してください。SELECT ip
と LEFT JOIN
チェック:NULL
このアプローチでは、 を使用してテーブルを結合し、LEFT JOIN
の ip
列が ip_location
である行をフィルターします。 IP アドレスがありません。NULL
<code class="language-sql">SELECT l.ip FROM login_log l LEFT JOIN ip_location i ON l.ip = i.ip WHERE i.ip IS NULL;</code>
(または一部のデータベースでは EXCEPT
):MINUS
このセットベースの操作は、2 つのテーブル内の IP アドレス間の違いを直接見つけます。 構文は、特定のデータベース システム (Oracle の など) に応じて若干異なる場合があることに注意してください。MINUS
<code class="language-sql">SELECT ip FROM login_log EXCEPT SELECT ip FROM ip_location;</code>
パフォーマンスに関する考慮事項:
最適な方法は、データベース システム、テーブル サイズ、インデックス作成によって異なります。 は PostgreSQL で良好なパフォーマンスを発揮することがよくありますが、NOT EXISTS
は他のシステムでも効率的です。 LEFT JOIN
は簡潔にできますが、常に最速であるとは限りません。 特に大規模なデータセットの場合、大幅に時間がかかる可能性があるため、サブクエリでは EXCEPT
を使用しないでください。 両方のテーブルの NOT IN
列に適切なインデックスを作成することは、あらゆる場合のパフォーマンスにとって重要です。ip
以上が2 つのテーブル間で欠落している IP アドレスを見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。