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 employeesdepartments như sau:

Bảng employees:

employee_idfirst_namelast_namedepartment_idsalary
1JohnDoe11500000
2JaneSmith21700000
3BobJohnson11300000
4AliceBrown32000000
5CharlieGreenNULL1800000

Bảng departments:

department_iddepartment_name
1Sales
2Marketing
3HR
4IT

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ằng UNION).

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 employeesdepartments

shell
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_namelast_namedepartment_name
JohnDoeSales
JaneSmithMarketing
BobJohnsonSales
AliceBrownHR

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ó)

shell
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_namelast_namedepartment_name
JohnDoeSales
JaneSmithMarketing
BobJohnsonSales
AliceBrownHR
CharlieGreenNULL

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_idNULL).

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ó)

shell
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_namelast_namedepartment_name
JohnDoeSales
JaneSmithMarketing
BobJohnsonSales
AliceBrownHR
NULLNULLIT

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 JOINRIGHT JOIN.

Ví dụ 4: Mô phỏng FULL JOIN bằng cách sử dụng UNION

shell
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_namelast_namedepartment_name
JohnDoeSales
JaneSmithMarketing
BobJohnsonSales
AliceBrownHR
CharlieGreenNULL
NULLNULLIT

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

shell
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ó)

shell
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ó)

shell
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

shell
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!