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

Nối 3 bảng trong SQL

Trong SQL, bạn có thể nối ba bảng trở lên bằng cách thêm một phép nối khác sau bảng đầu tiên.

Bạn cũng có thể chạy các phép nối lồng nhau bằng cách chỉ định một phép nối làm điều kiện nối cho một phép nối khác.

Cú pháp

Cách phổ biến nhất để nối ba bảng giống như sau:

 SELECT *
FROM Table1 
INNER JOIN Table2
    ON Condition
INNER JOIN Table3
    ON Condition; 

Điều này sử dụng một phép nối bên trong, nhưng bạn có thể chỉ định loại phép nối mong muốn của mình như với bất kỳ phép nối nào khác. Bạn cũng có thể kết hợp các kiểu kết hợp nếu được yêu cầu (ví dụ bên dưới).

Bạn cũng có thể sử dụng các phép nối lồng nhau bằng cách chỉ định một phép nối làm điều kiện nối cho một phép nối khác. Như thế này:

 SELECT *
FROM Table1 
JOIN (Table2
            JOIN Table3
            ON Condition)
ON Condition; 

Dữ liệu Mẫu - 3 Bảng

Giả sử chúng ta có ba bảng sau.

Customers bảng:

 + -------------- + ---------------- + -------------- - + ---------------- + | CustomerId | Tên khách hàng | Bưu chính Thành phố | Số điện thoại || -------------- + ---------------- + --------------- - + ---------------- || 1 | Homer McKenzie | Năm 19586 | (308) 555-0100 || 2 | Marge Pratt | 33475 | (406) 555-0100 || 3 | Vlad Bernanke | NULL | (480) 555-0100 || 4 | Bart Pitt | 21692 | (316) 555-0100 || 5 | Lisa McQueen | 12748 | (212) 555-0100 || 6 | Steve Simpson | Năm 17054 | (701) 555-0100 || 7 | Vinn Allen | 12152 | (423) 555-0100 || 8 | Veejay Smith | 3673 | (303) 555-0100 || 9 | Kasey Chin | 23805 | (201) 555-0100 || 10 | Borat Lee | 37403 | (701) 555-0100 | + -------------- + ---------------- + ---------- ------ + ---------------- + (10 hàng bị ảnh hưởng) 

Cities bảng:

 + ---------- + ---------------- + ------------------ - + -------------- + | CityId | CityName | StateProvinceId | Dân số || ---------- + ---------------- + ------------------- + -------------- || 3673 | Cung Mar | 6 | 866 || 12152 | Frankewing | 44 | NULL || 12748 | Gasport | 33 | 1248 || 21692 | Nhà nghỉ Y học | 17 | Năm 2009 || 26483 | Thung lũng Peeples | 3 | 428 || 33475 | Xi-nhan | 27 | 103 || Năm 17054 | Jessie | 35 | 25 || Năm 19586 | Lisco | 28 | NULL || 37403 | Wimbledon | 35 | 216 | + ---------- + ---------------- + ------------------- + -------------- + (9 hàng bị ảnh hưởng) 

StateProvinces bảng:

 + ------------------- + --------------------- + ---- ----------------- + ------------- + -------------- + | StateProvinceId | StateProvinceCode | StateProvinceName | CountryId | Dân số || ------------------- + --------------------- + ----- ---------------- + ------------- + -------------- || 3 | AZ | Arizona | 230 | 6891688 || 6 | CO | Colorado | 230 | 5698265 || 17 | KS | Kansas | 230 | 2893957 || 28 | NE | Nebraska | 230 | Năm 1943256 || 31 | NJ | New Jersey | 230 | 8899339 || 33 | NY | New York | 230 | 20437172 || 35 | ND | Bắc Dakota | 230 | 723393 || 44 | TN | Tennessee | 230 | 6495978 | + ------------------- + --------------------- + ----- ---------------- + ------------- + -------------- + (8 hàng bị ảnh hưởng ) 

Ví dụ 1 - 3 Bảng kết hợp bên trong

Loại tham gia phổ biến nhất là tham gia bên trong, vì vậy chúng tôi sẽ bắt đầu với loại tham gia đó.

Dưới đây là một ví dụ về việc kết hợp ba bảng trên với hai phép nối bên trong.

 SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
