Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Un aperçu des types de jointure SQL avec des exemples

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

Auto-jointure SQL

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.

Jointure croisée SQL

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 :

  • Le tableau [Employé] comporte trois lignes pour les ID d'emploi 1, 2 et 3.
  • La table [Adresse] contient des enregistrements pour les ID d'emploi 1, 2, 7 et 8.

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.

Jointure externe SQL

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.

Jointure externe gauche

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 :

  • Lignes correspondantes :Emp ID 1 et 2 existent dans les tables de gauche et de droite.
  • Ligne sans correspondance :l'Emp ID 3 n'existe pas dans la bonne table. Par conséquent, nous avons une valeur NULL dans la sortie de la requête.

Jointure externe droite

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 :

  • Lignes correspondantes :Emp ID 1 et 2 existent dans les deux tables ; par conséquent, ces lignes sont des lignes correspondantes.
  • Lignes sans correspondance :dans le tableau de droite, nous avons des lignes supplémentaires pour les Emp ID 7 et 8, mais ces lignes ne sont pas disponibles dans le tableau de gauche. Par conséquent, nous obtenons la valeur NULL dans la jointure externe droite pour ces lignes.

Jointure externe complète

Une jointure externe complète renvoie les lignes suivantes dans la sortie :

  • Lignes correspondantes entre deux tableaux.
  • Lignes sans correspondance similaires à la jointure externe gauche :valeurs NULL pour les lignes sans correspondance de la table de droite.
  • Lignes sans correspondance similaires à la jointure externe droite :valeurs nulles pour les lignes sans correspondance de la table de gauche.

Joint SQL avec plusieurs tables

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.

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

Analysons la requête dans les étapes suivantes :

  • Résultat intermédiaire 1 :  La première jointure interne est entre [HumanResources].[Employees] et [Person].[Person] table.
  • Résultat intermédiaire 2 :  Jointure interne entre la table [Résultat intermédiaire 1] et [Ressourceshumaines].[HistoriqueDépartementEmployé].
  • Résultat intermédiaire 3 :  Jointure interne entre la table [Résultat intermédiaire 2] et [Ressources Humaines].[Département].

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. .

Valeurs NULL et jointures SQL

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.

Bonnes pratiques de jointure SQL

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.

  • Les jointures internes génèrent les lignes correspondantes de la condition de jointure dans les deux tables.
  • La jointure croisée renvoie le produit cartésien des deux tables.
  • La jointure externe renvoie les lignes correspondantes et non correspondantes en fonction des mots clés de gauche, de droite et complets.
  • L'auto-jointure SQL joint une table à elle-même.
  • Vous devez toujours utiliser un alias de table lors de l'utilisation des jointures dans les requêtes.
  • Utilisez toujours le format de nom en deux parties [alias de table].[colonne] pour les colonnes dans les requêtes.
  • Dans le cas de plusieurs jointures SQL dans une requête, vous devez utiliser les ordres logiques des tables de manière à satisfaire vos besoins en données et à minimiser le flux de données entre les différents opérateurs du plan d'exécution.
  • Vous pouvez combiner plusieurs jointures telles que la jointure interne, la jointure externe et l'auto-jointure. Cependant, vous devez utiliser les jointures et leurs ordres pour obtenir les données requises.