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

SQL Venstre Join

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

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

Syntaks

Du angiver en venstre joinforbindelse i FROM klausul. Du kan bruge enten LEFT JOIN eller LEFT OUTER JOIN syntaks.

Brug af LEFT JOIN syntaks:

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

Brug af LEFT OUTER JOIN syntaks:

SELECT *
FROM Table1 LEFT 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 venstre deltagelsesforespørgsel

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

SELECT 
    p.PetName,
    pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
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)

Venstre joinforbindelse får os til at få en PetType værdi, der ikke svarer til et PetName . Der er ingen kaniner som kæledyr. Men den venstre 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 venstre tabel (dvs. til venstre for LEFT JOIN). søgeord). OK, min formatering gør det mere "over" end "venstre", men du får billedet.

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

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
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å højre side af sammenføjningen.

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

Venstre deltagelse på 3 borde

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

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

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 PetTypes pt LEFT JOIN Pets p
    ON p.PetTypeId = pt.PetTypeId
LEFT JOIN Owners o 
    ON p.OwnerId = o.OwnerId;

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. Kan du oprette et indeks i CREATE TABLE definitionen?

  2. Konfiguration af forbindelsen mellem klient og server Oracle 10g

  3. Sådan gendannes en SQL Server-database på en Mac ved hjælp af SQL Operations Studio

  4. Sletning af poster fra en ekstern postgresql-database ved hjælp af lokalt leveret liste