INNER JOIN Customers cu  
ON cu.PostalCityId = ci.CityId; 

Kết quả:

 + --------------------- + ---------------- + ------- --------- + | StateProvinceName | CityName | Tên khách hàng || --------------------- + ---------------- + -------- -------- || Nebraska | Lisco | Homer McKenzie || Kansas | Nhà nghỉ Y học | Bart Pitt || New York | Gasport | Lisa McQueen || Bắc Dakota | Jessie | Steve Simpson || Tennessee | Frankewing | Vinn Allen || Colorado | Cung Mar | Veejay Smith || Bắc Dakota | Wimbledon | Borat Lee | + --------------------- + ---------------- + ------- --------- + (7 hàng bị ảnh hưởng) 

Ví dụ 2 - Kết hợp các kiểu kết hợp

Bạn có thể kết hợp các kiểu tham gia khi tham gia ba bảng trở lên.

Dưới đây là một ví dụ về việc kết hợp phép nối bên trong với phép nối bên trái.

 SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
LEFT JOIN Customers cu  
ON cu.PostalCityId = ci.CityId; 

Kết quả:

 --------------------- + ---------------- + -------- -------- + | StateProvinceName | CityName | Tên khách hàng || --------------------- + ---------------- + -------- -------- || Colorado | Cung Mar | Veejay Smith || Tennessee | Frankewing | Vinn Allen || New York | Gasport | Lisa McQueen || Kansas | Nhà nghỉ Y học | Bart Pitt || Arizona | Thung lũng Peeples | NULL || Bắc Dakota | Jessie | Steve Simpson || Nebraska | Lisco | Homer McKenzie || Bắc Dakota | Wimbledon | Borat Lee | + --------------------- + ---------------- + ------- --------- + (8 hàng bị ảnh hưởng) 

Trong trường hợp này, chúng tôi có một thành phố (Thung lũng Peeples) chưa có bất kỳ khách hàng nào.

Lý do bây giờ chúng ta có thể thấy thông tin đó là vì phép nối bên trái trả về các hàng có dữ liệu trong bảng bên trái, ngay cả khi không có hàng nào phù hợp trong bảng bên trái.

Ví dụ trước đó kết hợp hai phép nối bên trong không trả về hàng này, vì phép nối bên trong loại bỏ các hàng chưa khớp khỏi cả hai bảng. Nó chỉ trả về các hàng khi có ít nhất một hàng trong cả hai bảng phù hợp với điều kiện nối.

Dữ liệu mẫu mới - 3 bảng khác nhau

Đối với các ví dụ còn lại, chúng tôi sẽ sử dụng các bảng sau.

PetTypes bảng:

 + ------------- + ----------- + | PetTypeId | PetType || ------------- + ----------- || 1 | Con chim || 2 | Con mèo || 3 | Con chó || 4 | Thỏ | + ------------- + ----------- + (4 hàng bị ảnh hưởng) 

Pets bảng:

 + --------- + ------------- + ----------- + ---------- - + ------------ + | PetId | PetTypeId | OwnerId | PetName | DOB || --------- + ------------- + ----------- + ----------- + ------------ || 1 | 2 | 3 | Bông xù | 2020-11-20 || 2 | 3 | 3 | Tìm nạp | 2019-08-16 || 3 | 2 | 2 | Cào | 2018-10-01 || 4 | 3 | 3 | Wag | 2020-03-15 || 5 | 1 | 1 | Tweet | 2020-11-28 || 6 | 3 | 4 | Bông xù | 2020-09-17 || 7 | 3 | 2 | Vỏ cây | NULL || 8 | 2 | 4 | Meo meo | NULL | + --------- + ------------- + ----------- + ----------- + ------------ + (8 hàng bị ảnh hưởng) 

Owners bảng:

 + ----------- + ------------- + ------------ + ------- --------- + ------------------- + | OwnerId | FirstName | LastName | Điện thoại | Email || ----------- + ------------- + ------------ + -------- -------- + ------------------- || 1 | Homer | Kết nối | (308) 555-0100 | [email protected] || 2 | Bart | Pittông | (231) 465-3497 | [email protected] || 3 | Nancy | Simpson | (489) 591-0408 | NULL || 4 | Boris | Trump | (349) 611-8908 | NULL || 5 | Thân gỗ | 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.

