sql >> Database >  >> RDS >> Database

SQL Cross Join

Dit artikel geeft een overzicht van de CROSS JOIN in SQL, evenals enkele basisvoorbeelden.

De SQL CROSS JOIN (of FULL OUTER JOIN ) retourneert rijen die elke rij uit de eerste tabel combineren met elke rij uit de tweede tabel.

Met andere woorden, het retourneert het Cartesiaanse product van rijen uit tabellen in de join.

Syntaxis

U specificeert een cross join in de FROM clausule.

De syntaxis gaat als volgt:

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

Voorbeeld 1

Hier is een voorbeeld om te demonstreren.

Voorbeeldgegevens

Ten eerste zijn hier de tabellen die we voor het voorbeeld zullen gebruiken.

De t1 tafel:

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

De t2 tafel:

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

The Cross Join Query

Hier is een voorbeeld van het uitvoeren van een cross join tegen die twee tafels.

SELECT * FROM t1 
CROSS JOIN t2;

Resultaat:

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

Onze zoekopdracht retourneert dus 9 rijen, ook al zijn er maar 3 rijen in elke tabel.

Dit komt door de manier waarop de kruisverbinding werkt. Het aantal geretourneerde rijen is het aantal rijen in de linkertabel, vermenigvuldigd met het aantal rijen in de rechtertabel.

Kijk hoe het door de linkertabel gaat en elke rij in de rechtertabel voor elke rij in de linkertabel uitvoert.

Dit heeft hetzelfde effect als het volgende doen:

SELECT * FROM t1, t2

Resultaat:

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

Voorbeeld 2

Dit is wat er gebeurt als we een WHERE . toevoegen clausule aan onze cross join.

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

Resultaat:

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

Voorbeeld 3

Stel dat we de volgende tabellen hebben.

De PetTypes tafel:

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

De Pets tafel:

+---------+-------------+-----------+-----------+------------+
| 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)

In dit geval is de Pets.PetTypeId kolom is een externe sleutel van de PetTypes.PetTypeId kolom.

Hier is een voorbeeld van het uitvoeren van een cross join op die twee tabellen, maar met een WHERE clausule.

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

Resultaat:

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

De WHERE . toevoegen clausule aan de cross join maakte er een inner join van.

Dit is wat er gebeurt als we de WHERE . verwijderen clausule.

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

Resultaat:

+-----------+-----------+
| 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)

We krijgen een cross join die 32 rijen retourneert.


  1. Vind records uit de ene tabel die niet bestaan ​​in een andere

  2. MariaDB Backup &PostgreSQL in de cloud - ClusterControl Release 1.6.1

  3. PCI-compliance voor MySQL en MariaDB met ClusterControl

  4. Vind de kolommen die worden geretourneerd door een functie met tabelwaarde (T-SQL-voorbeelden)