Database
 sql >> Baza danych >  >> RDS >> Database

Połączenie lewe SQL

Ten artykuł zawiera omówienie LEFT JOIN w SQL, a także kilka podstawowych przykładów.

LEFT JOIN lub LEFT OUTER JOIN , zwraca wiersze, które zawierają dane w lewej tabeli (po lewej stronie JOIN słowa kluczowego), nawet jeśli w prawej tabeli nie ma pasujących wierszy.

Składnia

Określasz lewe sprzężenie w FROM klauzula. Możesz użyć opcji LEFT JOIN lub LEFT OUTER JOIN składnia.

Korzystanie z LEFT JOIN składnia:

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

Korzystanie z LEFT OUTER JOIN składnia:

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

Oba robią dokładnie to samo. Po prostu OUTER słowo kluczowe jest opcjonalne.

Przykłady

Oto kilka przykładów do zademonstrowania.

Przykładowe dane

Najpierw oto tabele, których użyjemy w przykładach.

PetTypes tabela:

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

Pets tabela:

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

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

Pamiętaj, że:

  • PetTypeId kolumna Pets tabela jest kluczem obcym PetTypeId PetTypes tabela (która jest kluczem podstawowym tej tabeli).
  • OwnerId kolumna Pets tabela jest kluczem obcym OwnerId kolumna Owners stół.

Zapytanie o połączenie lewe

Oto przykład wykonania lewego sprzężenia przeciwko dwóm z tych tabel.

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

Wynik:

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

Lewe sprzężenie powoduje, że otrzymujemy PetType wartość, która nie odpowiada PetName . Nie ma królików jako zwierząt domowych. Ale lewe połączenie powoduje Rabbit do zwrotu, nawet jeśli w Pets nie ma żadnego zwierzaka tabeli tego typu. Powoduje to NULL wartość w PetName kolumna przeciwko Rabbit .

Stało się tak tylko dlatego, że Rabbit był w lewej tabeli (tj. na lewo od LEFT JOIN słowa kluczowe). OK, moje formatowanie sprawia, że ​​jest bardziej „nad” niż „po lewej”, ale masz obraz.

Oto, co się stanie, jeśli zmienimy kolejność tabel w naszym zapytaniu.

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

Wynik:

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

Tym razem Rabbits nie został zwrócony. To dlatego, że jego tabela (PetTypes ) znajdował się po prawej stronie połączenia.

Musielibyśmy to zmienić na prawe lub pełne, jeśli chcielibyśmy Rabbits do zwrotu przy użyciu tej kolejności tabel.

Dołącz od lewej na 3 stołach

Oto przykład wykonania lewego sprzężenia na wszystkich trzech stołach.

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;

Wynik:

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

Tym razem mamy właściciela zwierzaka, który nie ma zwierzaka.

Moglibyśmy ponownie przetasować kolejność stołów i otrzymalibyśmy inny wynik.

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;

Wynik:

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

Tym razem otrzymaliśmy dodatkowy typ zwierzaka (Rabbit ), ale nie dodatkowego właściciela.

Jeśli zastanawiasz się, dlaczego ostatni PetOwner nie jest NULL (jak ostatnio PetName jest), to dlatego, że jest wynikiem konkatenacji ciągów. Użyłem T-SQL CONCAT() funkcja łączenia imienia i nazwiska właściciela.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Statystyka szarpnięcia kolanem:SOS_SCHEDULER_YIELD

  2. Jak utworzyć tabelę z wieloma kluczami obcymi i nie pomylić się?

  3. Śledzenie synchronicznych aktualizacji statystyk

  4. Wywiad z Orenem Eini z RavenDB na temat zarządzania bazami danych, analityki i bezpieczeństwa

  5. Co to są aplikacje czasu rzeczywistego?