Database
 sql >> Base de données >  >> RDS >> Database

Jointure croisée SQL

Cet article donne un aperçu du CROSS JOIN en SQL, ainsi que quelques exemples de base.

Le SQL CROSS JOIN (ou FULL OUTER JOIN ) renvoie des lignes qui combinent chaque ligne de la première table avec chaque ligne de la seconde table.

En d'autres termes, il renvoie le produit cartésien des lignes des tables de la jointure.

Syntaxe

Vous spécifiez une jointure croisée dans le FROM clause.

La syntaxe ressemble à ceci :

SELECT *
FROM Table1 CROSS JOIN Table2 
ON Table1.Column = Table2.Column;

Exemple 1

Voici un exemple pour illustrer.

Exemple de données

Tout d'abord, voici les tableaux que nous utiliserons pour l'exemple.

Le t1 tableau :

+--------+
| col1   |
|--------|
| a      |
| b      |
| c      |
+--------+

Le t2 tableau :

+--------+
| col1   |
|--------|
| 1      |
| 2      |
| 3      |
+--------+

La requête de jointure croisée

Voici un exemple d'exécution d'une jointure croisée sur ces deux tables.

SELECT * FROM t1 
CROSS JOIN t2;

Résultat :

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Notre requête renvoie donc 9 lignes, même s'il n'y a que 3 lignes dans chaque table.

Cela est dû au fonctionnement de la jointure croisée. Le nombre de lignes renvoyées correspond au nombre de lignes dans le tableau de gauche, multiplié par le nombre de lignes dans le tableau de droite.

Voyez comment il parcourt le tableau de gauche, en affichant chaque ligne du tableau de droite pour chaque ligne du tableau de gauche.

Cela a le même effet que de faire ce qui suit :

SELECT * FROM t1, t2

Résultat :

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Exemple 2

Voici ce qui se passe si nous ajoutons un WHERE clause à notre jointure croisée.

SELECT * FROM t1 
CROSS JOIN t2
WHERE t1.col1 = 'a';

Résultat :

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| a      | 2      |
| a      | 3      |
+--------+--------+
(3 rows affected)

Exemple 3

Supposons que nous ayons les tables suivantes.

Les PetTypes tableau :

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Les Pets tableau :

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Dans ce cas, le Pets.PetTypeId colonne est une clé étrangère de PetTypes.PetTypeId colonne.

Maintenant, voici un exemple d'exécution d'une jointure croisée sur ces deux tables, mais en utilisant un WHERE clause.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;

Résultat :

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Ajouter le WHERE clause à la jointure croisée l'a transformée en jointure interne.

Voici ce qui se passe si nous supprimons le WHERE clause.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt;

Résultat :

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Bird      |
| Fetch     | Bird      |
| Scratch   | Bird      |
| Wag       | Bird      |
| Tweet     | Bird      |
| Fluffy    | Bird      |
| Bark      | Bird      |
| Meow      | Bird      |
| Fluffy    | Cat       |
| Fetch     | Cat       |
| Scratch   | Cat       |
| Wag       | Cat       |
| Tweet     | Cat       |
| Fluffy    | Cat       |
| Bark      | Cat       |
| Meow      | Cat       |
| Fluffy    | Dog       |
| Fetch     | Dog       |
| Scratch   | Dog       |
| Wag       | Dog       |
| Tweet     | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Dog       |
| Fluffy    | Rabbit    |
| Fetch     | Rabbit    |
| Scratch   | Rabbit    |
| Wag       | Rabbit    |
| Tweet     | Rabbit    |
| Fluffy    | Rabbit    |
| Bark      | Rabbit    |
| Meow      | Rabbit    |
+-----------+-----------+
(32 rows affected)

Nous obtenons une jointure croisée qui renvoie 32 lignes.