Bài viết này cung cấp tổng quan về INNER JOIN
trong SQL, cũng như một số ví dụ cơ bản.
INNER JOIN
trong SQL 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. Nó loại bỏ các hàng chưa khớp khỏi cả hai bảng. Đây là kiểu tham gia mặc định.
Cú pháp
Có hai cách để chỉ định một liên kết bên trong:trong FROM
mệnh đề (sử dụng INNER JOIN
cú pháp), hoặc sử dụng WHERE
mệnh đề.
Để chỉ định một liên kết bên trong trong FROM
mệnh đề:
SELECT *
FROM Table1 INNER JOIN Table2
ON Table1.Column = Table2.Column;
Để chỉ định một liên kết bên trong trong WHERE
mệnh đề:
SELECT *
FROM Table1, Table2
WHERE Table1.Column = Table2.Column;
Dưới đây là các ví dụ về từng loại.
Ví dụ
Ở đây, chúng tôi có các ví dụ cho từng phương pháp chỉ định liên kết bên trong.
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 | +-----------+-------------+------------+----------------+-------------------+
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ột củaOwners
bảng.
Ví dụ sử dụng Cú pháp INNER JOIN
Dưới đây là một ví dụ cơ bản về việc chỉ định liên kết bên trong bằng cách sử dụng INNER JOIN
cú pháp.
SELECT
p.PetName,
pt.PetType
FROM Pets p INNER JOIN PetTypes pt
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)
Để chỉ định một liên kết bên trong trong FROM
, chúng tôi sử dụng INNER JOIN
. Chúng tôi cũng sử dụng ON
từ khóa để xác định vị từ được đánh giá cho mỗi cặp hàng được nối.
Bất kể loại kết hợp nào, chúng tôi đủ điều kiện cho các tên cột của chúng tôi với các tên bảng. Lý do chúng tôi làm điều này là để tránh bất kỳ sự mơ hồ nào về tên cột giữa các bảng. Cả hai bảng có thể có các cột cùng tên (như trong ví dụ của chúng tôi) và trong những trường hợp như vậy, DBMS sẽ không biết bạn đang đề cập đến cột nào. Đặt tiền tố tên cột bằng tên bảng của chúng đảm bảo rằng bạn đang tham chiếu đến cột bên phải và ngăn chặn bất kỳ lỗi nào có thể phát sinh từ bất kỳ sự mơ hồ nào về cột mà bạn đang tham chiếu.
Trong ví dụ này, cả hai bảng đều có PetTypeId
cột. Pets.PetTypeId
là một khóa ngoại cho PetTypes.PetTypeId
, là khóa chính cho bảng đó.
Trong ví dụ này, chúng ta có thể thấy rằng tất cả các vật nuôi đều được trả lại, nhưng không phải tất cả các loại vật nuôi đều được trả lại. Không có thỏ nào trong Pets
bảng, và Rabbits
loại vật nuôi không được trả lại.
Lý do Rabbits
loại không được trả lại là do INNER JOIN
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. Trong trường hợp này, Rabbits
chỉ có trong một bảng (PetTypes
bảng).
Loại Tham gia là Tùy chọn
Lưu ý rằng kiểu tham gia là tùy chọn. Do đó, hầu hết (nếu không phải tất cả) DBMS cho phép bạn bỏ qua INNER
từ khóa. Khi bạn bỏ qua điều này (tức là chỉ xác định JOIN
), nó được giả định là một liên kết bên trong.
Do đó, chúng tôi có thể viết lại ví dụ trên thành thế này:
SELECT
Pets.PetName,
PetTypes.PetType
FROM Pets
JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId;
Định dạng
Như với bất kỳ câu lệnh SQL nào, bạn có thể sử dụng khoảng trắng và thụt lề, v.v. để định dạng các truy vấn của mình.
Ví dụ:FROM
mệnh đề có thể ở trên một dòng nếu bạn thích:
SELECT
Pets.PetName,
PetTypes.PetType
FROM Pets JOIN PetTypes ON Pets.PetTypeId = PetTypes.PetTypeId;
Khi bạn viết các bảng lớn hơn nối nhiều bảng, thụt lề có thể giúp ích rất nhiều.
Ví dụ sử dụng Mệnh đề WHERE
Sự tham gia ở trên cũng có thể được gọi là một tham gia tương đương . Một phép nối tương đương là một phép nối chỉ chứa các so sánh bình đẳng trong vị từ phép nối.
Dưới đây là một ví dụ về việc chỉ định một liên kết bên trong bằng cách sử dụng WHERE
mệnh đề:
SELECT
p.PetName,
pt.PetType
FROM
Pets p,
PetTypes pt
WHERE 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)
Điều này trả lại kết quả tương tự như ví dụ trước.
Ở đây, chúng tôi chỉ cung cấp danh sách các bảng được phân tách bằng dấu phẩy và sau đó là WHERE
điều kiện. Nếu chúng tôi đã bỏ qua WHERE
điều kiện, chúng tôi đã kết thúc với một CROSS JOIN
.
Nhiều người mới bắt đầu thấy cú pháp trên dễ hiểu hơn nhiều so với INNER JOIN
cú pháp. Tuy nhiên, hãy sử dụng cú pháp này nếu bạn thích, tuy nhiên, hãy lưu ý rằng hầu hết các chuyên gia SQL thích sử dụng INNER JOIN
cú pháp từ ví dụ trước ..
Tham gia bên trong trên 3 bảng
Dưới đây là một ví dụ về việc thực hiện liên kết bên trong trên 3 bảng.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
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 | +-----------+-----------+---------------+ (8 rows affected)
Trong ví dụ này, chúng tôi đưa ra các Owners
bảng vào hỗn hợp vì chúng tôi cần truy vấn này để trả lại thông tin về chủ sở hữu.
Để sử dụng bảng thứ ba, tất cả những gì chúng tôi đã làm là thêm một INNER JOIN... ON
đối số cùng với chi tiết bảng / cột có liên quan.
Trong trường hợp này, tôi đã sử dụng CONCAT()
của T-SQL hàm để nối hai cột, nhưng điều này không liên quan đến phép nối.