Comportement et traitement des enregistrements contenant des valeurs NULL lors des opérations de JOIN en SQL

Dans cet article, nous allons expliquer le comportement des enregistrements contenant des valeurs NULL lors des opérations de JOIN en SQL, ainsi que les moyens de les traiter. Lors de la gestion des bases de données, les valeurs NULL représentent des données manquantes, ce qui peut entraîner des résultats inattendus lorsqu’elles sont incluses dans des opérations de JOIN. Cet article vous aidera à comprendre le comportement des valeurs NULL dans divers types de JOIN et à apprendre comment les traiter correctement pour garantir une manipulation précise des données.

Sommaire

Comportement de base des valeurs NULL lors des opérations de JOIN

Les valeurs NULL reçoivent un traitement particulier lors des opérations de JOIN en SQL. NULL indique « aucune valeur » et entraîne des résultats différents des valeurs ordinaires lors des comparaisons. Concrètement, une comparaison entre NULL et n’importe quelle autre valeur est toujours considérée comme fausse. Par conséquent, lorsque des conditions de JOIN incluent des valeurs NULL, les enregistrements correspondants peuvent ne pas être inclus dans le résultat du JOIN.

Principes de base de la comparaison des valeurs NULL

NULL signifie « valeur inconnue » et est considéré comme ne correspondant à aucune autre valeur lors des comparaisons. Par exemple, dans une requête comme celle-ci, les enregistrements contenant des valeurs NULL ne correspondent pas :

SELECT *
FROM table1
JOIN table2 ON table1.column = table2.column;

Dans cette requête, si table1.column ou table2.column contient des valeurs NULL, les lignes correspondantes ne seront pas incluses dans le résultat.

Impact des enregistrements contenant des valeurs NULL sur les résultats des JOIN

L’impact des enregistrements contenant des valeurs NULL sur les JOIN varie en fonction du type de JOIN utilisé. Nous détaillerons cela dans la section suivante.

Traitement des valeurs NULL dans les INNER JOIN

Les INNER JOIN n’incluent dans le résultat que les enregistrements qui satisfont aux conditions de jointure, de sorte que les enregistrements contenant des valeurs NULL dans les clés de jointure ne seront pas inclus dans le résultat. Cela peut entraîner la perte de données non intentionnelle.

Fonctionnement de base des INNER JOIN

Les INNER JOIN combinent uniquement les enregistrements des deux tables qui satisfont aux conditions spécifiées. Regardons un exemple :

SELECT *
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

Cette requête combine les tables employees et departments sur la colonne department_id. Si employees.department_id ou departments.department_id contient des valeurs NULL, ces enregistrements ne seront pas inclus dans le résultat.

Exemple concret

Par exemple, considérons les données suivantes :

Table employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Table departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Lorsqu’un INNER JOIN est exécuté sur ces données, les enregistrements contenant des valeurs NULL ne satisfont pas aux conditions de jointure, et le résultat est le suivant :

SELECT *
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

Résultat

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT

L’enregistrement de Bob est exclu du résultat car il contient une valeur NULL.

Traitement des valeurs NULL dans les LEFT JOIN

Les LEFT JOIN incluent tous les enregistrements de la table de gauche dans le résultat, et si les conditions de jointure ne sont pas satisfaites, ils complètent les valeurs de la table de droite avec NULL. Cela permet d’inclure les enregistrements contenant des valeurs NULL dans le résultat.

Fonctionnement de base des LEFT JOIN

Les LEFT JOIN conservent tous les enregistrements de la table de gauche et combinent les enregistrements correspondants de la table de droite. Si les conditions de jointure ne sont pas satisfaites, les valeurs de la table de droite sont complétées par NULL. Voici un exemple :

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Cette requête inclut tous les enregistrements de la table employees dans le résultat, et si les conditions de jointure ne sont pas satisfaites, les valeurs de la table departments sont complétées par NULL.

Exemple concret

Reprenons les mêmes données :

Table employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Table departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Lorsque le LEFT JOIN est exécuté, le résultat est le suivant :

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Résultat

employee_idnamedepartment_iddepartment_name
1Alice10HR
2BobNULLNULL
3Charlie20IT

L’enregistrement de Bob est inclus dans le résultat car il s’agit d’un LEFT JOIN, mais la colonne department_name est remplie par NULL car il n’existe pas de valeur correspondante dans la table departments.

Traitement des valeurs NULL dans les RIGHT JOIN

Les RIGHT JOIN incluent tous les enregistrements de la table de droite dans le résultat, et si les conditions de jointure ne sont pas satisfaites, ils complètent les valeurs de la table de gauche avec NULL. Cela donne la priorité aux enregistrements de la table de droite.

Fonctionnement de base des RIGHT JOIN

