Khi bạn đang làm việc với cơ sở dữ liệu của mình, bạn có thể cần tập hợp dữ liệu từ một vài bảng khác nhau. Bài viết này sẽ hướng dẫn bạn cách thực hiện.
Tôi đã viết về các phép nối SQL ở đây và ở đây, nhưng chúng ta hãy dành một chút thời gian để xem lại cách thức hoạt động của phép nối trước và đặc biệt là cú pháp dành riêng cho MySQL.
Câu lệnh kết hợp SQL
Tham gia là một câu lệnh cho phép bạn đặt hai bảng lại với nhau, khớp các hàng có liên quan với nhau và chỉ giữ lại các hàng có thể được khớp, không giữ các hàng chưa được ghép nối.
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
SELECT ... FROM
câu lệnh cho biết bảng nào là bảng đầu tiên, sau đó tên bảng thứ hai được viết ngay sau INNER JOIN
từ khóa.
Cách nối hai bảng được viết trong ON
tuyên bố. Trong trường hợp này, hai bảng được nối bằng mối quan hệ table1.id = table2.id
.
Có thể sử dụng nhiều câu lệnh nối với nhau để tham gia nhiều bảng cùng một lúc.
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3
ON table2.id = table3.id;
Để làm điều đó, bạn thêm INNER JOIN
thứ hai và một câu lệnh ON
thứ hai câu lệnh để chỉ ra bảng thứ ba và mối quan hệ thứ hai.
Hãy nói một chút về mối quan hệ mà bạn có thể có giữa các bảng và lý do tại sao bạn có thể muốn nối ba bảng lại với nhau.
Mối quan hệ giữa các bảng trong SQL
Khi bạn có các bảng liên quan đến nhau, mối quan hệ của chúng có thể là một trong nhiều kiểu khác nhau.
một-nhiều
Theo kiểu quan hệ một-nhiều, một hàng của bảng đầu tiên có thể liên quan đến nhiều hàng của bảng thứ hai.
Trong cơ sở dữ liệu quan hệ, điều này có thể được triển khai với bảng thứ hai có first_table_id
cột cho biết hàng đó có liên quan đến hàng nào của bảng đầu tiên.
nhiều-một
Theo kiểu quan hệ nhiều-một, một hàng của bảng đầu tiên có thể liên quan đến một hàng duy nhất của bảng thứ hai và một hàng của bảng thứ hai có thể liên quan đến nhiều hàng của bảng đầu tiên.
Trong cơ sở dữ liệu quan hệ, điều này có thể được triển khai với bảng đầu tiên có second_table_id
cột cho biết hàng đó có liên quan đến hàng nào của bảng thứ hai.
nhiều đến nhiều
Trong trường hợp này, nhiều hàng có liên quan đến nhiều hàng.
Loại mối quan hệ này không thể được biểu diễn như với các bảng SQL - bạn cần thêm một bảng ghép nối giữa hai bảng để chỉ có các mối quan hệ nhiều-một và một-nhiều hiện diện giữa các bảng.
Mỗi hàng của bảng ở giữa đại diện cho một mối quan hệ giữa các hàng của bảng bên trái và các hàng của bảng bên phải.
Trong thực tế trong MySQL, bảng giữa đó sẽ có một cột cho first_table_id
và một cột cho second_table_id
, với mỗi kết hợp là duy nhất.
Tham gia các bảng SQL trong thực tế
Hãy tưởng tượng chúng ta có cơ sở dữ liệu của tổ chức, nơi chúng ta có một bảng với các nhóm (tên của họ và thông tin nhận dạng khác) và một bảng có các dự án (tên, tiến độ, v.v.).
id | team_name | chuyên môn |
---|---|---|
1 | Ném chuối | Chuối |
2 | Người gặm gỗ | gặm gỗ |
3 | Những chú voi hồng | Dậm chân xuống đất |
4 | Khoai tây mịn | Làm việc và ngủ |
id | project_name | tiến trình |
---|---|---|
1 | Xây dựng đập | Cần thêm một số động tác gặm gỗ và dẫm đất |
2 | Bánh chuối | Ai đó đang ăn hết chuối |
3 | Nghiên cứu giấc ngủ | Ngủ nhiều không đủ nghiên cứu |
Vì một nhóm có thể làm việc trên nhiều dự án và một dự án có thể được thực hiện bởi nhiều nhóm, nên cũng có một bảng thứ ba theo dõi các trận đấu của nhóm-dự án.
project_id | group_id |
---|---|
1 | 2 |
1 | 3 |
2 | 1 |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
Chúng ta có thể sử dụng JOIN
câu lệnh để kết hợp mọi thứ lại với nhau khi chúng ta cần xem thông tin từ các bảng theo cách con người có thể đọc được, như sau:
SELECT
teams.team_name AS team_name,
projects.project_name AS project_name
FROM TABLE teams
INNER JOIN matches
ON teams.id = matches.team_id
INNER JOIN matches
ON matches.project_id = projects.id
ORDER BY teams.id;
Chúng tôi chọn các cột để hiển thị từ mỗi bảng bằng SELECT
tuyên bố.
Chúng tôi chỉ định cách các hàng của bảng được kết hợp với một ON
tuyên bố.
Và chúng tôi sắp xếp các hàng theo cách chúng tôi thích với ORDER BY
tuyên bố.
ON
câu lệnh teams.id = matches.team_id
và matches.projects_id = projects.id
nghĩa là các hàng được kết hợp bằng cách sử dụng các hàng của matches
bàn. Mỗi hàng của bảng đầu ra có tên dự án và tên nhóm được kết hợp bằng cách sử dụng các cặp id dự án và id nhóm trong các matches
bảng.
Bảng kết quả sẽ như dưới đây.
Team_name | Project_name |
---|---|
Người ném chuối | Bánh chuối |
Ném chuối | Nghiên cứu về giấc ngủ |
Máy gặm gỗ | Đập Bulding |
Máy gặm gỗ | Nghiên cứu về giấc ngủ |
Những chú voi hồng | Xây dựng đập |
Những chú voi hồng | Xây dựng đập |
Khoai tây mịn | Nghiên cứu về giấc ngủ |
Không có cột nào trực tiếp từ matches
bàn. matches
bảng không được hiển thị trong đầu ra nhưng nó được sử dụng làm hướng dẫn về cách kết hợp các hàng của teams
và các dự án projects
bảng.
Kết luận
JOIN
câu lệnh cho phép bạn kết hợp một hoặc nhiều bảng với nhau. Nó phải được sử dụng cùng với ON
để xác định mối quan hệ giữa các hàng của một bảng và các hàng của một bảng khác nhau.
Trong bài viết này, bạn đã học cách sử dụng JOIN
để kết hợp ba bảng khác nhau với nhau.