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ả thì JOIN là phép kết nối dữ liệu từ nhiều bảng lại với nhau ( bao gồm cả các view, sub query).
VD: Chúng ta có 2 bảng HOC_VIEN (A) và DIEM_THI (B) như dưới đây:
Với 2 bảng dữ liệu trên có liên kết thông qua cột MaHV, vậy làm thế nào chúng ta lấy ra được danh sách điểm thi có các cột môn học, họ tên học viên, mã lớp và điểm số cùng lúc? Khi đó chúng ta cần liên kết hay là JOIN các bảng dữ liệu lại với nhau và chỉ định ra các trường dữ liệu cần lấy.
SQL Server cung cấp các kiểu JOIN là INNER JOIN, OUTER JOIN, và CROSS JOIN.
1. INNER JOIN (viết tắt: JOIN)
Kết quả từ Inner join trong SQL là tập hợp dữ liệu trong đó giá trị dùng để join hai table với nhau đều có ở cả hai bảng, nghĩa là kết quả là GIAO của hai tập hợp dữ liệu.Các bản ghi chỉ xuất hiện ở một trong hai bảng sẽ bị loại.
Câu truy vấn như sau:
SELECT A.MonHoc,A.MaHV,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A INNER JOIN HOC_VIEN B ON A.MaHV = B.MaHV -- Hoặc có thể viết tắt -- SELECT A.MonHoc,A.MaHV,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A JOIN HOC_VIEN B ON A.MaHV = B.MaHV
Kết quả như chúng ta thấy với 6 bản ghi trên thì các giá trị MaHV đều có trong cả 2 bảng HOC_VIEN và DIEM_THI
2. OUTER JOIN trong SQL Server
Lấy về các bản ghi có mặt trong cả hai bảng và cả các bản ghi chỉ xuất hiện ở một trong hai bảng. Kiểu JOIN này được chia làm mấy loại sau:
2.1. LEFT OUTER JOIN (viết tắt: LEFT JOIN)
Lấy toàn bộ các dòng dữ liệu ở table bên trái và với những dòng dữ liệu tương ứng ở bảng bên phải CÓ giá trị MaHV ở bảng bên trái, nếu không có dữ liệu tương ứng bảng bên phải sẽ trả về kết quả null
Câu truy vấn như sau:
SELECT A.MonHoc,A.MaHV,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A LEFT OUTER JOIN HOC_VIEN B ON A.MaHV = B.MaHV -- Hoặc có thể viết tắt -- SELECT A.MonHoc,A.MaHV,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A LEFT JOIN HOC_VIEN B ON A.MaHV = B.MaHV
Kết quả như chúng ta thấy, tất cả các dòng ở bảng DIEM_THI đã được liệt kê ra, một số dòng có cột HoTen và MaLop là null là do nguyên nhân MaHV có ở bảng DIEM_THI nhưng không có ở bảng HOC_VIEN
2.2. RIGHT OUTER JOIN (viết tắt: RIGHT JOIN)
Ngược lại so với LEFT JOIN, lấy toàn bộ các dòng dữ liệu ở table bên phải và với những dòng dữ liệu tương ứng ở bảng bên trái CÓ giá trị MaHV ở bảng bên phải, nếu không có dữ liệu tương ứng bảng bên trái sẽ trả về kết quả null
Câu truy vấn như sau:
SELECT A.MonHoc,A.MaHV,B.MaHV MaHV2,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A RIGHT OUTER JOIN HOC_VIEN B ON A.MaHV = B.MaHV -- Hoặc có thể viết tắt -- SELECT A.MonHoc,A.MaHV,B.MaHV MaHV2,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A RIGHT JOIN HOC_VIEN B ON A.MaHV = B.MaHV
Kết quả như chúng ta thấy tất cả các dòng của bảng HOC_VIEN đã được liệt kê ra, mình thêm cột B.MaHV as MaHV2 ra để các bạn thấy danh sách của nó đầy đủ trong khi cột MaHV, MonHoc,DiemSo là null vì cột MaHV trong bảng DIEM_THI không có trong bảng HOC_VIEN. Các bạn có thể so sánh với bảng kết quả bên trên kia khi select left join nhé.
2.3. FULL OUTER JOIN (viết tắt: FULL JOIN)
Kết quả gồm tất cả các bản ghi của cả hai bảng. Với các bản ghi chỉ xuất hiện trong một bảng thì các cột dữ liệu từ bảng kia được điền giá trị NULL.
Câu truy vấn như sau:
SELECT A.MonHoc,A.MaHV,B.MaHV MaHV2,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A FULL OUTER JOIN HOC_VIEN B ON A.MaHV = B.MaHV -- Hoặc có thể viết tắt -- SELECT A.MonHoc,A.MaHV,B.MaHV MaHV2,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A FULL JOIN HOC_VIEN B ON A.MaHV = B.MaHV
Nhìn kết quả kia thì chúng ta có thể thấy kết quả là bao gồm là những dòng kết quả của LEFT JOIN và RIGHT JOIN kết hợp với nhau, không bao gồm các dòng trùng lặp. Trên kia, những dòng HoTen là null là do MaHV ở bảng DIEM_THI nhưng không có ở bảng HOC_VIEN và những dòng MonHoc,DiemSo là null nguyên nhân do MaHV có ở bảng HOC_VIEN mà không có ở bảng DIEM_THI.
3. CROSS JOIN
CROSS JOIN trong SQL ít được sử dụng hơn so với các loại JOIN ở trên do tính ít ý nghĩa của nó, kết quả trả về của CROSS JOIN là lấy số dòng của bảng bên trái x số dòng của bảng bên phải. Ví dụ bảng DIEM_THI có 12 dòng, bảng HOC_VIEN có 12 dòng, kết quả trả về là 12×12 = 144 dòng.
Dữ liệu được nhân lên do cứ tương ứng với 1 dòng trong DIEM_THI thì sẽ nối với toàn bộ 12 dòng trong HOC_VIEN mà không cần quan tâm đến tiêu chí so sánh nào (không có mệnh đề ON t1.ColumnA = t2.ColumnB như các kiểu JOIN khác).
Câu lệnh truy vấn như sau:
SELECT A.MonHoc,A.MaHV,B.HoTen,B.MaLop,A.DiemSo FROM DIEM_THI A CROSS JOIN HOC_VIEN B
KẾT BÀI
Chúng ta đã tìm hiểu về các loại JOIN trong SQL Server, chúng được sử dụng thường xuyên trong truy vấn dữ liệu và nhiều xử lý khác. Cho nên bạn cần thực hành cẩn thận và nắm thật rõ cách sử dụng các loại Join để khi làm việc với SQL Server được nhuần nhuyễn và hiệu quả hơn.
Liên hệ: Mr. Hải - Zalo/Phone: 0902.035.028 - hainh2k3@gmail.com
-
Với nhiều năm kinh nghiệm và làm việc trực tiếp xây dựng các hệ thống website, phần mềm quản lý, kế toán, kho, bán hàng, ERP, điều hành, giám sát và quản lý sản xuất như MES, Andon, mobile … Mình hoàn toàn tự tin có thể tư vấn cũng như hỗ trợ các bạn các giải pháp, vấn đề bạn quan tâm.
Mình cũng có mong muốn hợp tác, trao đổi, cùng làm với các bạn có ý tưởng phát triển dự án thú vị, hãy liên hệ với mình ngay nhé.
[…] Nếu muốn đọc để hiểu rõ hơn, các bạn có thể qua đọc series các bài viết về join sql: https://www.w3schools.com/sql/sql_join.asp https://hainh2k3.com/phan-biet-va-cach-su-dung-cac-loai-join-trong-mssql-server/ […]