JOINTURE SQL et les différents types de Jointures
Qu'est ce qu'un SQL JOIN
et quels sont les différents types?
Vous devez vous connecter pour publier un commentaire.
Qu'est ce qu'un SQL JOIN
et quels sont les différents types?
Vous devez vous connecter pour publier un commentaire.
Une illustration de W3schools:
Qu'est-ce que
SQL JOIN
?SQL JOIN
est une méthode pour récupérer les données à partir de deux ou plusieurs tables de base de données.Quels sont les différents
SQL JOIN
s ?Il y a un total de cinq
JOIN
s. Ils sont :1. REJOINDRE ou INNER JOIN :
Dans ce genre de
JOIN
, nous obtenons tous les enregistrements qui correspondent à la condition, dans les deux tables, et les enregistrements des deux tables qui ne correspondent pas, ne sont pas signalés.En d'autres termes,
INNER JOIN
est basée sur le fait que: SEULES les entrées correspondantes dans les DEUX tables DOIVENT être indiqués.Noter qu'un
JOIN
sans autreJOIN
mots-clés (commeINNER
,OUTER
,LEFT
, etc) est unINNER JOIN
. En d'autres termes,JOIN
estun sucre Syntaxique pour
INNER JOIN
(voir: Différence entre les REJOINDRE et INNER JOIN).2. JOINTURE EXTERNE :
OUTER JOIN
récupèreSoit,
les paires de lignes d'une table et de toutes les lignes dans l'autre table
Ou,
toutes les lignes de toutes les tables (il n'importe pas de savoir si ou non il existe une correspondance).
Il existe trois types de Jointure Externe :
2.1 JOINTURE EXTERNE GAUCHE ou de GAUCHE à REJOINDRE
Cette jointure renvoie toutes les lignes de la table de gauche en conjonction avec la mise en correspondance des lignes de la
table de droite. Si il n'y a pas de colonnes correspondant dans le tableau de droite, il retourne
NULL
valeurs.2.2 JOINTURE EXTERNE DROITE de DROITE ou de REJOINDRE
Ce
JOIN
renvoie toutes les lignes de la table de droite, en conjonction avec la mise en correspondance des lignes de latable de gauche. Si il n'y a pas de colonnes correspondant dans la table de gauche, il retourne
NULL
valeurs.2.3 JOINTURE EXTERNE COMPLÈTE ou COMPLÈTE de REJOINDRE
Ce
JOIN
combineLEFT OUTER JOIN
etRIGHT OUTER JOIN
. Il renvoie des lignes de tableau lorsque les conditions sont remplies et retourneNULL
valeur quand il n'y a pas de match.En d'autres termes,
OUTER JOIN
est basée sur le fait que: SEULES les entrées correspondantes dans l'UN DES tableaux (à DROITE ou à GAUCHE) ou les DEUX tableaux(COMPLET) DOIVENT être indiqués.3. JOINTURE NATURELLE :
Elle est basée sur deux conditions :
JOIN
est faite sur toutes les colonnes avec le même nom pour l'égalité.Cela semble être plus de nature théorique et comme un résultat (probablement) la plupart des SGBD
ne pensez même pas à l'appui de cette.
4. JOINTURE CROISÉE :
Il est le produit Cartésien des deux tables impliquées. Le résultat d'une
CROSS JOIN
ne fera pas de sensdans la plupart des situations. En outre, nous n'avons pas besoin (ou les besoins du moins, pour être précis).
5. AUTO-JOINTURE :
Il n'est pas une forme différente de
JOIN
, c'est plutôt unJOIN
(INNER
,OUTER
, etc) d'une table à elle-même.Rejoint basée sur les Opérateurs
Selon l'opérateur utilisé pour un
JOIN
clause, il peut y avoir deux types deJOIN
s. Ils sont1. Equi REJOINDRE :
Pour quelque
JOIN
type (INNER
,OUTER
, etc), si nous utilisons UNIQUEMENT de l'opérateur d'égalité (=), alors nous disons quele
JOIN
est unEQUI JOIN
.2. Théta-JOINTURE :
Ce sont les mêmes que
EQUI JOIN
mais elle permet à tous les autres opérateurs comme >, <, >= etc.Définition:
Les JOINTURES façon d'interroger les données combinées de plusieurs tables simultanément.
Types de JOINTURES:
Préoccupation de SGBDR il y a 5 types de jointures:
Équi-Jointure: Combine commun les enregistrements de deux tables en fonction de la condition d'égalité.
Techniquement, Rejoindre fait en utilisant l'égalité-opérateur (=) pour comparer les valeurs de la Clé Primaire d'une table et les valeurs de Clé Étrangère d'une autre table, donc résultat inclut commun(adapté) les enregistrements des deux tables. Pour la mise en œuvre voir l'INTÉRIEUR de la REJOINDRE.
Naturel-Join: C'est une version améliorée de l'Équi-Jointure, dans lequel SÉLECTIONNEZ
opération omet en double colonne. Pour la mise en œuvre voir l'INTÉRIEUR de la REJOINDRE
Non Équi-Jointure: C'est l'inverse de l'Équi-jointure où joindre à condition usages autres que l'opérateur égal(=) e.g, !=, <=, >=, >, < ou ENTRE les etc. Pour la mise en œuvre voir l'INTÉRIEUR de la REJOINDRE.
Auto-Jointure:: Un comportement personnalisé de rejoindre où une table de combiner avec lui-même; Ce qui est généralement nécessaire pour l'interrogation de l'auto-référencement des tables (ou de l'entité de relation Unaire).
Pour la mise en œuvre voir l'INTÉRIEUR de la Rejoint.
Produit cartésien: croix combine tous les enregistrements de deux tables sans aucune condition. Techniquement, il retourne le résultat d'une requête sans Clause where.
Comme par SQL préoccupation et de progrès, il y a 3 types de jointures et de tous les SGBDR se joint peut être réalisé à l'aide de ces types de jointures.
INTÉRIEURE-JOIN: Elle se confond(ou combine) appariés lignes de deux tables. La correspondance se fait sur la base commune des colonnes de tables et de leur comparaison opération. Si à l'égalité, condition: ÉQUI-JOINTURE exécutée, sinon Non ÉQUI-Jointure.
**OUTER-JOIN:**Elle se confond(ou combine) appariés lignes de deux tables et lignes sans correspondance avec les valeurs NULL. Cependant, peut-sélection personnalisée de non-correspondance des lignes e.g, la sélection inégalée de ligne de la première table ou de la deuxième table par sous-types: JOINTURE EXTERNE GAUCHE et à DROITE de la JOINTURE EXTERNE.
2.1. JOINTURE Externe GAUCHE (un.k.une, GAUCHE-JOIN): Retourne les lignes correspondantes forme de deux tables et inégalée à partir de la table de GAUCHE(j'.e, premier tableau) seulement.
2.2. JOINTURE Externe DROITE (un.k.un, DROIT-JOIN): Retourne les lignes correspondantes à partir de deux tables et inégalée à partir de la table de DROITE seulement.
2.3. JOINTURE EXTERNE COMPLÈTE (un.k.une JOINTURE EXTERNE): Retourne appariés et inégalée de deux tables.
De la CROIX-JOIN: Cette jointure ne fusionne/combine au lieu de cela, il effectue le produit Cartésien.
Remarque: l'Auto-JOINTURE peut être obtenu soit par INNER JOIN, OUTER-JOIN et de la CROIX-JOINTURE basée sur l'exigence, mais de la table doit joindre à lui-même.
Pour plus d'informations:
Exemples:
1.1: INTÉRIEUR-JOIN: Équi-jointure de la mise en œuvre
1.2: INTÉRIEUR-JOIN: Naturel-REJOIGNEZ la mise en œuvre
1.3: l'INTÉRIEUR de la JOINTURE avec le NON-Équi-jointure de la mise en œuvre
1.4: INTÉRIEUR-JOINTURE avec AUTO-JOINTURE
2.1: OUTER JOIN (jointure externe complète)
2.2: LEFT JOIN
2.3: RIGHT JOIN
3.1: LA CROIX REJOINDRE
3.2: CROSS JOIN-Auto REJOINDRE
//OU//
intersect
/except
/union
; ici, les cercles sont les lignes retournées parleft
&right
join
, comme les étiquettes autocollantes numérotées dire. Le A X B image est un non-sens.cross join
=inner join on 1=1
& est un cas particulier du premier diagramme.UNION JOIN
. Maintenant obsolète dans SQL:2003.Il est intéressant de noter la plupart des autres réponses souffrent de ces deux problèmes:
J'ai récemment écrit un article sur le sujet: Probablement Incomplète, Guide Complet sur les Différentes Façons de JOINDRE des Tables en SQL, que je vais résumer ici.
D'abord et avant tout: les Jointures sont les produits cartésiens
C'est pourquoi des diagrammes de Venn les expliquer de manière inexacte, car une JOINTURE crée un produit cartésien entre les deux tables jointes. Wikipédia illustre bien:
La syntaxe SQL pour les produits cartésiens est
CROSS JOIN
. Par exemple:Qui combine toutes les lignes d'une table avec toutes les lignes de l'autre table:
Source:
Résultat:
Si nous suffit d'écrire une liste séparée par des virgules de tables, nous allons obtenir le même:
JOINTURE INTERNE (Theta-JOINTURE)
Un
INNER JOIN
est juste un filtréeCROSS JOIN
où le prédicat de filtre est appeléTheta
dans l'algèbre relationnelle.Par exemple:
Noter que le mot-clé
INNER
est facultatif (sauf dans MS Access).(regardez l'article pour le résultat des exemples)
EQUI REJOINDRE
Un type spécial de Theta-JOINTURE est équi REJOINDRE, que nous utilisons le plus. Le prédicat se joint à la clé primaire d'une table avec la clé étrangère d'une autre table. Si nous utilisons la Sakila base de données à des fins d'illustration, nous pouvons écrire:
Cette combine tous les acteurs avec leurs films.
Ou également, sur certaines bases de données:
La
USING()
syntaxe permet de spécifier une colonne qui doit être présent sur chaque côté d'une opération de JOINTURE de tables et crée un prédicat d'égalité sur les deux colonnes.JOINTURE NATURELLE
D'autres réponses ont listé ce "type de JOINTURE" séparément, mais qui n'a pas de sens. C'est juste une syntaxe de la forme de sucre pour equi REJOINDRE, ce qui est un cas particulier de Theta-JOINTURE ou une JOINTURE INTERNE. JOINTURE NATURELLE tout simplement recueille tous colonnes qui sont communs aux deux tables jointes et rejoint
USING()
ces colonnes. Qui n'est presque jamais utile, en raison des accidents de matchs (commeLAST_UPDATE
colonnes dans la Sakila base de données).Voici la syntaxe:
JOINTURE EXTERNE
Maintenant,
OUTER JOIN
est un peu différent deINNER JOIN
car elle crée unUNION
de plusieurs produits cartésiens. On peut écrire:Personne ne veut écrire le dernier, donc nous écrire
OUTER JOIN
(ce qui est généralement mieux optimisé pour les bases de données).Comme
INNER
, le mot-cléOUTER
est facultatif, ici.OUTER JOIN
est disponible en trois saveurs:LEFT [ OUTER ] JOIN
: La table de gauche de laJOIN
expression est ajoutée à l'union, comme indiqué ci-dessus.RIGHT [ OUTER ] JOIN
: La table de droite de laJOIN
expression est ajoutée à l'union, comme indiqué ci-dessus.FULL [ OUTER ] JOIN
: Les deux tables de laJOIN
expression sont ajoutés à l'union, comme indiqué ci-dessus.Tous ces éléments peuvent être combinés avec le mot-clé
USING()
ou avecNATURAL
(En fait, j'ai eu un monde réel de cas d'utilisation pour unNATUREL FULL JOIN
récemment)Alternative syntaxes
Il y a quelques historique, obsolète syntaxes dans Oracle et SQL Server, qui a soutenu
OUTER JOIN
déjà avant le SQL standard a une syntaxe de cette:Cela dit, ne pas utiliser cette syntaxe. Je viens de lister ici de sorte que vous pouvez le reconnaître à partir de vieux billets de blog /legacy code.
Partitionné
OUTER JOIN
Peu de gens le savent, mais la norme SQL spécifie partitionné
OUTER JOIN
(et Oracle met en œuvre). Vous pouvez écrire des choses comme ceci:Parties du résultat:
Le point ici est que toutes les lignes de la partitionné côté de la jointure du vent dans le résultat, peu importe si le
JOIN
appariés quelque chose de "de l'autre côté de la JOINTURE". Longue histoire courte: C'est pour combler le peu de données dans les rapports. Très utile!SEMI JOIN
Au sérieux? Pas d'autre réponse obtenu cela? Bien sûr que non, car il n'est pas originaire de la syntaxe SQL, malheureusement (tout comme ANTI JOINDRE ci-dessous). Mais nous pouvons utiliser
IN()
etEXISTS()
, par exemple, pour rechercher tous les acteurs qui ont joué dans des films:La
WHERE a.actor_id = fa.actor_id
prédicat agit en tant que semi-prédicat de jointure. Si vous ne le croyez pas, consultez les plans d'exécution, par exemple dans Oracle. Vous verrez que la base de données exécute un DEMI opération de JOINTURE, pas laEXISTS()
prédicat.ANTI REJOINDRE
C'est tout le contraire de la SEMI-JOINTURE (attention à ne pas utiliser
PAS
si, car elle a une importante mise en garde)Voici tous les acteurs sans films:
Certaines personnes (en particulier MySQL personnes) aussi écrire des ANTI REJOINDRE comme ceci:
Je pense que les raisons historiques, est la performance.
LATÉRALE REJOINDRE
OMG c'est trop cool. Je suis le seul à le mentionner? Voici un endroit frais requête:
Il va retrouver le TOP 5 des recettes de produire des films par acteur. Chaque fois que vous avez besoin d'un TOP-N-par-quelque chose de requête,
LATERAL JOIN
sera votre ami. Si vous êtes un Serveur SQL personne, alors vous savez ceJOIN
type sous le nom deAPPLY
OK, peut-être que c'est de la triche, car un
LATERAL JOIN
ouAPPLY
expression est vraiment un "sous-requête en corrélation" qui produit plusieurs lignes. Mais si nous permettons de "sous-requêtes corrélées", on peut parler aussi...MULTISET
Ce n'est vraiment mis en œuvre par Oracle et Informix (à ma connaissance), mais il peut être émulée dans PostgreSQL à l'aide de tableaux et/ou XML et SQL Server à l'aide de XML.
MULTISET
produit une sous-requête en corrélation et les nids de l'ensemble des lignes de la requête externe. La requête ci-dessous permet de sélectionner tous les acteurs et pour chaque acteur de la collecte de leurs films dans une collection imbriquées:Comme vous l'avez vu, il y a plusieurs types de JOINTURE que la "ennuyeux"
INNER
,OUTER
, etCROSS JOIN
qui sont généralement mentionnés. Plus de détails dans mon article. Et s'il vous plaît, cessez d'utiliser des diagrammes de Venn pour l'illustrer.J'ai créé une illustration qui explique mieux que des mots, à mon avis:
Je vais pousser ma bête noire: à l'AIDE de mots clés.
Si les deux tables sur les deux côtés de la JOINTURE ont leurs clés étrangères nommé correctement (c'est à dire, même nom, et pas seulement "id), alors ce peut être utilisée:
Je trouve cela très pratique, lisible, et ne les utilise pas assez souvent.