sql >> Databasteknik >  >> RDS >> Database

SQL Left Join

Den här artikeln ger en översikt över LEFT JOIN i SQL, samt några grundläggande exempel.

LEFT JOIN , eller LEFT OUTER JOIN , returnerar rader som har data i den vänstra tabellen (vänster om JOIN sökord), även om det inte finns några matchande rader i den högra tabellen.

Syntax

Du anger en vänsterkoppling i FROM klausul. Du kan använda antingen LEFT JOIN eller LEFT OUTER JOIN syntax.

Använd LEFT JOIN syntax:

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

Använd LEFT OUTER JOIN syntax:

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

Båda dessa gör exakt samma sak. Det är bara att OUTER nyckelordet är valfritt.

Exempel

Här är några exempel att visa.

Exempeldata

Först, här är tabellerna vi ska använda för exemplen.

PetTypes tabell:

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

Pets tabell:

+---------+-------------+-----------+-----------+------------+
| 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 tabell:

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

Observera att:

  • PetTypeId kolumnen i Pets tabellen är en främmande nyckel för PetTypeId av PetTypes tabell (som är den primära nyckeln för den tabellen).
  • OwnerId kolumnen i Pets tabellen är en främmande nyckel för OwnerId kolumnen i Owners tabell.

Vänster gå med i fråga

Här är ett exempel på hur man utför en vänsterkoppling mot två av dessa tabeller.

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)

Den vänstra kopplingen gör att vi får en PetType värde som inte överensstämmer med ett PetName . Det finns inga kaniner som husdjur. Men den vänstra kopplingen orsakar Rabbit ska returneras, även om det inte finns något husdjur i Pets bord av den typen. Detta resulterar i en NULL värde i PetName kolumn mot Rabbit .

Detta hände bara för att Rabbit fanns i den vänstra tabellen (dvs till vänster om LEFT JOIN nyckelord). OK, min formatering gör det mer "ovan" än "vänster", men du får bilden.

Det här är vad som händer om vi ändrar tabellordningen i vår fråga.

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)

Den här gången Rabbits returnerades inte. Det beror på att dess tabell (PetTypes ) var på höger sida av sammanfogningen.

Vi skulle behöva ändra det till en högerkoppling eller en fullständig koppling om vi ville ha Rabbits ska returneras med denna bordsordning.

Vänster gå med på 3 bord

Här är ett exempel på hur man utför en vänsterkoppling på alla tre borden.

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)

Den här gången har vi en husdjursägare som inte har ett husdjur.

Vi kunde återigen blanda ordningen på borden och vi skulle få ett annat 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)

Den här gången fick vi den extra husdjurstypen (Rabbit ), men inte den extra ägaren.

Om du undrar varför den senaste PetOwner är inte NULL (som sist PetName är), det beror på att det är ett resultat av en strängsammansättning. Jag använde T-SQL CONCAT() funktion för att sammanfoga ägarens för- och efternamn.


  1. Hur man listar alla lagrade procedurer i MariaDB

  2. Galera Cluster Resources

  3. Säker TO_NUMBER()

  4. 3 sätt att få en kolumns datatyp i SQL Server (T-SQL)