Obtenir des données à partir de plusieurs tables

Affichage des données de plusieurs tables

Les tables associées d'une grande base de données sont liées par l'utilisation de clés étrangères et primaires ou de ce que l'on appelle souvent des colonnes communes. La possibilité de joindre des tables vous permettra d'ajouter plus de signification à la table de résultats produite. Pour que les tables de nombres «n» soient jointes dans une requête, des conditions de jointure minimales (n-1) sont nécessaires. En fonction des conditions de jointure, Oracle combine la paire de lignes correspondante et affiche celle qui satisfait la condition de jointure.

Les jointures sont classées comme ci-dessous

  • Jointure naturelle (également appelée équi-jointure ou jointure simple) - Crée une jointure à l'aide d'une colonne communément nommée et définie.

  • Jointure sans égalité - Joint les tables lorsqu'il n'y a pas de lignes équivalentes dans les tables à joindre, par exemple, pour faire correspondre les valeurs d'une colonne d'une table avec une plage de valeurs dans une autre table.

  • Auto-jointure - Joint une table à elle-même.

  • Jointure externe - Inclut les enregistrements d'une table dans la sortie lorsqu'il n'y a pas d'enregistrement correspondant dans l'autre table.

  • Jointure cartésienne (également appelée produit cartésien ou jointure croisée): réplique chaque ligne de la première table avec chaque ligne de la seconde table.Crée une jointure entre les tables en affichant toutes les combinaisons d'enregistrements possibles.

Jointure naturelle

Le mot-clé NATURAL peut simplifier la syntaxe d'une équi-jointure.Une jointure naturelle est possible chaque fois que deux (ou plus) tables ont des colonnes avec le même nom et que les colonnes sont compatibles avec les jointures, c'est-à-dire que les colonnes ont un domaine partagé de valeurs. L'opération joint les lignes des tables qui ont des valeurs de colonne égales pour les mêmes colonnes nommées.

Considérez la relation un-à-plusieurs entre les tables DEPARTMENTS et EMPLOYEES. Chaque table a une colonne nommée DEPARTMENT_ID. Cette colonne est la clé primaire de la table DEPARTMENTS et une clé étrangère de la table EMPLOYEES.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;

FIRST_NAME DNAME
---------- ------
MILLER     DEPT 1
JOHN       DEPT 1
MARTIN     DEPT 2
EDWIN      DEPT 2

La requête SELECT ci-dessous joint les deux tables en spécifiant explicitement la condition de jointure avec le mot clé ON.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);

Il existe certaines limitations concernant la jointure NATURELLE.Vous ne pouvez pas spécifier une colonne LOB avec une jointure NATURELLE.

Clause UTILISATION

À l'aide de jointures naturelles, Oracle identifie implicitement les colonnes pour former la base de la jointure. De nombreuses situations nécessitent une déclaration explicite des conditions de jointure. Dans de tels cas, nous utilisons la clause USING pour spécifier les critères de jonction. Étant donné que la clause USING joint les tables en fonction de l'égalité des colonnes, elle est également appelée Equijoin. Ils sont également appelés jointures internes ou jointures simples.

Syntaxe:

SELECT <column list>
FROM   TABLE1   JOIN   TABLE2	
USING (column name)

Considérez la requête SELECT ci-dessous, la table EMPLOYEES et la table DEPARTMENTS sont jointes à l'aide de la colonne commune DEPARTMENT_ID.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);

Auto-rejoindre

Une opération SELF-JOIN produit une table de résultats lorsque la relation d'intérêt existe entre les lignes stockées dans une seule table. En d'autres termes, lorsqu'une table est jointe à elle-même, la jointure est appelée auto-jointure.

Considérez la table EMPLOYEES, qui contient les employés et leurs responsables de rapports. Pour trouver le nom du responsable d'un employé, il faudrait une jointure sur la table EMP elle-même. C'est un candidat typique pour Self Join.

SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;

Non équidés

