sql >> Databáze >  >> RDS >> Database

SQL Levé připojení

Tento článek poskytuje přehled LEFT JOIN v SQL a také některé základní příklady.

LEFT JOIN , nebo LEFT OUTER JOIN , vrátí řádky, které obsahují data v levé tabulce (vlevo od JOIN klíčové slovo), i když v pravé tabulce nejsou žádné odpovídající řádky.

Syntaxe

Levé spojení určíte v FROM doložka. Můžete použít buď LEFT JOIN nebo LEFT OUTER JOIN syntaxe.

Pomocí LEFT JOIN syntaxe:

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

Pomocí LEFT OUTER JOIN syntaxe:

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

Oba dělají přesně to samé. Jde jen o to, že OUTER klíčové slovo je nepovinné.

Příklady

Zde je několik příkladů k demonstraci.

Ukázková data

Za prvé, zde jsou tabulky, které použijeme pro příklady.

PetTypes tabulka:

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

Pets tabulka:

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

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

Všimněte si, že:

  • PetTypeId ve sloupci Pets tabulka je cizí klíč PetTypeId z PetTypes tabulka (což je primární klíč této tabulky).
  • OwnerId ve sloupci Pets tabulka je cizí klíč OwnerId ve sloupci Owners stůl.

Dotaz na levé připojení

Zde je příklad provedení levého spojení proti dvěma z těchto tabulek.

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

Výsledek:

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

Levé spojení způsobí, že dostaneme PetType hodnota, která neodpovídá PetName . Nejsou žádní králíci jako domácí mazlíčci. Ale levé spojení způsobí Rabbit být vrácen, i když v Pets není žádné zvíře stůl tohoto typu. Výsledkem je NULL hodnotu v PetName sloupec proti Rabbit .

Stalo se to jen proto, že Rabbit byl v levé tabulce (tj. vlevo od LEFT JOIN klíčová slova). OK, moje formátování to dělá více „nahoře“ než „vlevo“, ale máte obrázek.

Co se stane, když v našem dotazu změníme pořadí tabulky.

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

Výsledek:

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

Tentokrát Rabbits nebyl vrácen. Je to proto, že jeho tabulka (PetTypes ) byl na pravé straně spojení.

Pokud bychom chtěli Rabbits, museli bychom to změnit na pravé spojení nebo úplné spojení které mají být vráceny pomocí této tabulky.

Připojení vlevo u 3 stolů

Zde je příklad provedení levého spojení na všech třech stolech.

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;

Výsledek:

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

Tentokrát máme majitele domácího mazlíčka, který žádné zvíře nemá.

Mohli bychom znovu zamíchat pořadím stolů a dostali bychom jiný výsledek.

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;

Výsledek:

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

Tentokrát jsme dostali extra typ domácího mazlíčka (Rabbit ), ale ne další vlastník.

Pokud vás zajímá, proč poslední PetOwner není NULL (jako poslední PetName je), je to proto, že je výsledkem zřetězení řetězců. Použil jsem T-SQL CONCAT() funkce ke zřetězení jména a příjmení vlastníka.


  1. Cloud Vendor Deep-Dive:PostgreSQL na Google Cloud Platform (GCP)

  2. Migrace Google Cloud SQL pro MySQL na On-Prem Server

  3. Kód chyby 1292 – zkrácená nesprávná hodnota DOUBLE – Mysql

  4. Mohu ukládat obrázky v MySQL