Les RIGHT JOIN conservent tous les enregistrements de la table de droite et combinent les enregistrements correspondants de la table de gauche. Si les conditions de jointure ne sont pas satisfaites, les valeurs de la table de gauche sont complétées par NULL. Voici un exemple :

SELECT *
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

Cette requête inclut tous les enregistrements de la table departments dans le résultat, et si les conditions de jointure ne sont pas satisfaites, les valeurs de la table employees sont complétées par NULL.

Exemple concret

Reprenons à nouveau les mêmes données :

Table employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Table departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Lorsque le RIGHT JOIN est exécuté, le résultat est le suivant :

SELECT *
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

Résultat

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT
NULLNULLNULLUnknown

Tous les enregistrements de la table departments sont inclus dans le résultat, et si une valeur correspondante n’existe pas dans la table employees, les valeurs sont complétées par NULL.

Traitement des valeurs NULL dans les FULL OUTER JOIN

Les FULL OUTER JOIN incluent tous les enregistrements des deux tables dans le résultat, et si les conditions de jointure ne sont pas satisfaites, ils complètent les valeurs des tables de gauche ou de droite avec NULL. Cela permet une jointure complète des enregistrements des deux tables.

Fonctionnement de base des FULL OUTER JOIN

Les FULL OUTER JOIN conservent tous les enregistrements des tables de gauche et de droite, et si les conditions de jointure ne sont pas satisfaites, les valeurs sont complétées par NULL. Voici un exemple :

SELECT *
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.department_id;

Cette requête inclut tous les enregistrements des tables employees et departments dans le résultat, et si les conditions de jointure ne sont pas satisfaites, les valeurs sont complétées par NULL.

Exemple concret

Vérifions le résultat en utilisant les mêmes données :

Table employees

employee_idnamedepartment_id
1Alice10
2BobNULL
3Charlie20

Table departments

department_iddepartment_name
10HR
20IT
NULLUnknown

Lorsqu’un FULL OUTER JOIN est exécuté, le résultat est le suivant :

SELECT *
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.department_id;

Résultat

employee_idnamedepartment_iddepartment_name
1Alice10HR
3Charlie20IT
2BobNULLNULL
NULLNULLNULLUnknown

Tous les enregistrements des deux tables sont inclus dans le résultat, et si les conditions de jointure ne sont pas satisfaites, les valeurs sont complétées par NULL.

Comment gérer les JOIN en tenant compte des valeurs NULL

Pour gérer correctement les enregistrements contenant des valeurs NULL lors des opérations de JOIN, il est nécessaire de manipuler judicieusement les requêtes SQL. Voici quelques méthodes pour effectuer des JOIN en tenant compte des valeurs NULL.

Utilisation de la fonction COALESCE

La fonction COALESCE permet de remplacer les valeurs NULL par d’autres valeurs. Cela évite que les valeurs NULL influencent les conditions de jointure. Par exemple, pour remplacer les valeurs NULL par 0, vous pouvez procéder ainsi :

SELECT *
FROM employees
JOIN departments ON COALESCE(employees.department_id, 0) = COALESCE(departments.department_id, 0);

Cette requête remplace les valeurs NULL par 0, ce qui permet de combiner correctement les enregistrements contenant des valeurs NULL.

Utilisation de IS NULL et IS NOT NULL

Pour filtrer les enregistrements contenant des valeurs NULL, vous pouvez utiliser IS NULL ou IS NOT NULL. Par exemple, pour ne combiner que les enregistrements ne contenant pas de valeurs NULL :

SELECT *
FROM employees
JOIN departments ON employees.department_id = departments.department_id
WHERE employees.department_id IS NOT NULL AND departments.department_id IS NOT NULL;

Cette requête ne combine que les enregistrements dont la colonne department_id n’est pas NULL.

Utilisation appropriée des LEFT JOIN et RIGHT JOIN

Si vous souhaitez inclure des enregistrements dans le résultat même si les conditions de jointure ne sont pas satisfaites, utilisez LEFT JOIN ou RIGHT JOIN. Cela permet d’inclure les enregistrements qui n’existent pas dans l’une des tables.

SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Cette requête inclut tous les enregistrements de la table employees dans le résultat, et si les valeurs correspondantes de la table departments n’existent pas, elles sont complétées par NULL.

Traitement des valeurs NULL avec la fonction COALESCE

La fonction COALESCE est utilisée pour remplacer les valeurs NULL par d’autres valeurs spécifiées. Cela permet de contrôler l’impact des valeurs NULL sur les opérations de JOIN et d’autres opérations SQL.

Syntaxe de base de la fonction COALESCE

La fonction COALESCE prend plusieurs arguments et retourne la première valeur non NULL. La syntaxe est la suivante :

COALESCE(value1, value2, ..., valueN)

Cette fonction retourne la première valeur non NULL parmi value1 à valueN. Si tous les arguments sont NULL, elle retourne NULL.

Exemple concret : Remplacement des valeurs NULL

