1. Giới thiệu
SQL Joins được sử dụng để kết hợp các bản ghi từ hai hoặc nhiều bảng dựa trên mối quan hệ giữa các cột chung. Khi làm việc với cơ sở dữ liệu quan hệ, dữ liệu thường được lưu trữ trong nhiều bảng khác nhau để tối ưu hóa việc lưu trữ và quản lý. Để truy xuất dữ liệu từ các bảng này một cách hợp lý, chúng ta sử dụng SQL Joins.
Trong bài viết này, chúng ta sẽ tìm hiểu về các loại SQL Joins khác nhau như INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, và các ví dụ thực tế để bạn dễ dàng áp dụng.
2. Bảng dữ liệu giả định
Giả sử chúng ta có hai bảng employees và departments như sau:
Bảng employees:
| employee_id | first_name | last_name | department_id | salary |
|---|---|---|---|---|
| 1 | John | Doe | 1 | 1500000 |
| 2 | Jane | Smith | 2 | 1700000 |
| 3 | Bob | Johnson | 1 | 1300000 |
| 4 | Alice | Brown | 3 | 2000000 |
| 5 | Charlie | Green | NULL | 1800000 |
Bảng departments:
| department_id | department_name |
|---|---|
| 1 | Sales |
| 2 | Marketing |
| 3 | HR |
| 4 | IT |
3. SQL Joins là gì?
SQL Joins được sử dụng để kết hợp các bản ghi từ hai hoặc nhiều bảng trong cơ sở dữ liệu dựa trên điều kiện chung (thường là mối quan hệ giữa các khóa chính và khóa ngoại).
Có nhiều loại SQL Joins khác nhau, bao gồm:
- INNER JOIN: Trả về các bản ghi có giá trị khớp trong cả hai bảng.
- LEFT JOIN (LEFT OUTER JOIN): Trả về tất cả các bản ghi từ bảng bên trái, và các bản ghi khớp từ bảng bên phải.
- RIGHT JOIN (RIGHT OUTER JOIN): Trả về tất cả các bản ghi từ bảng bên phải, và các bản ghi khớp từ bảng bên trái.
- FULL JOIN (FULL OUTER JOIN): Trả về tất cả các bản ghi khi có sự khớp từ một trong hai bảng (MySQL không hỗ trợ trực tiếp
FULL JOIN, nhưng có thể mô phỏng bằngUNION).
4. Các loại SQL Joins và ví dụ
a. INNER JOIN
INNER JOIN chỉ trả về các bản ghi có giá trị khớp trong cả hai bảng dựa trên điều kiện ON.
Ví dụ 1: Sử dụng INNER JOIN để kết hợp bảng employees và departments
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;Kết quả:
| first_name | last_name | department_name |
|---|---|---|
| John | Doe | Sales |
| Jane | Smith | Marketing |
| Bob | Johnson | Sales |
| Alice | Brown | HR |
Trong ví dụ này, chỉ những nhân viên có giá trị department_id khớp với department_id trong bảng departments mới được trả về.
b. LEFT JOIN (LEFT OUTER JOIN)
LEFT JOIN trả về tất cả các bản ghi từ bảng bên trái, ngay cả khi không có bản ghi khớp trong bảng bên phải. Nếu không có bản ghi khớp, các cột từ bảng bên phải sẽ chứa giá trị NULL.
Ví dụ 2: Sử dụng LEFT JOIN để trả về tất cả nhân viên và phòng ban tương ứng (nếu có)
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;Kết quả:
| first_name | last_name | department_name |
|---|---|---|
| John | Doe | Sales |
| Jane | Smith | Marketing |
| Bob | Johnson | Sales |
| Alice | Brown | HR |
| Charlie | Green | NULL |
Trong ví dụ này, LEFT JOIN trả về tất cả các nhân viên, bao gồm cả Charlie, người không thuộc phòng ban nào (department_id là NULL).
c. RIGHT JOIN (RIGHT OUTER JOIN)
RIGHT JOIN trả về tất cả các bản ghi từ bảng bên phải, ngay cả khi không có bản ghi khớp trong bảng bên trái. Nếu không có bản ghi khớp, các cột từ bảng bên trái sẽ chứa giá trị NULL.
Ví dụ 3: Sử dụng RIGHT JOIN để trả về tất cả các phòng ban và nhân viên tương ứng (nếu có)
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;Kết quả:
| first_name | last_name | department_name |
|---|---|---|
| John | Doe | Sales |
| Jane | Smith | Marketing |
| Bob | Johnson | Sales |
| Alice | Brown | HR |
| NULL | NULL | IT |
Trong ví dụ này, RIGHT JOIN trả về tất cả các phòng ban, bao gồm cả phòng "IT" không có nhân viên nào.
d. FULL JOIN (FULL OUTER JOIN)
FULL JOIN trả về tất cả các bản ghi từ cả hai bảng khi có sự khớp ở một trong hai bảng. Nếu không có sự khớp, các giá trị NULL sẽ được hiển thị. Lưu ý rằng MySQL không hỗ trợ FULL JOIN trực tiếp, nhưng có thể mô phỏng bằng cách sử dụng UNION của LEFT JOIN và RIGHT JOIN.
Ví dụ 4: Mô phỏng FULL JOIN bằng cách sử dụng UNION
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id
UNION
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;Kết quả:
| first_name | last_name | department_name |
|---|---|---|
| John | Doe | Sales |
| Jane | Smith | Marketing |
| Bob | Johnson | Sales |
| Alice | Brown | HR |
| Charlie | Green | NULL |
| NULL | NULL | IT |
Trong ví dụ này, FULL JOIN trả về tất cả các nhân viên và tất cả các phòng ban, kể cả những nhân viên không có phòng ban và những phòng ban không có nhân viên.
5. Các ví dụ khác về SQL Joins
Ví dụ 1: Sử dụng INNER JOIN để lấy thông tin nhân viên và phòng ban họ làm việc
SELECT e.first_name, e.last_name, d.department_name
FROM employees AS e
INNER JOIN departments AS d ON e.department_id = d.department_id;Ví dụ 2: Sử dụng LEFT JOIN để lấy tất cả nhân viên và thông tin phòng ban (nếu có)
SELECT e.first_name, e.last_name, d.department_name
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.department_id;Ví dụ 3: Sử dụng RIGHT JOIN để lấy tất cả phòng ban và thông tin nhân viên (nếu có)
SELECT e.first_name, e.last_name, d.department_name
FROM employees AS e
RIGHT JOIN departments AS d ON e.department_id = d.department_id;Ví dụ 4: Sử dụng FULL JOIN để lấy tất cả nhân viên và tất cả phòng ban
SELECT e.first_name, e.last_name, d.department_name
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.department_id
UNION
SELECT e.first_name, e.last_name, d.department_name
FROM employees AS e
RIGHT JOIN departments AS d ON e.department_id = d.department_id;6. Một số lưu ý khi sử dụng SQL Joins
a. Cẩn thận với số lượng bản ghi trả về
Khi sử dụng JOIN, số lượng bản ghi trả về có thể tăng lên do các bản ghi được kết hợp. Nếu bạn kết hợp nhiều bảng mà không có điều kiện thích hợp, có thể dẫn đến số lượng bản ghi dư thừa.
b. Sử dụng bí danh (Aliases) cho bảng
Khi làm việc với nhiều bảng có cùng tên cột, việc sử dụng bí danh giúp bạn dễ dàng phân biệt cột từ các bảng khác nhau và làm cho truy vấn dễ đọc hơn.
c. Hiệu suất
Việc sử dụng các loại JOIN có thể ảnh hưởng đến hiệu suất, đặc biệt khi kết hợp các bảng lớn. Bạn nên tối ưu hóa các truy vấn JOIN bằng cách sử dụng chỉ mục (index) và các chiến lược tối ưu hóa khác.
Kết luận
SQL Joins là công cụ mạnh mẽ giúp bạn kết hợp dữ liệu từ nhiều bảng trong cơ sở dữ liệu. Các loại JOIN như INNER JOIN, LEFT JOIN, RIGHT JOIN, và FULL JOIN cho phép bạn lấy dữ liệu theo nhiều cách khác nhau, tùy thuộc vào yêu cầu của bạn. Hiểu rõ cách sử dụng từng loại JOIN sẽ giúp bạn khai thác tối đa dữ liệu trong cơ sở dữ liệu quan hệ.
Hãy thử áp dụng các ví dụ này vào các bài tập và dự án thực tế trên CodeTutHub để thành thạo hơn trong việc sử dụng SQL Joins!









