Bài viết này cung cấp tổng quan về phép nối tự nhiên trong SQL, cũng như một số ví dụ cơ bản.
Tham gia tự nhiên là gì?
Phép nối tự nhiên trong SQL là một kiểu phép nối tương đương kết hợp ngầm các bảng dựa trên các cột có cùng tên và kiểu. Vị từ nối phát sinh ngầm định bằng cách so sánh tất cả các cột trong cả hai bảng có cùng tên cột trong các bảng đã nối.
Tập kết quả chỉ chứa một cột cho mỗi cặp cột được đặt tên bằng nhau. Nếu không tìm thấy cột nào có cùng tên, kết quả sẽ là một phép nối chéo.
Cú pháp
Tham gia tự nhiên có thể được áp dụng cho bất kỳ INNER
nào , LEFT
, RIGHT
hoặc FULL
tham gia. Bạn chỉ cần đặt tiền tố cho loại kết hợp bằng NATURAL
từ khóa.
Ví dụ về cú pháp được sử dụng trên liên kết bên trong:
SELECT *
FROM Table1 NATURAL INNER JOIN Table2
ON Table1.Column = Table2.Column;
Xem là INNER
là giá trị mặc định, bạn cũng có thể làm như thế này:
SELECT *
FROM Table1 NATURAL JOIN Table2
ON Table1.Column = Table2.Column;
NATURAL
từ khóa đặt một USING
ngầm mệnh đề với các ràng buộc nối. Nó tạo thành một USING
danh sách bao gồm tất cả các tên cột xuất hiện trong cả hai bảng đầu vào. Điều này rõ ràng chỉ áp dụng cho các DBMS hỗ trợ USING
mệnh đề.
Không phải tất cả các DBMS đều hỗ trợ kết hợp tự nhiên, vì vậy hãy kiểm tra tài liệu về DBMS của bạn.
Khi tôi viết điều này, các phép nối tự nhiên được hỗ trợ trong PostgreSQL, MySQL, MariaDB, SQLite và Oracle. Tuy nhiên, các phép nối tự nhiên không được hỗ trợ trong SQL Server (2019).
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ủaPets
bảng là khóa ngoại củaPetTypeId
củaPetTypes
bảng (là khóa chính của bảng đó). -
OwnerId
cột củaPets
bảng là khóa ngoại củaOwnerId
cộtOwners
bảng.
Ví dụ 1 - Tham gia tự nhiên bên trong
Dưới đây là một ví dụ về việc thực hiện phép nối bên trong tự nhiên với hai trong số các bảng đó.
SELECT
PetName,
PetType
FROM Pets
NATURAL JOIN PetTypes;
Kết quả:
petname | pettype ---------+--------- Fluffy | Cat Fetch | Dog Scratch | Cat Wag | Dog Tweet | Bird Fluffy | Dog Bark | Dog Meow | Cat (8 rows)
Trong ví dụ này, phép nối tự nhiên đã kết hợp ngầm các bảng trên hai PetTypeId
cột (tức là Pets.PetTypeId
và cột PetTypes.PetTypeId
cột).
Đây là một cách ngầm để thực hiện những điều sau:
SELECT
PetName,
PetType
FROM Pets
INNER JOIN PetTypes USING (PetTypeId);
Điều nào thực sự làm được những điều sau đây.
SELECT
p.PetName,
pt.PetType
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Ví dụ 2 - Tham gia Quyền tự nhiên
Dưới đây là một ví dụ về thực hiện phép nối quyền tự nhiên với hai trong số các bảng đó. Lần này, chúng tôi phải chỉ định loại liên kết, vì chúng tôi không muốn liên kết bên trong (mặc định).
SELECT
p.PetName,
pt.PetType
FROM Pets p
NATURAL RIGHT JOIN PetTypes pt;
Kết quả:
petname | pettype ---------+--------- Fluffy | Cat Fetch | Dog Scratch | Cat Wag | Dog Tweet | Bird Fluffy | Dog Bark | Dog Meow | Cat | Rabbit (9 rows)
Trong trường hợp này, cũng giống như làm như sau:
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Ví dụ 3 - Tham gia hoàn toàn tự nhiên trên 3 bảng
Dưới đây là một ví dụ về việc thực hiện kết hợp hoàn toàn tự nhiên trên cả ba bảng.
SELECT
PetName,
PetType,
CONCAT(FirstName, ' ', LastName) AS PetOwner
FROM Owners NATURAL FULL JOIN Pets
NATURAL FULL JOIN PetTypes;
Kết quả:
petname | pettype | petowner ---------+---------+---------------- Fluffy | Cat | Nancy Simpson Fetch | Dog | Nancy Simpson Scratch | Cat | Bart Pitt Wag | Dog | Nancy Simpson Tweet | Bird | Homer Connery Fluffy | Dog | Boris Trump Bark | Dog | Bart Pitt Meow | Cat | Boris Trump | | Woody Eastwood | Rabbit | (10 rows)
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.
Ví dụ 4 - Sử dụng Dấu hoa thị (*
) Ký tự đại diện
Dưới đây là một ví dụ sử dụng ký tự đại diện dấu hoa thị (*) để chọn tất cả các cột.
SELECT *
FROM Pets
NATURAL JOIN PetTypes;
Kết quả:
pettypeid | petid | ownerid | petname | dob | pettype -----------+-------+---------+---------+------------+--------- 2 | 1 | 3 | Fluffy | 2020-11-20 | Cat 3 | 2 | 3 | Fetch | 2019-08-16 | Dog 2 | 3 | 2 | Scratch | 2018-10-01 | Cat 3 | 4 | 3 | Wag | 2020-03-15 | Dog 1 | 5 | 1 | Tweet | 2020-11-28 | Bird 3 | 6 | 4 | Fluffy | 2020-09-17 | Dog 3 | 7 | 2 | Bark | | Dog 2 | 8 | 4 | Meow | | Cat (8 rows)
Lưu ý rằng pettypeid
cột chỉ được trả về một lần, mặc dù có hai cột có tên đó (một trong mỗi bảng). Đây là cách các phép nối tự nhiên đối phó với các cột cùng tên trên các bảng.