Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

SQL còn lại tham gia

Bài viết này cung cấp tổng quan về LEFT JOIN trong SQL, cũng như một số ví dụ cơ bản.

LEFT JOIN hoặc LEFT OUTER JOIN , trả về các hàng có dữ liệu trong bảng bên trái (bên trái của JOIN từ khóa), ngay cả khi không có hàng nào phù hợp trong bảng bên phải.

Cú pháp

Bạn chỉ định một liên kết bên trái trong FROM mệnh đề. Bạn có thể sử dụng LEFT JOIN hoặc LEFT OUTER JOIN cú pháp.

Sử dụng LEFT JOIN cú pháp:

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

Sử dụng LEFT OUTER JOIN cú pháp:

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

Cả hai điều này đều làm chính xác cùng một điều. Chỉ là OUTER từ khóa là tùy chọn.

Ví dụ

Dưới đây là một số ví dụ để minh chứng.

Dữ liệu mẫu

Đầu tiên, đây là các bảng chúng tôi sẽ sử dụng cho các ví dụ.

PetTypes bảng:

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

Pets bảng:

+---------+-------------+-----------+-----------+------------+
| 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 bảng:

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

Lưu ý rằng:

  • PetTypeId cột của Pets bảng là khóa ngoại của PetTypeId của PetTypes bảng (là khóa chính của bảng đó).
  • OwnerId cột của Pets bảng là khóa ngoại của OwnerId cột của Owners bảng.

Truy vấn Tham gia Bên trái

Dưới đây là một ví dụ về thực hiện phép nối trái với hai trong số các bảng đó.

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

Kết quả:

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

Phép nối bên trái khiến chúng ta nhận được PetType giá trị không tương ứng với PetName . Không có thỏ làm thú cưng. Nhưng phép nối bên trái gây ra Rabbit được trả lại, mặc dù không có vật nuôi nào trong Pets bảng loại đó. Điều này dẫn đến NULL giá trị trong PetName cột chống lại Rabbit .

Điều này chỉ xảy ra vì Rabbit nằm trong bảng bên trái (nghĩa là bên trái của LEFT JOIN từ khóa). OK, định dạng của tôi làm cho nó ở “phía trên” hơn là “bên trái”, nhưng bạn sẽ hiểu được bức tranh.

Đây là những gì sẽ xảy ra nếu chúng tôi chuyển đổi thứ tự bảng trong truy vấn của mình.

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

Kết quả:

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

Lần này Rabbits đã không được trả lại. Đó là vì bảng của nó (PetTypes ) ở bên phải của phép nối.

Chúng tôi cần phải thay đổi nó thành một tham gia phù hợp hoặc tham gia đầy đủ nếu chúng tôi muốn Rabbits sẽ được trả lại bằng cách sử dụng thứ tự bảng này.

Tham gia bên trái trên 3 bảng

Dưới đây là một ví dụ về thực hiện phép nối trái trên cả ba bảng.

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;

Kết quả:

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

Lần này chúng tôi có một chủ sở hữu vật nuôi không có vật nuôi.

Chúng tôi lại có thể xáo trộn thứ tự của các bàn và chúng tôi sẽ nhận được một kết quả khác.

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;

Kết quả:

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

Lần này, chúng tôi có thêm loại thú cưng (Rabbit ), nhưng không phải là chủ sở hữu phụ.

Nếu bạn đang thắc mắc tại sao PetOwner cuối cùng không phải là NULL (như PetName cuối cùng là), đó là vì nó là kết quả của một phép nối chuỗi. Tôi đã sử dụng T-SQL CONCAT() có chức năng nối họ và tên của chủ sở hữu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không có hình thức bộ nhớ đệm cơ sở dữ liệu để giảm các truy vấn cơ sở dữ liệu trùng lặp.

  2. Phân tích cú pháp các giá trị mặc định của tham số bằng PowerShell - Phần 2

  3. Cách thay đổi cột từ NULL thành NOT NULL

  4. Hình ảnh thời gian chạy tùy chỉnh trong Java 9 là gì?

  5. Cách xử lý số chia cho số 0 trong SQL