Dans la section précédente, nous avons examiné les moyens les plus simples de combiner des tables - en utilisant les phrases WHERE et INNER JOIN. Ces combinaisons sont appelées combinaisons internes ou combinaisons d'équivalence. Cependant, SQL a dans son arsenal beaucoup plus d'options pour joindre des tables, à savoir qu'il existe également d'autres types de jointures : les jointures externes, les jointures naturelles et les auto-jointures. Mais d'abord, voyons comment attribuer des alias aux tables, car plus tard nous serons obligés d'utiliser des noms complets de champs (Table.Field), qui sans abréviations seront très difficiles à utiliser en raison de leur grande longueur.
Dans la section précédente, nous avons appris comment les alias peuvent être utilisés pour faire référence à des champs de table spécifiques ou à des champs calculés. SQL nous permet également d'utiliser des alias au lieu de noms de tables. Cela nous donne des avantages tels qu'une syntaxe SQL plus courte et nous permet d'utiliser la même table plusieurs fois dans l'instruction SELECT.
Run SQLSELECT Seller_name, SUM(Amount) AS Sum1
FROM Sellers AS S, Sumproduct AS SP
WHERE S.City = SP.City
GROUP BY Seller_name
Nous avons affiché le montant total des marchandises vendues pour chaque vendeur. Dans notre requête SQL, nous avons utilisé les alias suivants : pour le champ calculé SUM(Amount) l'alias Sum1, pour la table Sellers l'alias S et pour Sumproduct l'alias SP. Notez que les alias de table peuvent également être utilisés dans d'autres phrases, telles que ORDER BY, GROUP BY et autres.
Prenons un exemple. Disons que nous avons besoin de connaître l'adresse des vendeurs qui font du commerce dans le même pays que John Smith. Pour ce faire, nous allons créer la requête suivante :
Run SQLSELECT Address, City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country
FROM Sellers
WHERE Seller_name = 'John Smith')
De plus, nous pouvons résoudre ce problème grâce à l'auto-connexion en écrivant le code suivant :
Run SQLSELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'
Des pseudonymes ont été utilisés pour résoudre ce problème. La première fois, la table Sellers a reçu l'alias S1, la deuxième fois, l'alias S2. Ces alias peuvent ensuite être utilisés comme noms de table. Dans l'opérateur WHERE, nous ajoutons le préfixe S1 au nom de chaque champ, afin que le SGBD comprenne les champs de quelle table doit être sorti (puisque nous avons créé deux tables virtuelles à partir d'une seule table). La clause WHERE joint d'abord les tables puis filtre les données de la deuxième table par le champ Seller_name pour renvoyer uniquement les valeurs nécessaires.
Les auto-jointures sont souvent utilisées pour remplacer les sous-requêtes qui sélectionnent les données de la même table que l'opérateur externe SELECT. Bien que le résultat final soit le même, de nombreux SGBD traitent les jointures beaucoup plus rapidement que les sous-requêtes. Cela vaut la peine d'expérimenter pour déterminer quelle requête fonctionne le plus rapidement.
Une jointure naturelle est une jointure dans laquelle vous sélectionnez uniquement les colonnes qui ne se répètent pas. Cela se fait généralement en écrivant (SELECT *) pour une table et en spécifiant une liste de champs pour le reste des tables. Exemple:
Run SQLSELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S
WHERE SP.City = S.City
Dans cet exemple, le caractère générique (*) est utilisé uniquement pour le premier tableau. Toutes les autres colonnes sont spécifiées explicitement, donc les colonnes en double ne sont pas sélectionnées.
Habituellement, lors de la fusion, les lignes d'une table sont liées aux lignes correspondantes d'une autre table. Cependant, dans certains cas, il peut être nécessaire d'inclure dans le résultat des lignes qui n'ont pas de lignes liées dans une autre table (c'est-à-dire toutes les lignes d'une table sont sélectionnées et seules les lignes associées d'une autre sont ajoutées). Une connexion de ce type est dite externe. Pour cela, les mots-clés OUTER JOIN ... ON ... avec le préfixe LEFT ou RIGHT sont utilisés.
Prenons un exemple, après avoir précédemment ajouté un nouveau vendeur - Semuel Piter, qui n'a pas encore de ventes, à la table Sellers :
Run SQLSELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers2
LEFT OUTER JOIN Sumproduct
ON Sellers2.City = Sumproduct.City
GROUP BY Seller_name
Avec cette demande, nous avons extrait la liste de tous les vendeurs dans la base de données et calculé le montant total des marchandises vendues pour eux pour tous les mois. Nous constatons qu'il n'y a pas de ventes pour le nouveau vendeur Semuel Piter. Si nous utilisions une jointure interne, nous ne verrions pas le nouveau vendeur, car il n'a aucun enregistrement dans la table Sumproduct. On peut aussi changer le sens de la combinaison non seulement en écrivant LEFT ou RIGHT, mais aussi en changeant simplement l'ordre des tables (c'est-à-dire que les deux enregistrements suivants donneront le même résultat : Sellers LEFT OUTER JOIN Sumproduct et Sumproduct RIGHT OUTER JOIN S ellers).
De plus, certains SGBD autorisent les jointures externes sur un enregistrement simplifié en utilisant les signes *= et =*, ce qui correspond respectivement à LEFT OUTER JOIN et RIGHT OUTER JOIN. Ainsi, la requête précédente pourrait être réécrite comme suit :
SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City
Malheureusement, MS Access ne prend pas en charge un enregistrement raccourci pour une jointure externe.
Il existe également un autre type de jointure externe : une jointure externe complète, qui affiche toutes les lignes des deux tables et joint uniquement celles qui peuvent être liées. La syntaxe d'une jointure externe complète est la suivante :
SELECT Seller_name, Product
FROM Sellers
FULL OUTER JOIN Sumproduct
ON Sellers.City = Sumproduct.City
Encore une fois, la jointure externe complète n'est pas prise en charge par les SGBD suivants : MS Access, MySQL, SQL Server et Sybase. Comment contourner cette injustice, nous le verrons dans la section suivante.