Par exemple, pour remplacer les valeurs NULL de la colonne department_id de la table employees par 0 :

SELECT employee_id, name, COALESCE(department_id, 0) AS department_id
FROM employees;

Cette requête remplace les valeurs NULL de la colonne department_id par 0 dans le résultat.

Exemple d’utilisation de la fonction COALESCE dans les opérations de JOIN

Voici un exemple d’utilisation de la fonction COALESCE pour traiter les valeurs NULL lors des opérations de JOIN. Par exemple, pour combiner les tables employees et departments sur la colonne department_id, en remplaçant les valeurs NULL par 0 :

SELECT *
FROM employees
JOIN departments ON COALESCE(employees.department_id, 0) = COALESCE(departments.department_id, 0);

Cette requête remplace les valeurs NULL par 0 dans la colonne department_id avant de les combiner, ce qui permet de traiter correctement les enregistrements contenant des valeurs NULL.

Utilisation de la fonction COALESCE sur plusieurs colonnes

La fonction COALESCE peut également être utilisée sur plusieurs colonnes. Par exemple, pour obtenir la première valeur non NULL parmi plusieurs colonnes d’adresse :

SELECT employee_id, name, COALESCE(address1, address2, address3) AS address
FROM employees;

Cette requête retourne la première valeur non NULL parmi address1, address2 et address3 dans la colonne address.

Filtrage des valeurs NULL avec IS NULL/IS NOT NULL

Pour identifier ou exclure les enregistrements contenant des valeurs NULL dans une requête SQL, l’utilisation de IS NULL ou IS NOT NULL est efficace. Ces conditions permettent de filtrer les valeurs NULL de manière efficace.

Filtrage avec IS NULL

IS NULL sélectionne les enregistrements dont la colonne spécifiée contient une valeur NULL. Par exemple, pour sélectionner les enregistrements dont la colonne department_id est NULL dans la table employees :

SELECT *
FROM employees
WHERE department_id IS NULL;

Cette requête sélectionne tous les enregistrements dont la colonne department_id est NULL.

Filtrage avec IS NOT NULL

IS NOT NULL sélectionne les enregistrements dont la colonne spécifiée ne contient pas de valeur NULL. Par exemple, pour sélectionner les enregistrements dont la colonne department_id n’est pas NULL dans la table employees :

SELECT *
FROM employees
WHERE department_id IS NOT NULL;

Cette requête sélectionne tous les enregistrements dont la colonne department_id n’est pas NULL.

Utilisation de IS NULL/IS NOT NULL dans les opérations de JOIN

Pour traiter correctement les enregistrements contenant des valeurs NULL lors des opérations de JOIN, vous pouvez utiliser IS NULL ou IS NOT NULL. Par exemple, pour combiner les tables employees et departments et n’inclure dans le résultat que les enregistrements dont la colonne department_id n’est pas NULL :

SELECT *
FROM employees
JOIN departments ON employees.department_id = departments.department_id
WHERE employees.department_id IS NOT NULL AND departments.department_id IS NOT NULL;

Cette requête combine uniquement les enregistrements des deux tables dont la colonne department_id n’est pas NULL.

Comment traiter spécifiquement les valeurs NULL

Pour traiter spécifiquement les enregistrements contenant des valeurs NULL en fonction de certaines conditions, l’utilisation de la clause CASE est également efficace. Par exemple, pour appliquer un traitement spécifique aux enregistrements contenant des valeurs NULL :

SELECT employee_id, name, 
       CASE 
           WHEN department_id IS NULL THEN 'No Department' 
           ELSE department_id 
       END AS department
FROM employees;

Cette requête affiche « No Department » lorsque la colonne department_id contient une valeur NULL, et affiche la valeur réelle de department_id sinon.

Conclusion

Lors des opérations de JOIN en SQL, les enregistrements contenant des valeurs NULL sont traités de manière particulière, ce qui peut influencer les résultats de manière inattendue. Cet article a exploré le comportement des valeurs NULL dans différents types de JOIN (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN) et comment y remédier.

En particulier, nous avons introduit des méthodes telles que l’utilisation de la fonction COALESCE pour remplacer les valeurs NULL par d’autres valeurs, ainsi que l’utilisation de IS NULL et IS NOT NULL pour filtrer les valeurs NULL. En appliquant ces techniques, vous pouvez contrôler plus précisément les résultats des requêtes SQL et améliorer la fiabilité des opérations de données.

Comprendre et appliquer correctement le traitement des valeurs NULL lors des opérations de JOIN permet de réaliser des opérations de base de données plus robustes et cohérentes. Cela améliore la fiabilité des analyses de données et des applications, permettant ainsi d’extraire des informations plus précieuses.

Ceci conclut notre explication sur le comportement et le traitement des enregistrements contenant des valeurs NULL lors des opérations de JOIN en SQL.

Sommaire