Thao tác nối bảng (Join) trong lệnh truy vấn dữ liệu SELECT có nhiều biến thể (inner join, các dạng outer join). Việc hiểu rõ cách dùng chúng rất quan trọng trong việc lập trình các ứng dụng cần lưu trữ dữ liệu trong CSDL quan hệ. Bài viết này trình bày về một ví dụ đơn giản minh họa việc sử dụng các biến thể của thao tác nối bảng JOIN.
Tạo dữ liệu minh họa
Tạo 2 bảng dữ liệu A và B:
Chèn dữ liệu minh hoạ cho Bảng A và B:
INNER JOIN
Thực hiện truy vấn từ 2 Table A và B, với điều kiện B.A_B = A.A1:
select A2, A1, A_B, B1, B2 from A, B where A_B = A1;
Kết quả truy vấn như sau:
Ta có nhận xét là các bản ghi nằm trong bảng A và bảng B mà không có quan hệ với nhau đều bị loại khỏi kết quả truy vấn trên.
Ta có thể viết câu lệnh SQL trên theo một cú pháp tương đương khác như sau:
select A2, A1, A_B, B1, B2 from A INNER JOIN B ON A_B = A1;
LEFT OUTER JOIN
Trong trường hợp ta muốn truy vấn nối 2 Table A và B, đồng thời lại muốn hiển thị tất các bản ghi của Table A cho dù các bản ghi này không có bản ghi nào thuộc Table liên kết tới, thì ta cần sử dụng OUTER JOIN. Lưu ý là ta chỉ lấy tất cả bản ghi của Table A, ở phía trái của phép nối, nên ta sử dụng LEFT OUTER JOIN.
select A2, A1, A_B, B1, B2 from A left outer join B on B.A_B = A.A1;
Kết quả thực hiện lệnh truy vấn trên:
RIGHT OUTER JOIN
Ngược lại, một số trường hợp ta cần truy vấn ghép nối 2 Table A, B và chọn ra cả những bản ghi của B không tham chiếu đến bản ghi nào của A. Vì các bản ghi được chọn nằm về bên phải của phép nối nên ta sử dụng mệnh đề RIGHT OUTER JOIN trong câu lệnh truy vấn:
select A2, A1, A_B, B1, B2 from A right outer join B on B.A_B = A.A1;
Kết quả thực hiện lệnh truy vấn trên:
FULL OUTER JOIN
Trong trường hợp muốn truy vấn nối table A và B để chọn ra:
- các bản ghi của A nối với các bản ghi của B tham chiếu đến A
- tất cả các bản ghi A không có bản ghi nào của B tham chiếu đến
- tất cả các bản ghi B không tham chiếu đến bản ghi nào của A
thì ta có thể sử dụng câu lệnh truy vấn FULL OUTER JOIN:
select A2, A1, A_B, B1, B2 from A full outer join B on B.A_B = A.A1;
Kết quả thực hiện câu lệnh:
Các bạn có thể tải mã nguồn của ví dụ minh họa trên để thử nghiệm.