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

SQL Natural Join

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ủ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 Owners 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.


  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ửa hàng truy vấn:Hiển thị tác động của chỉ mục đối với phụ trang

  2. Số lượng hàng ước tính được đọc

  3. Kiểu dữ liệu SQL VARCHAR Nên và Không nên để Cơ sở dữ liệu Nhanh hơn

  4. Chỉ mục đã lọc và Cột BAO GỒM

  5. ScaleGrid Nâng cao Vòng tăng trưởng Vốn chủ sở hữu từ các Đối tác Cổ phần Nổi bật để Tăng tốc Mở rộng và Đầu tư Hơn nữa vào Lộ trình Sản phẩm