Khi làm việc với cơ sở dữ liệu, bạn có thể muốn truy vấn hai hoặc nhiều bảng cùng lúc và tạo một tập kết quả kết hợp. Ví dụ: bạn muốn tìm tên của mọi nhân viên và phòng ban họ làm việc, trong khi hai thông tin này lưu ở hai bảng khác nhau.
Đó là lúc SQL JOIN phát huy tác dụng. Khi nối (join) các bảng, bạn có thể chạy truy vấn trên nhiều bảng và tạo kết quả kết hợp.
Trong hướng dẫn này, chúng ta tập trung vào một loại join: OUTER JOIN. Toán tử OUTER JOIN trả về các hàng ngay cả khi chúng không có hàng liên quan trong bảng được nối. Chúng ta sẽ thảo luận ba loại OUTER JOIN, cách chúng hoạt động và cách sử dụng trong truy vấn SQL.
Ôn tập SQL JOIN
Truy vấn, thường bắt đầu bằng câu lệnh SELECT, dùng để lấy thông tin từ cơ sở dữ liệu. Thông thường, khi viết truy vấn bạn tập trung lấy thông tin từ một bảng và dùng mệnh đề FROM để chỉ định bảng. Cú pháp truy vấn SQL tiêu chuẩn:
SELECT ten_cot FROM ten_bang WHERE dieu_kien_nao_do;
Ví dụ truy vấn lấy danh sách tên mọi nhân viên trong bảng employees:
SELECT name FROM employees;
Kết quả:
| name |
|---|
| Luke Mike Hannah Geoff Alexis Emma Jonah Adam |
(8 hàng)
Chúng ta cũng có thể dùng mệnh đề WHERE để lọc kết quả chỉ bao gồm các bản ghi đáp ứng tiêu chí nhất định. Ví dụ: tìm tên tất cả nhân viên bán hàng hoặc toàn bộ nhân viên điều hành.
Nhưng nếu muốn lấy thông tin từ nhiều bảng và gộp kết quả vào một bảng? Đó là lúc JOIN xuất hiện.
JOIN cho phép truy vấn nhiều bảng và tạo tập kết quả kết hợp với các hàng khớp. Có ba loại join chính: INNER JOIN, OUTER JOIN và CROSS JOIN.
INNER JOIN: chỉ trả về hàng khớp ở cả hai bảng.OUTER JOIN: trả về hàng ngay cả khi không có hàng liên quan trong bảng được nối.CROSS JOIN: join không có điều kiện nối, mỗi hàng của bảng này kết hợp với hàng tương ứng của bảng kia.
SQL OUTER JOIN
Như đã thảo luận, khi thực hiện INNER JOIN, các hàng không khớp từ bất kỳ bảng nào sẽ không được trả về. Nhưng nếu chúng ta muốn lấy những giá trị này? Chúng ta dùng OUTER JOIN.
Có ba loại OUTER JOIN:
LEFT OUTER JOIN: trả về hàng không khớp từ bảng bên trái.RIGHT OUTER JOIN: trả về hàng không khớp từ bảng bên phải.FULL OUTER JOIN: trả về hàng không khớp từ tất cả các bảng.
OUTER JOIN có thể khớp bản ghi từ cả hai bảng dựa trên nhu cầu và trả về tất cả bản ghi liên quan đến loại join được sử dụng.
SQL JOIN: LEFT (Left Outer Join)
Left join trả về tất cả hàng từ bảng bên trái và hàng từ bảng bên phải nơi điều kiện join được thỏa mãn.
Giả sử có hai bảng: employees và company_departments. Chúng ta muốn lấy tên mọi nhân viên và tên phòng ban của họ, ngay cả khi nhân viên chưa được gán phòng ban. Dùng LEFT JOIN:
SELECT employees.name, company_departments.name FROM employees LEFT JOIN company_departments ON employees.department_id = company_departments.department_id;
Kết quả:
| name | name |
|---|---|
| Luke | Sales |
| Mike | Sales |
| Hannah | Sales |
| Geoff | Sales |
| Alexis | Sales |
| Emma | Marketing |
| Jonah | Executive |
| Adam |
(8 hàng)
Như bạn thấy, LEFT JOIN trả về tất cả hàng từ bảng employees, ngay cả khi phòng ban không tìm thấy trong bảng company_departments (Adam không có phòng ban).
SQL JOIN: RIGHT (Right Outer Join)
Câu lệnh RIGHT JOIN là đối lập trực tiếp của LEFT JOIN. RIGHT JOIN trả về tất cả hàng từ bảng bên phải và hàng từ bảng bên trái nơi điều kiện join được thỏa mãn.
Giả sử chúng ta muốn lấy danh sách tên tất cả phòng ban và tên nhân viên làm việc ở các phòng ban đó, bao gồm cả phòng ban chưa có nhân viên. Truy vấn:
SELECT employees.name, company_departments.name AS "DeptName" FROM employees RIGHT JOIN company_departments ON employees.department_id = company_departments.department_id;
Kết quả:
| name | "deptname" |
|---|---|
| Luke | Sales |
| Mike | Sales |
| Hannah | Sales |
| Geoff | Sales |
| Alexis | Sales |
| Emma | Marketing |
| Jonah | Executive |
| Payroll | |
| Information Technology |
(9 hàng)
Truy vấn trả về tất cả phòng ban, kể cả Payroll và Information Technology chưa có nhân viên. Adam (nhân viên không có phòng ban) không xuất hiện vì RIGHT JOIN chỉ bao gồm tất cả hàng từ bảng bên phải (company_departments).
FULL OUTER JOIN
FULL OUTER JOIN là loại join ít gặp hơn, trả về bản ghi không khớp từ cả hai bảng. Thường dùng với hàm tổng hợp để hiểu mức độ chồng chéo giữa hai bảng.
Lấy danh sách tất cả nhân viên và phòng ban:
SELECT employees.name, company_departments.name AS "DeptName" FROM employees FULL OUTER JOIN company_departments ON employees.department_id = company_departments.department_id;
Kết quả:
| name | "deptname" |
|---|---|
| Luke | Sales |
| Mike | Sales |
| Hannah | Sales |
| Geoff | Sales |
| Alexis | Sales |
| Emma | Marketing |
| Jonah | Executive |
| Adam | |
| Payroll | |
| Information Technology |
(10 hàng)
Kết quả bao gồm: mọi nhân viên (kể cả không có phòng ban) và mọi phòng ban (kể cả không có nhân viên).
Kết luận
JOIN là hàm SQL cho phép truy vấn hai hoặc nhiều bảng cùng lúc và tạo tập kết quả kết hợp. Ví dụ: nếu muốn lấy danh sách nhân viên và ngày xử lý phiếu lương gần nhất, bạn có thể dùng JOIN.
Trong hướng dẫn này, chúng ta tập trung vào OUTER JOIN — trả về hàng trong join ngay cả khi không có hàng liên quan trong bảng được nối. Chúng ta cũng đã thảo luận ba loại chính: LEFT JOIN, RIGHT JOIN và FULL OUTER JOIN — và khám phá cách chúng hoạt động thực tế.
Bây giờ bạn đã sẵn sàng thực hiện các phép SQL JOIN như một chuyên gia!