Comment combiner les résultats de plusieurs tables SQL (indice: il y a trois façons)
Plusieurs fois dans une base de données relationnelle, les informations que vous souhaitez afficher dans votre requête se trouvent dans plus d’une table. Cela soulève la question « Comment combiner les résultats de plusieurs tables? »
Tous les exemples de cette leçon sont basés sur Microsoft SQL Server Management Studio et la base de données AdventureWorks2012. Vous pouvez commencer à utiliser ces derniers gratuitement outils utilisant mon guide Premiers pas avec SQL Server.
Comment puis-je combiner les résultats de plusieurs requêtes?
SQL ne serait pas un langage très utile s’il ne le faisait pas Ce n’est pas un moyen facile pour vous de combiner les résultats de plusieurs requêtes. Heureusement, il existe trois façons principales de combiner les données de plusieurs tables. Nous allons les passer brièvement en revue ici et fournir des liens vers des articles plus détaillés.
Trois façons principales de combiner des données
Les données des tables de bases de données relationnelles sont organisées en lignes et en colonnes. Lorsque nous étudions les moyens de combiner des données, gardez à l’esprit que le résultat final sera de soit ajouter plus de colonnes à un résultat, peut-être à partir d’une autre table liée, ou des lignes, en prenant un ensemble de lignes de deux ou plusieurs tables s.
Lorsque la plupart des gens apprennent à combiner des données, ils apprennent sur:
- JOIN – Vous pouvez utiliser des jointures pour combiner les colonnes d’une ou plusieurs requêtes en un seul résultat.
- UNION – Utilisez Unions et d’autres opérateurs d’ensemble pour combiner les lignes d’une ou plusieurs requêtes en un seul résultat.
- Sous-requêtes – Parfois appelées requêtes imbriquées, elles peuvent être utilisées pour effectuer une recherche distincte dans la base de données a montré que les résultats peuvent être utilisés dans une autre requête.
Jointures
J’aime penser aux jointures comme le ciment qui rassemble la base de données. Les bases de données relationnelles sont généralement normalisées pour faciliter la maintenance des données et améliorer les performances, mais le résultat final est que les informations sont séparées en plusieurs tables. Vous pouvez utiliser Joins pour recombiner ces informations dans un format plus lisible par l’homme. Les données sont recombinées en faisant correspondre les colonnes de chaque table.
Dans tous les cas, les jointures nécessitent deux ingrédients principaux: deux tables et une condition de jointure. Les tables sont ce que nous allons utiliser pour extraire les lignes et les colonnes et la condition de jointure est la façon dont nous avons l’intention de faire correspondre les colonnes entre les tables.
Exemple JOIN
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
Il existe deux principaux types de jointures. Jointures internes et jointures externes.
Les jointures internes ne renvoient une ligne résultante que si la condition de jointure correspond dans les deux tables. Les jointures internes sont principalement utilisées pour faire correspondre la clé primaire d’une table à une clé étrangère dans une autre.
Le deuxième type de jointure est une jointure externe. Les jointures externes renvoient toujours au moins une ligne pour la table principale, appelée table de gauche ou de droite, et des valeurs nulles dans les colonnes correspondantes de la colonne non correspondante. Les jointures externes sont utiles pour trouver des données qui ne correspondent pas.
Il est important de noter que les jointures peuvent renvoyer plus de lignes qu’il n’en existe dans l’une ou l’autre des tables combinées. Les jointures renvoient des combinaisons de correspondances. Si vous joignez deux tables, l’une contenant 5 lignes et l’autre 10, le résultat peut contenir de 0 à 50 lignes selon la condition de jointure.
Unions
Une UNION est utilisé pour combiner les lignes de deux requêtes ou plus en un seul résultat. L’Union est appelée un opérateur d’ensemble.
Il y a des conditions spéciales qui doivent se produire pour qu’une union fonctionne. Tout d’abord, chaque requête doit avoir le même nombre de colonnes. Deuxièmement, les types de données de ces colonnes doivent être compatibles. D’une manière générale, chaque requête doit renvoyer le même nombre et le même type de colonnes.
Un exemple pratique d’union est lorsque deux tables contiennent des numéros de pièce et que vous souhaitez créer une liste combinée pour un catalogue. Vous pouvez choisir que le résultat final soit une liste unique pour la requête combinée ou si vous utilisez UNION ALL renvoyer toutes les lignes de chaque table.
Exemple UNION
SELECT C.NameFROM Production.ProductCategory AS CUNIONSELECT S.NameFROM Production.ProductSubcategory AS S
En plus de Union, il existe quelques autres opérateurs d’ensemble pratiques:
- INTERSECT – Vous pouvez l’utiliser pour ne renvoyer que les lignes communes entre deux tables.
- SAUF – Vous pouvez l’utiliser pour renvoyer des lignes qui existent sur une table, mais qui ne se trouvent pas dans une autre.
Au fur et à mesure que vous apprenez plus de SQL, vous trouvez que vous pouvez utiliser des jointures pour écrire des instructions équivalentes pour Intersect et Except, mais il n’y a pas d’équivalents pour Union.
Sous-requêtes
Les sous-requêtes sont parfois appelées requêtes imbriquées. Ce sont des requêtes définies à l’intérieur d’autres requêtes. Les sous-requêtes peuvent prêter à confusion. Je pense que cela provient en grande partie du fait qu’ils peuvent être utilisés à de nombreux endroits dans une instruction SQL SELECT, et à plusieurs fins!
Par exemple, voici quelques zones où vous pouvez voir une sous-requête:
- – Utilisée pour renvoyer une valeur. Par exemple, si vous interrogez une table de ventes, vous pouvez inclure le total des ventes en renvoyant une somme de toutes les ventes à partir d’une sous-requête.
- Clause WHERE – Les sous-requêtes peuvent être utilisées dans la clause where dans les comparaisons. Vous pouvez configurer une comparaison pour comparer les ventes à la moyenne globale. La moyenne globale serait renvoyée à partir d’une sous-requête. Vous pouvez également utiliser des sous-requêtes dans les opérateurs d’appartenance tels que IN. Plutôt que de coder en dur la clause in, vous pouvez utiliser une sous-requête pour la rendre plus dynamique.
- Clause HAVING – Une seule valeur d’une sous-requête est incluse dans les comparaisons de clause HAVING.
Exemple de sous-requête
SELECT SalesOrderID, LineTotal, (SELECT AVG(LineTotal) FROM Sales.SalesOrderDetail) AS AverageLineTotalFROM Sales.SalesOrderDetail
Lorsqu’il est utilisé dans des clauses select et des opérateurs de comparaison tels que égal, supérieur à et inférieur à , une sous-requête ne peut renvoyer qu’une seule ligne. S’il est utilisé conjointement avec un opérateur d’appartenance, tel que IN, il est possible que la requête renvoie une ou plusieurs lignes.