Kết nối bảng (JOIN): Sức mạnh trong CSDL Quan hệ

Đăng ngày: 20-09-2025 06:14
mariadbcơ sở dữ liệuMySQLJOININNER JOINLEFT JOINRIGHT JOINCSDL quan hệkết nối bảngtruy vấn SQL

Chào mừng bạn đến với bài viết thứ 8 trong loạt bài về MySQL & MariaDB. Trong bài viết này, chúng ta sẽ khám phá một khái niệm quan trọng: JOIN. JOIN cho phép chúng ta kết hợp dữ liệu từ nhiều bảng có liên quan với nhau. Đây là một kỹ thuật mạnh mẽ giúp chúng ta truy vấn thông tin phức tạp.

Tại sao cần sử dụng JOIN?

Trong cơ sở dữ liệu quan hệ, dữ liệu thường được chia thành nhiều bảng. Mỗi bảng lưu trữ thông tin về một loại đối tượng cụ thể. Ví dụ, một bảng có thể lưu trữ thông tin về khách hàng, và một bảng khác lưu trữ thông tin về đơn hàng. JOIN cho phép chúng ta kết hợp thông tin từ các bảng này dựa trên mối quan hệ giữa chúng.

Các loại JOIN phổ biến

Có nhiều loại JOIN khác nhau, nhưng ba loại phổ biến nhất là: INNER JOIN, LEFT JOIN, và RIGHT JOIN. Chúng ta sẽ đi sâu vào từng loại để hiểu rõ cách chúng hoạt động.

INNER JOIN

INNER JOIN trả về các hàng chỉ khi có sự trùng khớp giữa các bảng. Nó chỉ bao gồm các hàng mà giá trị trong cột kết nối tồn tại ở cả hai bảng. Đây là loại JOIN phổ biến nhất và thường được sử dụng khi bạn chỉ quan tâm đến các hàng có liên quan ở cả hai bảng.

Cú pháp:

SELECT * FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Ví dụ:

Giả sử chúng ta có hai bảng: `posts` (bài viết) và `authors` (tác giả).

Bảng `posts`:


+----+---------+-----------+
| id | title   | author_id |
+----+---------+-----------+
| 1  | Post A  | 1         |
| 2  | Post B  | 2         |
| 3  | Post C  | 1         |
| 4  | Post D  | 3         |
+----+---------+-----------+

Bảng `authors`:


+----+----------+
| id | name     |
+----+----------+
| 1  | John Doe |
| 2  | Jane Doe |
| 3  | Peter Pan|
+----+----------+

Để lấy thông tin về bài viết và tên tác giả, chúng ta sử dụng INNER JOIN:

SELECT posts.title, authors.name FROM posts INNER JOIN authors ON posts.author_id = authors.id;

Kết quả:


+---------+----------+
| title   | name     |
+---------+----------+
| Post A  | John Doe |
| Post B  | Jane Doe |
| Post C  | John Doe |
| Post D  | Peter Pan|
+---------+----------+

LEFT JOIN (LEFT OUTER JOIN)

LEFT JOIN trả về tất cả các hàng từ bảng bên trái (bảng được liệt kê đầu tiên trong mệnh đề FROM), và các hàng phù hợp từ bảng bên phải. Nếu không có hàng nào phù hợp ở bảng bên phải, các cột từ bảng bên phải sẽ chứa giá trị NULL.

Cú pháp:

SELECT * FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Ví dụ:

Sử dụng lại bảng `posts` và `authors` ở trên, chúng ta thực hiện LEFT JOIN:

SELECT posts.title, authors.name FROM posts LEFT JOIN authors ON posts.author_id = authors.id;

Kết quả (giống INNER JOIN trong trường hợp này vì mọi bài viết đều có tác giả):


+---------+----------+
| title   | name     |
+---------+----------+
| Post A  | John Doe |
| Post B  | Jane Doe |
| Post C  | John Doe |
| Post D  | Peter Pan|
+---------+----------+

Tuy nhiên, nếu chúng ta thêm một bài viết mới vào bảng `posts` mà không có tác giả tương ứng:


