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

Tham gia đầy đủ SQL

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

SQL FULL JOIN (hoặc FULL OUTER JOIN ) 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.

Nó giống như có cả kết hợp trái phải trong một kết hợp.

Cú pháp

Bạn chỉ định một tham gia đầy đủ trong FROM mệnh đề. Bạn có thể sử dụng FULL JOIN hoặc FULL OUTER JOIN cú pháp.

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

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

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

 SELECT *
FROM Table1 FULL 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 | 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.

Truy vấn tham gia đầy đủ

Dưới đây là một ví dụ về thực hiện kết hợp đầy đủ với hai trong số các bảng đó.

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

Kết quả:

 + ----------- + ----------- + | PetName | PetType || ----------- + ----------- || Tweet | Con chim || Bông xù | Con mèo || Cào | Con mèo || Meo meo | Con mèo || Tìm nạp | Con chó || Wag | Con chó || Bông xù | Con chó || Vỏ cây | Con chó || NULL | Thỏ | + ----------- + ----------- + (9 hàng bị ảnh hưởng) 

Trong ví dụ này, chúng tôi nhận được một PetType giá trị không tương ứng với PetName . Điều này là do không có thỏ làm vật nuôi. Nhưng sự tham gia đầy đủ 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 .

Đây là kết quả tương tự mà chúng tôi sẽ nhận được nếu chúng tôi sử dụng một phép nối phù hợp, vì PetTypes bảng ở bên phải của JOIN từ khóa. Điều này sẽ không xảy ra với phép nối bên trái, vì PetTypes bảng không ở bên trái của JOIN từ khóa. Nếu chúng tôi muốn tạo lại nó với một phép nối bên trái, chúng tôi sẽ phải chuyển đổi thứ tự của các bảng để PetTypes bảng ở bên trái của 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 khi sử dụng kết hợp đầy đủ.

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

Kết quả:

 + ----------- + ----------- + | PetName | PetType || ----------- + ----------- || Tweet | Con chim || Bông xù | Con mèo || Cào | Con mèo || Meo meo | Con mèo || Tìm nạp | Con chó || Wag | Con chó || Bông xù | Con chó || Vỏ cây | Con chó || NULL | Thỏ | + ----------- + ----------- + (9 hàng bị ảnh hưởng) 

Chúng tôi nhận được cùng một kết quả. Điều này là do phép nối đầy đủ 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. Như đã đề cập, nó giống như việc kết hợp trái và phải trong một phép nối.

Tham gia đầy đủ trên 3 bảng

Dưới đây là một ví dụ về việc thực hiện kết hợp đầy đủ trên cả ba 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 có chủ sở hữu vật nuôi không có vật nuôi, cũng như loại vật nuôi không được chỉ định cho vật nuôi.

Nếu chúng ta xáo trộn thứ tự của các bảng xung quanh, chúng ta sẽ nhận được cùng một kết quả, mặc dù các hàng được liệt kê theo một thứ tự khác.

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

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ỏ | || NULL | NULL | Woody Eastwood | + ----------- + ----------- + ---------------- + (10 hàng bị ảnh hưởng) 

Và nếu chúng tôi xáo trộn chúng một lần nữa, chúng tôi vẫn nhận được kết quả tương tự.

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

Kết quả:

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

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. Điều chỉnh hiệu suất Knee-Jerk:Chỉ cần thêm ổ SSD

  2. Nội dung không có cấu trúc:Nguồn nhiên liệu chưa được khai thác cho AI và Máy học

  3. 9 phương pháp hay nhất để viết truy vấn SQL

  4. Xây dựng một ứng dụng web đơn giản với Bottle, SQLAlchemy và API Twitter

  5. Kiểm tra tự động ứng dụng dành cho máy tính để bàn:tổng quan về tính hiệu quả và các khuôn khổ