Các loại Join cơ bản trong SQL
Có một câu hỏi phỏng vấn khá thông dụng khi phỏng vấn lập trình viên, đặc biệt với vị trí Back - End là "join trong sql gồm những loại nào và phân biệt chúng như nào". Mình cũng gặp nhiều bạn dù đã code BE 1 - 2 năm nhưng vẫn mơ hồ về kiến thức cơ bản này, thực sự đây là một thiếu sót rất cần phải bù đắp nhất là khi các bạn tham gia xử lý truy vấn nhiều với các database có kiến trúc phức tạp.
Join là gì?
Là một mệnh đề trong SQL, sử dụng để kết nối dữ liệu từ hai hay nhiều bảng trong cơ sở dữ liệu lại với nhau. Khi bạn cần truy vấn các cột dữ liệu từ nhiều bảng khác nhau để trả về trong cùng một tập kết quả, bạn cần dùng JOIN, SQL sẽ tạo ra một bảng tạm thời chứa dữ liệu kết quả từ JOIN.
Các loại join cơ bản:
Inner join ( hoặc join) : Trả về các bản ghi khi có một sự phù hợp trong tất cả các bảng được join.
Ví dụ:
Ta có 2 bảng ban đầu, cần lấy những thông tin và đơn hàng của các nhà cung ứng có ở bảng đầu và đã bán được sản phẩm như liệt kê trong bảng thứ hai.
Câu lệnh select :
SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
INNER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;
Chạy xong câu lệnh chúng ta được kết quả:
Left outer join ( hoặc left join) : trả về tất cả bản ghi bảng bên trái, ngay cả khi không có sự phù hợp trong bảng bên phải, còn những bản ghi nào của bảng bên phải phù hợp với bảng trái thì dữ liệu bản ghi đó được dùng để kết hợp với bản ghi bảng trái, nếu không có dữ liệu sẽ NULL.
Ví dụ:
Ta có hai bảng ban đầu, cần lấy thông tin của tất cả các nhà cung ứng ở bảng đầu tiên và đơn hàng nếu có của chúng theo liệt kê ở bảng thứ hai.
Câu lệnh select:
SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
LEFT OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;
Chạy xong câu lệnh chúng ta được kết quả:
Right outer join ( hoặc 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ó sự phù hợp nào ở bảng bên trái, trường hợp này ngược lại với left join.
Ví dụ:
Ta có hai bảng ban đầu, cần lấy tất cả thông tin các đơn hàng ở bảng thứ hai, và thông tin về nhà cung ứng của chúng nếu có.
Câu lệnh select:
SELECT donhang.donhang_id, donhang.donhang_ngay, nhacung.nhacung_ten
FROM nhacung
RIGHT OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;
Chạy câu lệnh select ta được kết quả:
Full outer join ( hoặc full join) : trả về các bản ghi khi có một sự phù hợp trong một trong các bảng.
Ví dụ:
Ta có hai bảng ban đầu, cần lấy tất cả thông tin về các đơn hàng (có thể có nhà cung ứng hoặc không) và tất cả các nhà cung ứng (có thể có đơn hàng hoặc không) trong cùng một câu lệnh.
Câu lệnh select :
SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
FULL OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;
Kết quả nhận được sau khi chạy lệnh sql:
Self join : được sử dụng để join một bảng với chính nó như thể bảng đó là hai bảng, tạm thời đổi tên ít nhất một bảng trong câu lệnh SQL ( với alias).
Ví dụ:
Bảng "nhanvien" có dữ liệu như sau:
Chúng ta sẽ tìm xem đối với từng nhân viên trong bảng thì sẽ có những nhân viên còn lại nào có mức lương cao hơn bằng câu lệnh:
SELECT a.id, b.ten, a.luong
FROM nhanvien a, nhanvien b
WHERE a.luong < b.luong;
Chạy câu lệnh ta được kết quả:
Kết luận:
Ở trên mình đã giới thiệu với các bạn về các loại Join cơ bản trong SQL và ví dụ đơn giản đi kèm, trong quá trình sử dụng các bạn có thể tùy biến chúng thêm với các từ khóa hay điều kiện join, điều kiện select, order by, .... đi kèm khác để đạt được các mục đích truy vấn mong muốn.
Tài liệu tham khảo