Giới thiệu
Trong các hệ thống quản lý dữ liệu, hiếm khi thông tin được lưu trữ trong một bảng duy nhất. Để duy trì tính nhất quán và tránh trùng lặp, dữ liệu thường được chia thành nhiều bảng liên quan. Tuy nhiên, để truy vấn thông tin từ nhiều bảng cùng lúc, ta cần một cách để "ghép nối" chúng lại. Đó chính là vai trò của JOIN trong MySQL — một công cụ mạnh mẽ giúp kết hợp các hàng từ hai hoặc nhiều bảng dựa trên mối quan hệ giữa chúng.
Các loại JOIN cơ bản
INNER JOIN
Đây là dạng JOIN phổ biến nhất. Nó trả về các hàng có sự trùng khớp trong cả hai bảng. Nếu không có sự trùng khớp, hàng đó sẽ bị loại bỏ.
SELECT *
FROM khach_hang
INNER JOIN hoa_don
ON khach_hang.id = hoa_don.khach_hang_id;
LEFT JOIN (LEFT OUTER JOIN)
Trả về tất cả các hàng từ bảng bên trái, kèm theo các hàng trùng khớp từ bảng bên phải. Nếu không có sự trùng khớp, các cột của bảng bên phải sẽ có giá trị NULL.
SELECT *
FROM khach_hang
LEFT JOIN hoa_don
ON khach_hang.id = hoa_don.khach_hang_id;
RIGHT JOIN (RIGHT OUTER JOIN)
Ngược lại với LEFT JOIN, dạng này trả về tất cả các hàng từ bảng bên phải, kèm theo các hàng trùng khớp từ bảng bên trái.
SELECT *
FROM khach_hang
RIGHT JOIN hoa_don
ON khach_hang.id = hoa_don.khach_hang_id;
CROSS JOIN
Trả về tích đề-các (Cartesian product) của hai bảng — mỗi hàng của bảng này sẽ kết hợp với mỗi hàng của bảng kia. Thường ít được sử dụng trừ khi cố ý muốn tạo mọi sự kết hợp có thể.
SELECT *
FROM khach_hang
CROSS JOIN hoa_don;
Mẹo tối ưu hiệu năng JOIN
Sử dụng chỉ mục (index)
Khóa ngoại và các cột dùng để JOIN nên được đánh chỉ mục để tăng tốc độ tìm kiếm.
Hạn chế sử dụng OR trong điều kiện JOIN
Thay vì dùng OR, nên chia thành nhiều JOIN riêng biệt hoặc dùng UNION khi cần.
Quảng cáo
300x250 In-Content Advertisement
Chọn đúng loại JOIN
Tránh dùng CROSS JOIN trừ khi thực sự cần thiết, vì nó có thể sinh ra lượng dữ liệu rất lớn.
Truy vấn con (subquery) vs JOIN
Trong nhiều trường hợp, JOIN hiệu quả hơn subquery, đặc biệt khi cần lấy nhiều cột từ bảng liên quan.
Ví dụ thực tế
Giả sử có ba bảng: nhan_vien (nhân viên), phong_ban (phòng ban), và du_an (dự án). Để lấy danh sách nhân viên cùng phòng ban và dự án họ tham gia:
SELECT nv.ho_ten, pb.ten_phong, da.ten_du_an
FROM nhan_vien nv
INNER JOIN phong_ban pb
ON nv.phong_ban_id = pb.id
INNER JOIN du_an_nhan_vien dan
ON nv.id = dan.nhan_vien_id
INNER JOIN du_an da
ON dan.du_an_id = da.id;
Nếu muốn liệt kê tất cả phòng ban, kể cả phòng chưa có nhân viên:
SELECT pb.ten_phong, COUNT(nv.id) AS so_nhan_vien
FROM phong_ban pb
LEFT JOIN nhan_vien nv
ON pb.id = nv.phong_ban_id
GROUP BY pb.id;
Kết luận
JOIN là một tính năng không thể thiếu khi làm việc với cơ sở dữ liệu quan hệ. Nó cho phép ta kết hợp thông tin từ nhiều bảng một cách linh hoạt, từ đó xây dựng các truy vấn phức tạp nhưng vẫn hiệu quả. Việc nắm vững các loại JOIN và biết cách tối ưu chúng sẽ giúp bạn quản lý và khai thác dữ liệu một cách tối ưu, đáp ứng mọi yêu cầu nghiệp vụ một cách chính xác và nhanh chóng.