Si j'écris simplement cette requête -
SELECT * FROM AA,BB WHERE AA.ID = BB.ID
alors quel genre de jointure ce sera. Si nous appliquons n'importe quel type de jointure, nous devons spécifier comme jointure interne, jointure externe, jointure croisée. Alors de quel type de jointure s'agit-il?
Et quelle est la différence réelle entre la jointure interne et la jointure croisée?
3 Réponses :
Votre requête représente une jointure interne. Par exemple, sur l'exemple de schéma de Scott, il joint les lignes des tables EMP
et DEPT
sur DEPTNO
(qui est une colonne commune): XXX
(vous pouvez omettre le mot-clé inner
).
Vous avez demandé quelle est la différence entre les jointures internes et croisées; la jointure croisée représente un produit cartésien, ce qui signifie que le résultat sera des paires de toutes les lignes de la première table avec toutes les lignes de la deuxième table:
SQL> select count(*) 2 from emp e, dept d 3 where e.deptno (+) = d.deptno; COUNT(*) ---------- 15 SQL>
Utilisation de "votre" ancienne syntaxe, c'est une jointure sans clause WHERE
:
SQL> select count(*) 2 from emp e right outer join dept d on e.deptno = d.deptno; COUNT(*) ---------- 15 SQL>
La jointure externe prendra des lignes qui ne le font pas avoir une «paire» dans une autre table. Dans le schéma de Scott, il s'agit du département 40 de la table DEPT car aucun employé n'y travaille:
SQL> select count(*) 2 from emp e, dept d; COUNT(*) ---------- 56 SQL>
L'ancien opérateur de jointure externe Oracle ( (+) code>) est quelque chose que vous pourriez encore voir quelque part:
SQL> select count(*) 2 from emp e cross join dept d; COUNT(*) ---------- 56 SQL>
En gros, vous devriez passer aux jointures modernes. Plus d'informations sur le sujet dans la documentation sur les jointures, ici: https : //docs.oracle.com/cd/B28359_01/server.111/b28286/queries006.htm#SQLRF52331 (version 11g; trouvez celle liée à la version de votre base de données, bien qu'il ne devrait rien y avoir révolutionnaire dans les versions plus récentes).
Les points anciens ou nouveaux sont valides, mais un développeur Oracle sérieux serait bien servi pour comprendre les deux. De nombreuses applications utilisent toujours l'ancienne syntaxe et de nombreux développeurs écrivent encore l'ancienne syntaxe. La base de données Oracle utilise encore un peu l'ancienne syntaxe de jointure externe en interne, et elle apparaît dans la liste de filtres d'EXPLAIN PLAN parfois là où on s'y attend le moins.
Je ne dirais pas «sérieux» mais «vieux», @Tad. Zillion lignes de mon code sont écrites en utilisant la "vieille" syntaxe (non, je ne vais pas les réécrire). C'est la façon dont Oracle a fait cela, et le fait toujours. Je sais que les anciens formulaires et rapports n'aiment pas les jointures ANSI 92, alors - c'est comme ça. Un gros inconvénient de l'ancienne jointure externe est son incapacité à joindre une table externe à plus qu'une autre table, donc - oui, j'aimerais suggérer à quiconque de passer à la nouvelle syntaxe lors de la séparation. jointures à partir de conditions . Juste mon point de vue.
@Littlefoot, c'est aussi mon point de vue - le nouveau code obtient la nouvelle syntaxe. Il permet plus de fonctionnalités, comme des jointures externes complètes, et un développeur qui l'utilise peut parler avec un développeur MySQL ou SQL Server à de meilleures conditions.
Vous avez demandé: Si j'écris simplement cette requête -
SELECT * FROM AA,BB WHERE AA.ID = BB.ID
alors de quel type de jointure ce sera? em >
c'est un INNER JOIN utilisant la syntaxe pré ANSI-92.
Si nous appliquons n'importe quel type de jointure, nous devons spécifier comme jointure interne, jointure externe, jointure croisée.
Uniquement si vous utilisez la syntaxe de jointure ANSI actuelle (ce que vous devriez être en 2019).
En fait, c'est une jointure croisée qui élimine les enregistrements en fonction de la clause where, ce qui la fait se comporter comme une jointure interne. Éliminez la clause where et vous obtenez chaque enregistrement de AA vers chaque enregistrement de BB.
Et quelle est la différence réelle entre la jointure interne et la jointure croisée? >
- Une jointure interne ne renvoie que les enregistrements EXISTANT ET LIÉS DANS les deux tables impliquées
- Une jointure croisée associe CHAQUE enregistrement d'une table à CHAQUE enregistrement de l'autre.
- Prenons par exemple deux tableaux (A, B, C) (A, B, D)
- un INNER JOIN renverrait l'ensemble {A.A, B.B} (2)
- une jointure croisée renverrait {A.A, A.B, A.D, B.A, B.B, B.D, C.A, C.B, C.D} (9)
Il semble que vous ne comprenez pas très bien les différents types de jointures. Globalement, il existe 5 types de jointures différents: INTÉRIEUR, GAUCHE EXTÉRIEUR, DROIT EXTÉRIEUR, PLEIN EXTÉRIEUR, CROISÉ. Je vais vous montrer un exemple des 5 en utilisant ces 2 tableaux Les tableaux AA et BB auront uniquement l'identifiant de champ. Le tableau AA aura «A» et «B» comme valeurs pour l'ID. La table BB aura «B», «C» et «D» comme valeurs pour ID.
Pour une INNER JOIN, seules les lignes avec des valeurs correspondantes sont incluses. Ainsi, la jointure INTÉRIEURE de AA et BB serait: "B", "B"
Pour un LEFT OUTER JOIN, chaque ligne de la table de gauche est renvoyée, et pour les lignes de la table de droite sans valeur correspondante, NULL est retourné. On obtient donc: 'A', NULL "B", "B"
Pour une RIGHT OUTER JOIN, chaque ligne de la table de droite est renvoyée, et pour les lignes de la table de gauche sans valeur correspondante, NULL est retourné. On obtient donc: «B», «B» NULL, 'C' NULL, 'D'
Pour une FULL OUTER JOIN, chaque ligne des deux tables est renvoyée. Et les valeurs manquantes dans l'une ou l'autre table sont NULL. On obtient donc: 'A', NULL «B», «B» NULL, 'C' NULL, 'D'
Et enfin, pour un CROSS JOIN, chaque ligne de chaque table est renvoyée avec chaque ligne de l'autre table. On obtient donc: 'UN B' «A», «C» 'UN D' «B», «B» 'AVANT JC' «B», «D»
Pour l'exemple d'instruction SQL que vous avez donné, vous renvoyez un INNER JOIN. Quant à la différence entre un INNER JOIN et un CROSS JOIN, l'exemple ci-dessus aurait dû illustrer les différences, mais pour un INNER JOIN vous examinez le nombre minimum de lignes et pour un CROSS JOIN, vous examinez le nombre maximum possible de rangées. En général, si vous examinez le plan pour une requête SQL et découvrez qu'un CROSS JOIN est utilisé dans le plan, le plus souvent, vous avez une erreur dans votre SQL car les jointures croisées ont tendance à être extrêmement gourmandes en processeur et en E / S .
C'est une syntaxe archaïque pour une jointure interne. Vous devriez utiliser
JOIN
/ON
, sans poser de questions sur l'historique.c'est la syntaxe archaïque (1992) pour la jointure interne.
Jointure interne vs Où , INNER JOIN ON vs WHERE , Jointures SQL explicites ou implicites , SQL JOIN: y a-t-il une différence entre USING, ON ou WHERE?