SQL JOIN est une clause utilisée pour combiner plusieurs tables et récupérer des données basées sur un champ commun dans les bases de données relationnelles. Les professionnels des bases de données utilisent les normalisations pour garantir et améliorer l'intégrité des données. Dans les différentes formes de normalisation, les données sont réparties dans plusieurs tables logiques. Ces tables utilisent des contraintes référentielles (clé primaire et clés étrangères) pour appliquer l'intégrité des données dans les tables SQL Server. Dans l'image ci-dessous, nous avons un aperçu du processus de normalisation de la base de données.
Comprendre les différents types de JOIN SQL
SQL JOIN génère des données significatives en combinant plusieurs tables relationnelles. Ces tables sont liées à l'aide d'une clé et ont des relations un à un ou un à plusieurs. Pour récupérer les données correctes, vous devez connaître les exigences en matière de données et les mécanismes de jointure corrects. SQL Server prend en charge plusieurs jointures et chaque méthode a une manière spécifique de récupérer des données à partir de plusieurs tables. L'image ci-dessous spécifie les jointures SQL Server prises en charge.
Jointure interne SQL
La jointure interne SQL inclut les lignes des tables où les conditions de jointure sont satisfaites. Par exemple, dans le diagramme de Venn ci-dessous, la jointure interne renvoie les lignes correspondantes de la table A et de la table B.
Dans l'exemple ci-dessous, notez les choses suivantes :
- Nous avons deux tables :[Employés] et [Adresse].
- La requête SQL est jointe sur les colonnes [Employés].[EmpID] et [Adresse].[ID].
La sortie de la requête renvoie les enregistrements d'employés pour EmpID qui existent dans les deux tables.
La jointure interne renvoie les lignes correspondantes des deux tables ; par conséquent, il est également connu sous le nom de jointure Equi. Si nous ne spécifions pas le mot-clé interne, SQL Server effectue l'opération de jointure interne.
Dans un autre type de jointure interne, une jointure thêta, nous n'utilisons pas l'opérateur d'égalité (=) dans la clause ON. Au lieu de cela, nous utilisons des opérateurs de non-égalité tels que
SELECT * FROM Table1 T1, Table2 T2 WHERE T1.Price
Dans une jointure réflexive, SQL Server joint la table avec lui-même. Cela signifie que le nom de la table apparaît deux fois dans la clause from.
Ci-dessous, nous avons une table [Emp] qui contient les employés ainsi que les données de leurs managers. L'auto-jointure est utile pour interroger des données hiérarchiques. Par exemple, dans la table des employés, nous pouvons utiliser l'auto-jointure pour connaître chaque employé et le nom de son responsable hiérarchique.
La requête ci-dessus place une auto-jointure sur la table [Emp]. Il joint la colonne EmpMgrID à la colonne EmpID et renvoie les lignes correspondantes.
Dans la jointure croisée, SQL Server renvoie un produit cartésien à partir des deux tables. Par exemple, dans l'image ci-dessous, nous avons effectué une jointure croisée pour les tables A et B.
La jointure croisée relie chaque ligne de la table A à chaque ligne disponible dans la table B. Par conséquent, la sortie est également connue sous le nom de produit cartésien des deux tables. Dans l'image ci-dessous, notez ce qui suit :
Dans la sortie de jointure croisée, la ligne 1 de la table [Employé] se joint à toutes les lignes de la table [Adresse] et suit le même modèle pour les lignes restantes.
Si la première table a x nombre de lignes et que la deuxième table a n nombre de lignes, la jointure croisée donne x*n nombre de lignes dans la sortie. Vous devez éviter les jointures croisées sur des tables plus volumineuses, car elles peuvent renvoyer un grand nombre d'enregistrements et SQL Server nécessite une grande puissance de calcul (processeur, mémoire et E/S) pour gérer des données aussi volumineuses.
Comme nous l'avons expliqué précédemment, la jointure interne renvoie les lignes correspondantes des deux tables. Lors de l'utilisation d'une jointure externe SQL, non seulement elle répertorie les lignes correspondantes, mais elle renvoie également les lignes sans correspondance des autres tables. La ligne sans correspondance dépend des mots-clés de gauche, de droite ou complets.
L'image ci-dessous décrit à un niveau élevé la jointure externe gauche, droite et complète.
La jointure externe gauche SQL renvoie les lignes correspondantes des deux tables ainsi que les lignes sans correspondance de la table de gauche. Si un enregistrement de la table de gauche n'a pas de lignes correspondantes dans la table de droite, il affiche l'enregistrement avec des valeurs NULL.
Dans l'exemple ci-dessous, la jointure externe gauche renvoie les lignes suivantes :
La jointure externe droite SQL renvoie les lignes correspondantes des deux tables ainsi que les lignes sans correspondance de la table de droite. Si un enregistrement de la table de droite n'a pas de lignes correspondantes dans la table de gauche, il affiche l'enregistrement avec des valeurs NULL.
Dans l'exemple ci-dessous, nous avons les lignes de sortie suivantes :
Une jointure externe complète renvoie les lignes suivantes dans la sortie :
Dans les exemples précédents, nous utilisons deux tables dans une requête SQL pour effectuer des opérations de jointure. Généralement, nous joignons plusieurs tables ensemble et cela renvoie les données pertinentes.
La requête ci-dessous utilise plusieurs jointures internes.
Analysons la requête dans les étapes suivantes :
Une fois que vous avez exécuté la requête avec plusieurs jointures, l'optimiseur de requête prépare le plan d'exécution. Il prépare un plan d'exécution à coût optimisé satisfaisant aux conditions de jointure avec l'utilisation des ressources. Par exemple, dans le plan d'exécution réel ci-dessous, nous pouvons examiner plusieurs boucles imbriquées (jointure interne) et une correspondance de hachage (jointure interne) combinant des données de plusieurs tables de jointure. .
Supposons que nous ayons des valeurs NULL dans les colonnes de la table et que nous joignons les tables sur ces colonnes. SQL Server correspond-il aux valeurs NULL ?
Les valeurs NULL ne correspondent pas entre elles. Par conséquent, SQL Server n'a pas pu renvoyer la ligne correspondante. Dans l'exemple ci-dessous, nous avons NULL dans la colonne EmpID de la table [Employés]. Par conséquent, dans la sortie, il renvoie la ligne correspondante pour [EmpID] 2 uniquement.
Nous pouvons obtenir cette ligne NULL dans la sortie en cas de jointure externe SQL car elle renvoie également les lignes sans correspondance.
Dans cet article, nous avons exploré les différents types de jointures SQL. Voici quelques bonnes pratiques importantes à retenir et à appliquer lors de l'utilisation de jointures SQL.Auto-jointure SQL
Jointure croisée SQL
Jointure externe SQL
Jointure externe gauche
Jointure externe droite
Jointure externe complète
Joint SQL avec plusieurs tables
USE [AdventureWorks2019]
GO
SELECT
e.[BusinessEntityID]
,p.[FirstName]
,p.[MiddleName]
,p.[LastName]
,e.[JobTitle]
,d.[Name] AS [Department]
,d.[GroupName]
,edh.[StartDate]
FROM [HumanResources].[Employee] e
INNER JOIN [Person].[Person] p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
INNER JOIN [HumanResources].[EmployeeDepartmentHistory] edh
ON e.[BusinessEntityID] = edh.[BusinessEntityID]
INNER JOIN [HumanResources].[Department] d
ON edh.[DepartmentID] = d.[DepartmentID]
WHERE edh.EndDate IS NULL
GO
Valeurs NULL et jointures SQL
Bonnes pratiques de jointure SQL