Maison > base de données > tutoriel mysql > le corps du texte

IN vs EXISTS dans SQL : comprendre les performances et l'utilisation

DDD
Libérer: 2024-09-14 06:19:37
original
693 Les gens l'ont consulté

IN vs EXISTS in SQL: Understanding Performance and Usage

IN vs EXISTS dans MySQL : un exemple pratique et une description

Dans MySQL, IN et EXISTS sont utilisés dans les requêtes pour filtrer les données en fonction de la présence de lignes dans une sous-requête. Cependant, ils fonctionnent de différentes manières et le choix entre eux peut avoir un impact sur les performances des requêtes. Décomposons leurs différences avec des explications et des exemples pratiques.


1. Clause IN

  • Description :
    La clause IN est utilisée pour filtrer les lignes selon que la valeur d'une colonne correspond à une valeur d'une liste ou d'une sous-requête. Il vérifie les valeurs correspondantes de la requête interne et les compare à la requête externe.

  • Performances :
    La clause IN est généralement efficace lorsque la sous-requête renvoie un petit nombre d'enregistrements. Cependant, si la sous-requête renvoie un ensemble de données volumineux, IN peut devenir plus lent.

  • Syntaxe :

  SELECT columns 
  FROM table 
  WHERE column IN (subquery);
Copier après la connexion

2. Clause EXISTE

  • Description :
    La clause EXISTS vérifie l'existence des lignes renvoyées par une sous-requête. Si la sous-requête renvoie une ligne, EXISTS est évalué à TRUE et la requête externe continue. Il ne se soucie pas du contenu des lignes mais seulement de leur existence.

  • Performances :
    EXISTS est généralement plus rapide pour les grands ensembles de données, car il arrête le traitement une fois qu'il trouve une correspondance. Cela le rend efficace lorsque vous travaillez avec des sous-requêtes qui renvoient de nombreuses lignes.

  • Syntaxe :

  SELECT columns 
  FROM table 
  WHERE EXISTS (subquery);
Copier après la connexion

Exemple pratique

Considérons deux tableaux : les clients et les commandes.

Tableau des clients :

customer_id customer_name
1 John Doe
2 Jane Smith
3 Alice Brown

Tableau des commandes :

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.


Using the IN Clause

SELECT customer_name 
FROM customers 
WHERE customer_id IN (SELECT customer_id FROM orders);
Copier après la connexion
Copier après la connexion

Explanation:

  • The subquery (SELECT customer_id FROM orders) returns all customer IDs that appear in the orders table.
  • The outer query selects customers whose customer_id is in that result set.

Result:
| customer_name |
|---------------|
| John Doe |
| Jane Smith |


Using the EXISTS Clause

SELECT customer_name 
FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
Copier après la connexion
Copier après la connexion

Explanation:

  • The subquery SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id checks whether any row in the orders table matches the customer_id of the current row from the customers table.
  • If any match is found, EXISTS returns TRUE, and the customer is included in the result.

Result:
| customer_name |
|---------------|
| John Doe |
| Jane Smith |


Key Differences

  1. Return Values:

    • IN: Compares the values of a column with the result set of the subquery.
    • EXISTS: Returns TRUE or FALSE based on whether the subquery returns any rows.
  2. Efficiency:

    • IN is more efficient for smaller datasets.
    • EXISTS is faster for large datasets, especially when the subquery returns many rows.
  3. Use Case:

    • Use IN when you're comparing a column’s value against a small list of possible values.
    • Use EXISTS when you're checking for the presence of rows in a subquery (e.g., when there's a correlation between the outer and inner queries).

Performance Example

Assume we have:

  • 10,000 customers
  • 100,000 orders

Query with IN:

SELECT customer_name 
FROM customers 
WHERE customer_id IN (SELECT customer_id FROM orders);
Copier après la connexion
Copier après la connexion
  • Execution: MySQL will retrieve the entire result set from the subquery and compare it with each row in the outer query.

Query with EXISTS:

SELECT customer_name 
FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
Copier après la connexion
Copier après la connexion
  • Execution: MySQL will check each row in the outer query and stop once it finds a matching row in the subquery, making it faster for large datasets.

Conclusion

  • Use IN when you have a simple list to compare or a small subquery result.
  • Use EXISTS when you’re dealing with large datasets or need to check for the presence of related data in a subquery.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!