+----+---------+-----------+
| id | title   | author_id |
+----+---------+-----------+
| 5  | Post E  | NULL      |
+----+---------+-----------+

Thì LEFT JOIN sẽ trả về:


+---------+----------+
| title   | name     |
+---------+----------+
| Post A  | John Doe |
| Post B  | Jane Doe |
| Post C  | John Doe |
| Post D  | Peter Pan|
| Post E  | NULL     |
+---------+----------+

Bạn có thể thấy rằng 'Post E' vẫn được hiển thị, nhưng cột 'name' (từ bảng `authors`) có giá trị NULL.

RIGHT JOIN (RIGHT OUTER JOIN)

RIGHT JOIN tương tự như LEFT JOIN, nhưng nó trả về tất cả các hàng từ bảng bên phải (bảng được liệt kê thứ hai trong mệnh đề FROM), và các hàng phù hợp từ bảng bên trái. Nếu không có hàng nào phù hợp ở bảng bên trái, các cột từ bảng bên trái sẽ chứa giá trị NULL.

Cú pháp:

SELECT * FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Ví dụ:

Sử dụng lại bảng `posts` và `authors` ở trên, chúng ta thực hiện RIGHT JOIN:

SELECT posts.title, authors.name FROM posts RIGHT JOIN authors ON posts.author_id = authors.id;

Nếu chúng ta thêm một tác giả mới vào bảng `authors` mà không có bài viết tương ứng:


+----+------------+
| id | name       |
+----+------------+
| 4  | Ghost Author|
+----+------------+

Thì RIGHT JOIN sẽ trả về:


+---------+--------------+
| title   | name         |
+---------+--------------+
| Post A  | John Doe     |
| Post B  | Jane Doe     |
| Post C  | John Doe     |
| Post D  | Peter Pan    |
| NULL    | Ghost Author |
+---------+--------------+

Bạn có thể thấy rằng 'Ghost Author' vẫn được hiển thị, nhưng cột 'title' (từ bảng `posts`) có giá trị NULL.

Ví dụ thực tế: Hệ thống thương mại điện tử

Hãy xem xét một ví dụ thực tế hơn. Giả sử chúng ta có ba bảng: `customers` (khách hàng), `orders` (đơn hàng), và `products` (sản phẩm).

Để lấy thông tin về tất cả các đơn hàng và thông tin khách hàng tương ứng, chúng ta có thể sử dụng INNER JOIN hoặc LEFT JOIN (nếu chúng ta muốn hiển thị cả những khách hàng chưa có đơn hàng nào).

SELECT orders.*, customers.name, customers.email FROM orders INNER JOIN customers ON orders.customer_id = customers.id;

Để lấy thông tin về các sản phẩm trong một đơn hàng cụ thể, chúng ta có thể sử dụng JOIN với một bảng trung gian (ví dụ: `order_items`) để liên kết `orders` và `products`.

Lưu ý khi sử dụng JOIN

Khi sử dụng JOIN, hãy chắc chắn rằng bạn đã xác định đúng các cột kết nối giữa các bảng. Sử dụng bí danh bảng (table aliases) để làm cho truy vấn của bạn dễ đọc hơn. Tránh sử dụng JOIN quá nhiều bảng trong một truy vấn, vì điều này có thể ảnh hưởng đến hiệu suất. Hãy cân nhắc sử dụng chỉ mục (indexes) trên các cột kết nối để tăng tốc độ truy vấn.

Kết luận

JOIN là một công cụ mạnh mẽ trong cơ sở dữ liệu quan hệ. Nó cho phép chúng ta kết hợp dữ liệu từ nhiều bảng và tạo ra các truy vấn phức tạp. Hiểu rõ các loại JOIN khác nhau (INNER JOIN, LEFT JOIN, RIGHT JOIN) là rất quan trọng để xây dựng các ứng dụng cơ sở dữ liệu hiệu quả. Hãy thực hành sử dụng JOIN trong các dự án của bạn để nắm vững kỹ năng này. Chúc bạn thành công!

0 Bình luận