sql >> Database teknologi >  >> RDS >> Database

SQL Right Join

Denne artikel giver et overblik over RIGHT JOIN i SQL, samt nogle grundlæggende eksempler.

Også kendt som RIGHT OUTER JOIN , RIGHT JOIN returnerer rækker, der har data i den højre tabel (til højre for JOIN søgeord), selvom der ikke er nogen matchende rækker i den venstre tabel.

Syntaks

Du angiver en højre joinforbindelse i FROM klausul. Du kan bruge enten RIGHT JOIN eller RIGHT OUTER JOIN syntaks.

Brug af RIGHT JOIN syntaks:

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

Brug af RIGHT OUTER JOIN syntaks:

SELECT *
FROM Table1 RIGHT OUTER JOIN Table2 
ON Table1.Column = Table2.Column;

Begge disse gør nøjagtig det samme. Det er bare, at OUTER søgeord er valgfrit.

Eksempler

Her er nogle eksempler til demonstration.

Eksempel på data

For det første er her de tabeller, vi skal bruge til eksemplerne.

PetTypes tabel:

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

Pets tabel:

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

Owners tabel:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Simpson    | (489) 591-0408 | NULL              |
| 4         | Boris       | Trump      | (349) 611-8908 | NULL              |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

Bemærk at:

  • PetTypeId kolonne i Pets tabel er en fremmednøgle til PetTypeId af PetTypes tabel (som er den primære nøgle til den pågældende tabel).
  • OwnerId kolonne i Pets tabel er en fremmednøgle til OwnerId kolonne i Owners tabel.

Den rigtige deltagelsesforespørgsel

Her er et eksempel på at udføre en right join mod to af disse tabeller.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;

Resultat:

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

Den rigtige joinforbindelse får os til at få en PetType værdi, der ikke svarer til et PetName . Konkret er der ingen kaniner som kæledyr. Men den rigtige join forårsager Rabbit skal returneres, selvom der ikke er noget kæledyr i Pets bord af den type. Dette resulterer i en NULL værdi i PetName kolonne mod Rabbit .

Dette skete kun fordi Rabbit var i den højre tabel (dvs. til højre for RIGHT JOIN søgeord).

Her er, hvad der sker, hvis vi ændrer tabelrækkefølgen i vores forespørgsel.

SELECT 
    p.PetName,
    pt.PetType
FROM PetTypes pt
RIGHT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;

Resultat:

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

Denne gang Rabbits blev ikke returneret. Det er fordi dens tabel (PetTypes ) var på venstre side af sammenføjningen.

Vi bliver nødt til at ændre det til en venstre join eller en fuld join, hvis vi ville have Rabbits skal returneres med denne bordbestilling.

Rejse Deltag på 3 borde

Her er et eksempel på at udføre en ret join på alle tre borde.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId
RIGHT JOIN Owners o 
    ON p.OwnerId = o.OwnerId;

Resultat:

+-----------+-----------+----------------+
| PetName   | PetType   | PetOwner       |
|-----------+-----------+----------------|
| Tweet     | Bird      | Homer Connery  |
| Scratch   | Cat       | Bart Pitt      |
| Bark      | Dog       | Bart Pitt      |
| Fluffy    | Cat       | Nancy Simpson  |
| Fetch     | Dog       | Nancy Simpson  |
| Wag       | Dog       | Nancy Simpson  |
| Fluffy    | Dog       | Boris Trump    |
| Meow      | Cat       | Boris Trump    |
| NULL      | NULL      | Woody Eastwood |
+-----------+-----------+----------------+
(9 rows affected)

Denne gang har vi en kæledyrsejer, der ikke har et kæledyr.

Vi kunne igen blande rækkefølgen af ​​bordene rundt, og vi ville få et andet resultat.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o 
    ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId;

Resultat:

+-----------+-----------+---------------+
| PetName   | PetType   | PetOwner      |
|-----------+-----------+---------------|
| Tweet     | Bird      | Homer Connery |
| Fluffy    | Cat       | Nancy Simpson |
| Scratch   | Cat       | Bart Pitt     |
| Meow      | Cat       | Boris Trump   |
| Fetch     | Dog       | Nancy Simpson |
| Wag       | Dog       | Nancy Simpson |
| Fluffy    | Dog       | Boris Trump   |
| Bark      | Dog       | Bart Pitt     |
| NULL      | Rabbit    |               |
+-----------+-----------+---------------+
(9 rows affected)

Denne gang fik vi den ekstra kæledyrstype (Rabbit ), men ikke den ekstra ejer.

Hvis du undrer dig over, hvorfor den sidste PetOwner er ikke NULL (som sidst PetName er), er det fordi det er et resultat af en strengsammenkædning. Jeg brugte T-SQL CONCAT() funktion til at sammenkæde ejerens for- og efternavn.


  1. Hvordan kan jeg dræbe alle sessioner, der forbinder til min oracle-database?

  2. 4 funktioner til at returnere måneden fra en dato i MariaDB

  3. PostgreSQL-forespørgsel kører hurtigere med indeksscanning, men motoren vælger hash join

  4. Hvordan cbrt() virker i PostgreSQL