Ví dụ 3 - Nối trái 3 bảng

Hãy thực hiện một phép nối ba bảng bằng cách sử dụng hai phép nối bên trái.

Dưới đây là một ví dụ về việc chạy hai phép nối bên trái đối với các 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 | Chim | Homer Connery || Cào | Con mèo | Bart Pitt || Vỏ cây | Con chó | Bart Pitt || Bông xù | Con mèo | Nancy Simpson || Tìm nạp | Con chó | Nancy Simpson || Wag | Con chó | Nancy Simpson || Bông xù | Con chó | Boris Trump || Meo meo | Con mèo | Boris Trump || NULL | NULL | Gỗ Eastwood | + ----------- + ----------- + ---------------- + (9 hàng bị ảnh hưởng) 

Ở đâ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 có thể xác minh điều đó bằng cách xem Pets.OwnerId và thấy rằng không có giá trị nào tương ứng với OwnerId của Woody Eastwood trong Owners bảng.

Ví dụ 4 - Nối phải 3 bảng

Phép nối bên phải ngược lại với phép nối bên trái. Dưới đây là một ví dụ sử dụng ba bảng giống nhau.

 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 | Chim | Homer Connery || Bông xù | Con mèo | Nancy Simpson || Cào | Con mèo | Bart Pitt || Meo meo | Con mèo | Boris Trump || Tìm nạp | Con chó | Nancy Simpson || Wag | Con chó | Nancy Simpson || Bông xù | Con chó | Boris Trump || Vỏ cây | Con chó | Bart Pitt || NULL | Con thỏ | | + ----------- + ----------- + --------------- + (9 hàng bị ảnh hưởng) 

Lần này, chúng tôi có thêm một loại thú cưng (Rabbit ), nhưng không phải là chủ sở hữu thêm. Điều này là do kết hợp bên phải trả về các hàng có dữ liệu trong bảng bên phải, ngay cả khi không có hàng nào phù hợp trong bảng bên trái.

Nhân tiện, lý do 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 chuỗi nố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.

Ví dụ 5 - 3 Bảng tham gia đầy đủ

Tham gia đầy đủ cũng giống như tham gia trái và phải trong một. Nó trả về tất cả các hàng, miễn là có dữ liệu khớp trong một trong các bảng.

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

Kết quả:

 + ----------- + ----------- + ---------------- + | PetName | PetType | PetOwner || ----------- + ----------- + ---------------- || Tweet | Chim | Homer Connery || Cào | Con mèo | Bart Pitt || Vỏ cây | Con chó | Bart Pitt || Bông xù | Con mèo | Nancy Simpson || Tìm nạp | Con chó | Nancy Simpson || Wag | Con chó | Nancy Simpson || Bông xù | Con chó | Boris Trump || Meo meo | Con mèo | Boris Trump || NULL | NULL | Gỗ Eastwood || NULL | Con thỏ | | + ----------- + ----------- + ---------------- + (10 hàng bị ảnh hưởng)  

Lần này, chúng tôi nhận được sự kết hợp của các kết quả mà chúng tôi nhận được trong hai ví dụ trước.

Ví dụ 6 - Kết hợp lồng nhau

Như đã đề cập, bạn cũng có thể thực hiện các phép nối lồng nhau.

Đây là một ví dụ về phép nối lồng nhau.

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

Kết quả:

 + ----------- + ----------- + ---------------- + | PetName | PetType | PetOwner || ----------- + ----------- + ---------------- || Tweet | Chim | Homer Connery || Cào | Con mèo | Bart Pitt || Vỏ cây | Con chó | Bart Pitt || Bông xù | Con mèo | Nancy Simpson || Tìm nạp | Con chó | Nancy Simpson || Wag | Con chó | Nancy Simpson || Bông xù | Con chó | Boris Trump || Meo meo | Con mèo | Boris Trump || NULL | NULL | Gỗ Eastwood | + ----------- + ----------- + ---------------- + (9 hàng bị ảnh hưởng) 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Công nghệ JPA của Java là gì?

  2. Nhận xét có thể cản trở hiệu suất thủ tục được lưu trữ không?

  3. Cách các kế hoạch song song bắt đầu - Phần 3

  4. Thống kê chờ Knee-Jerk:CXPACKET

  5. Django Migrations:A Primer