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

SQL Right Join

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

Còn được gọi là RIGHT OUTER JOIN , RIGHT JOIN trả về các hàng có dữ liệu trong bảng bên phải (bên phải của JOIN từ khóa), ngay cả khi không có hàng phù hợp nào trong bảng bên trái.

Cú pháp

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

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

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

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

SELECT *
FROM Table1 RIGHT 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 phù hợp

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

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

Việc tham gia phù hợp khiến chúng tôi nhận được PetType giá trị không tương ứng với PetName . Cụ thể, không có thỏ làm thú cưng. Nhưng kết hợp đúng 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 ở trong bảng bên phải (tức là bên phải của RIGHT JOIN từ khóa).

Đâ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 PetTypes pt
RIGHT JOIN Pets p
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 trái của phép nối.

Chúng tôi sẽ cần thay đổi nó thành liên kết bên trái hoặc liên kết đầ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 ngay trên 3 bảng

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

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

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ác bàn xung quanh 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 Pets p RIGHT JOIN Owners o 
    ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId;

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. Mang đám mây của riêng bạn (BYOC) so với Lưu trữ chuyên dụng tại ScaleGrid

  2. Tìm rò rỉ kết nối cơ sở dữ liệu trong ứng dụng của bạn

  3. Làm thế nào để loại bỏ một ràng buộc duy nhất trong SQL?

  4. Ngưỡng tối ưu hóa - Dữ liệu nhóm và tổng hợp, Phần 3

  5. Dell Boomi