Phép JOIN trong SQL được sử dụng để kết hợp dữ liệu giữa 2 hay nhiều bảng dựa trên các trường dữ liệu chung của chúng thông thường thông qua khóa chính và khóa ngoại.
Trong SQL phép JOIN được chia thành 4 loại:
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL JOIN
Cho 2 table như sau:
Student
ROOL_NO | NAME | ADDRESS | PHONE | AGE |
1 | HARSH | DELPHI | XXXXXXXXXX | 18 |
2 | PRATIK | BIHAR | XXXXXXXXXX | 19 |
3 | RIYANKA | SILIGURI | XXXXXXXXXX | 20 |
4 | DEEP | RAMNAGAR | XXXXXXXXXX | 18 |
5 | SAPTARHI | KOLKATA | XXXXXXXXXX | 19 |
6 | DHANRAJ | BARABAJAR | XXXXXXXXXX | 20 |
7 | ROHIT | BALURGHAT | XXXXXXXXXX | 18 |
8 | NIRAJ | ALIOUR | XXXXXXXXXX | 19 |
StudentCource
COURSE_ID | ROLL_NO |
1 | 1 |
2 | 2 |
2 | 3 |
3 | 4 |
1 | 5 |
4 | 9 |
5 | 10 |
4 | 11 |
Inner Join
Là phép JOIN đơn giản nhất trong SQL, từ khóa INNER JOIN sẽ lấy tất cả các dòng từ cả 2 bảng miễn là chúng thỏa mãn điều kiện.
Cú pháp
SELECT table1.column1,table1.column2,table2.column1,.... FROM table1 INNER JOIN table2 ON table1.matching_column = table2.matching_column; table1: Table 1. table2: Table 2 matching_column:Cột dùng để so sánh điều kiện.
Xem hình dưới đây để dễ tưởng tượng hơn:
Lưu ý rằng lệnh JOIN cũng tương ứng với INNER JOIN. Chúng ta có thể tùy ý viết JOIN hay INNER JOIN đều có thể được.
SELECT StudentCourse.COURSE_ID, Student.NAME, Student.AGE FROM Student INNER JOIN StudentCourse ON Student.ROLL_NO = StudentCourse.ROLL_NO;
COURSE_ID | NAME | AGE |
1 | HARSH | 18 |
2 | PRATIK | 19 |
2 | RIYANKA | 20 |
3 | DEEP | 18 |
1 | SAPTARHI | 19 |
Left Join
Phép Join này sẽ trả về tất cả các dòng dữ liệu từ bảng phía bên trái phép Join với các dòng thỏa điều kiện của bảng phía bên phải phép JOIN. Nếu các dòng dữ liệu phía bên trái không có dòng dữ liệu phía bên phải nào thỏa điều kiện thì kết quả về của chúng sẽ hiện thị null.
LEFT JOIN cũng có tên gọi là LEFT OUTER JOIN nên chúng ta có thể sử dụng một trong 2 từ khóa trên đều được.
SELECT table1.column1,table1.column2,table2.column1,.... FROM table1 LEFT JOIN table2 ON table1.matching_column = table2.matching_column; table1: Table 1. table2: Table 2 matching_column:Cột dùng để so sánh điều kiện.
Cùng một câu truy vấn trên hiển thị NAME và COURSE_ID mà một Student đã đăng ký. Các Student không có đăng ký môn học thì hiển thị null.
SELECT Student.NAME,StudentCourse.COURSE_ID FROM Student LEFT JOIN StudentCourse ON StudentCourse.ROLL_NO = Student.ROLL_NO;
NAME | COURSE |
HARSH | 1 |
PRATIK | 2 |
RIYANKA | 2 |
DEEP | 3 |
SAPTARHI | 1 |
DHANRAJ | NULL |
ROHIT | NULL |
NIRAJ | NULL |
Right Join
Ngược lại với Right Join, Right Join trả về tất cả các dòng dữ liệu từ bảng phía bên phải phép Join với các dòng thỏa điều kiện của bảng phía bên trái. Nếu các dòng dữ liệu phía bên phải không có dòng dữ liệu phía bên trái nào thỏa điều kiện thì kết quả về của chúng sẽ hiện thị null.
RIGHT JOIN cũng có tên gọi là RIGHT OUTER JOIN nên chúng ta có thể sử dụng một trong 2 từ khóa trên đều được.
SELECT table1.column1,table1.column2,table2.column1,.... FROM table1 RIGHT JOIN table2 ON table1.matching_column = table2.matching_column; table1: Table 1. table2: Table 2 matching_column:Cột dùng để so sánh điều kiện.
Ví dụ tìm các COURSE_ID, NAME và các Student đã đăng ký khóa học. Nếu khóa học không có Student đăng ký thì hiển thị null.
SELECT Student.NAME,StudentCourse.COURSE_ID FROM Student RIGHT JOIN StudentCourse ON StudentCourse.ROLL_NO = Student.ROLL_NO;
Output
NAME | COURSE |
HARSH | 1 |
PRATIK | 2 |
RIYANKA | 2 |
DEEP | 3 |
SAPTARHI | 1 |
NULL | 4 |
NULL | 5 |
NULL | 4 |
Full Join
Full Join có thể xem là sự kết hợp của Left Join và Right Join. Kết hợp trả về sẽ chứa toàn bộ các dòng dữ liều từ cả 2 bảng. Những dòng dữ liệu nào không có có kết quả phù hợp sẽ được hiển thị null.
SELECT table1.column1,table1.column2,table2.column1,.... FROM table1 FULL JOIN table2 ON table1.matching_column = table2.matching_column; table1: Table 1. table2: Table 2 matching_column:Cột dùng để so sánh điều kiện.
Ví dụ hiển thị tất cả các Student và Course, nếu không Student chưa đăng ký Course nào thì hiện thị null, ngược lại nếu Course chưa được Student nào đăng ký thì cũng sẽ hiển thị null.
SELECT Student.NAME,StudentCourse.COURSE_ID FROM Student FULL JOIN StudentCourse ON StudentCourse.ROLL_NO = Student.ROLL_NO;
Output
NAME | COURSE |
HARSH | 1 |
PRATIK | 2 |
RIYANKA | 2 |
DEEP | 3 |
SAPTARHI | 1 |
DHANRAJ | NULL |
ROHIT | NULL |
NIRAJ | NULL |
NULL | 9 |
NULL | 10 |
NULL | 11 |
Nguồn tham khảo
https://www.geeksforgeeks.org/sql-join-set-1-inner-left-right-and-full-joins/