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

Tham gia bên trong SQL

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sửa đổi dữ liệu trong phần Cách ly ảnh chụp nhanh đã cam kết đọc

  2. Kết nối Ứng dụng 64-bit với Acomba

  3. Cách sắp xếp theo thứ tự bảng chữ cái trong SQL

  4. Hội nghị thượng đỉnh PASS 2013:Thành công ở Charlotte

  5. 7 công cụ sơ đồ hóa cơ sở dữ liệu miễn phí cho các thư mục dữ liệu bận rộn