MySQL では、サブクエリ内の行の存在に基づいてデータをフィルタリングするために、クエリで IN と EXISTS の両方が使用されます。ただし、それらは異なる方法で動作するため、どちらを選択するかによってクエリのパフォーマンスに影響を与える可能性があります。説明と実際の例を使用して、それらの違いを詳しく見てみましょう。
説明:
IN 句は、列の値がリストまたはサブクエリ内の値と一致するかどうかに基づいて行をフィルター処理するために使用されます。内部クエリからの一致する値をチェックし、それらを外部クエリと比較します。
パフォーマンス:
IN 句は通常、サブクエリが少数のレコードを返す場合に効率的です。ただし、サブクエリが大きなデータセットを返す場合、IN は遅くなる可能性があります。
構文:
SELECT columns FROM table WHERE column IN (subquery);
説明:
EXISTS 句は、サブクエリによって返された行の存在をチェックします。サブクエリが行を返す場合、EXISTS は TRUE と評価され、外側のクエリが続行されます。行の内容は考慮されず、行が存在するかどうかのみが考慮されます。
パフォーマンス:
EXISTS は、一致が見つかると処理を停止するため、大規模なデータセットの場合は通常より高速です。これにより、多くの行を返すサブクエリを操作する場合に効率的になります。
構文:
SELECT columns FROM table WHERE EXISTS (subquery);
顧客と注文という 2 つのテーブルを考えてみましょう。
customer_id | customer_name |
---|---|
1 | John Doe |
2 | Jane Smith |
3 | Alice Brown |
order_id | customer_id | order_total |
---|---|---|
1 | 1 | 200 |
2 | 1 | 150 |
3 | 2 | 300 |
We want to find all customers who have placed at least one order.
SELECT customer_name FROM customers WHERE customer_id IN (SELECT customer_id FROM orders);
Explanation:
Result:
| customer_name |
|---------------|
| John Doe |
| Jane Smith |
SELECT customer_name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
Explanation:
Result:
| customer_name |
|---------------|
| John Doe |
| Jane Smith |
Return Values:
Efficiency:
Use Case:
Assume we have:
Query with IN:
SELECT customer_name FROM customers WHERE customer_id IN (SELECT customer_id FROM orders);
Query with EXISTS:
SELECT customer_name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
以上がSQL の IN と EXISTS: パフォーマンスと使用法を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。