Une jointure sans égalité est utilisée lorsque les colonnes associées ne peuvent pas être jointes avec un signe égal, ce qui signifie qu'il n'y a pas de lignes équivalentes dans les tables à joindre.Une jointure sans égalité vous permet de stocker la valeur minimale d'une plage dans une colonne d'un enregistrement et la valeur maximale dans une autre colonne. Ainsi, au lieu de trouver une correspondance colonne à colonne, vous pouvez utiliser une jointure sans égalité pour déterminer si l'article expédié se situe entre les plages minimale et maximale des colonnes.Si la jointure trouve une plage correspondante pour l'article, l'expédition correspondante des frais peuvent être retournés dans les résultats. Comme avec la méthode traditionnelle des jointures d'égalité, une jointure sans égalité peut être effectuée dans une clause WHERE. De plus, le mot clé JOIN peut être utilisé avec la clause ON pour spécifier les colonnes pertinentes pour la jointure.

SELECT E.first_name,
            J.job_hisal,
            J.job_losal,
            E.salary
     FROM employees E JOIN job_sal J
     ON (E.salary BETWEEN J.job_losal AND J.job_losal);

Nous pouvons utiliser tous les paramètres de comparaison discutés précédemment, tels que les opérateurs d'égalité et d'inégalité, BETWEEN, IS NULL, IS NOT NULL et RELATIONAL.

Jointures externes

Une jointure externe est utilisée pour identifier les situations dans lesquelles les lignes d'une table ne correspondent pas aux lignes d'une seconde table, même si les deux tables sont liées.

Il existe trois types de jointures externes: la jointure externe gauche, droite et complète. Ils commencent tous par un INNER JOIN, puis ils rajoutent certaines des lignes qui ont été supprimées. Une jointure externe gauche rajoute toutes les lignes supprimées de la première table (gauche) dans la condition de jointure, et les colonnes de sortie de la deuxième table (droite) sont définies sur NULL. Une jointure externe droite rajoute toutes les lignes supprimées de la deuxième table (droite) dans la condition de jointure, et les colonnes de sortie de la première table (gauche) sont définies sur NULL. La FULL OUTER JOIN rajoute toutes les lignes supprimées des deux tables.

Jointure externe droite

Une jointure externe droite rajoute toutes les lignes supprimées de la deuxième table (droite) dans la condition de jointure, et les colonnes de sortie de la première table (gauche) sont définies sur NULL. Notez que la requête ci-dessous répertorie les employés et leurs départements correspondants. De plus, aucun employé n'a été affecté au département 30.

SELECT E.first_name, E.salary, D.department_id          
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

Jointure externe gauche

Une jointure externe gauche rajoute toutes les lignes supprimées de la première table (gauche) dans la condition de jointure, et les colonnes de sortie de la deuxième table (droite) sont définies sur NULL. La requête illustrée ci-dessus peut être utilisée pour démontrer la jointure externe gauche, en échangeant la position du signe (+).

SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE   D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

Jointure externe complète

La FULL OUTER JOIN rajoute toutes les lignes supprimées des deux tables. La requête ci-dessous montre les listes des employés et de leurs départements. Notez que l'employé 'MAN' n'a été assigné à aucun service jusqu'à présent (c'est NULL) et le service 30 n'est assigné à aucun employé.

SELECT  nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;

FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN        -
JOHN       10
EDWIN      20
MILLER     10
MARTIN     20
-          30

6 rows selected.

Produit cartésien ou jointure croisée

Pour deux entités A et B, A * B est appelé produit cartésien. Un produit cartésien se compose de toutes les combinaisons possibles des lignes de chacun des tableaux. Par conséquent, lorsqu'une table de 10 lignes est jointe à une table de 20 lignes, le produit cartésien est de 200 lignes (10 * 20 = 200). Par exemple, joindre la table des employés avec huit lignes et la table des départements avec trois lignes produira une table de produits cartésiens de 24 lignes (8 * 3 = 24).

La jointure croisée fait référence au produit cartésien de deux tables. Il produit le produit croisé de deux tables. La requête ci-dessus peut être écrite à l'aide de la clause CROSS JOIN.

Une table de résultats de produit cartésien n'est normalement pas très utile. En fait, un tel tableau de résultats peut être terriblement trompeur. Si vous exécutez la requête ci-dessous pour les tables EMPLOYEES et DEPARTMENTS, la table de résultat implique que chaque employé a une relation avec chaque service, et nous savons que ce n'est tout simplement pas le cas!

SELECT E.first_name, D.DNAME
FROM employees E,departments D;
La jointure croisée peut être écrite comme suit:
SELECT E.first_name, D.DNAME
FROM employees E CROSS JOIN departments D;