SQL cho phép kết hợp (JOIN) các dòng giữa hai hay nhiều bảng dựa trên các cột giống nhau giữa các bảng này.
Khái niệm JOIN này có thể dễ hiểu hơn là việc gộp tất cả các điều kiện chọn và điều kiện nối kết trong mệnh đề WHERE.
Ba kiểu nối kết :
-
Phép kết nối tự nhiên NATURAL JOIN
-
Phép nối kết đơn giản INNER JOIN
-
Các phép nối kết OUTER JOIN:
LEFT JOIN (mở rộng trái)
RIGHT JOIN (mở rộng phải)
FULL JOIN (mở rộng hai bên)
3.1. NATURAL JOIN
Tương tự đại số quan hệ, nối kết tự nhiên cho phép nối kết giữa hai bảng
-
Không yêu cầu chỉ ra điều kiện nối kết
-
Nối kết ngầm định giữa hai thuộc tính cùng tên giữa 2 bảng
-
Hai thuộc tính cùng tên này chỉ xuất hiện 1 lần trong quan hệ kết quả
Ví dụ: Tìm mã và họ tên phi công có số ngày làm việc cho một công ty bất kỳ lớn hơn 20 ngày
SELECT DISTINCT pc.MPC, hoten
FROM LAMVIEC AS lv NATURAL JOIN PHICONG AS pc
WHERE songay > 20 ; --- ????
Nếu 2 thuộc tính không cùng tên ->
có thể đổi tên trước khi nối kết.
Có thể xảy ra lỗi khi có 2 thuộc tính cùng tên ở 2 bảng nhưng không phải là hai thuộc tính để nối kết (thuộc tính khoá chính và khoá ngoài)
LƯU Ý: SQL Server không hỗ trợ NATURAL JOIN 😊))
3.2. INNER JION
Là loại nối kết đơn giản được dùng nhiều nhất không chỉ riêng MS – SQL Server mà hầu hết các hệ quản trị CSDL khác – cũng là lựa chọn yêu thích nhất của dân Data và Dev.
Cú pháp:
SELECT <tên cột> [ ,…]
FROM <bảng 1>
INNER JOIN | JOIN <bảng 2>
ON <bảng 1>.<tên cột> = <bảng 2>.<tên cột>;
Cách nối kết:
Đối với mỗi dòng của bảng 1, tìm các dòng tương ứng trong bảng 2 ->
sự tương ứng này được thực hiện dựa trên các cột chung của 2 bảng, đó là các cột dùng để nối kết:
-
Nếu không tìm được, dòng này (<bảng 1>) không được thêm vào kết quả.
-
Nếu tìm được, một dòng sẽ được thêm vào kết quả (dòng này bao gồm sự kết hợp các cột ở cả hai bảng.
-
Nếu tìm được nhiều dòng tương ứng ở <bảng 2>, nhiều dòng sẽ được thêm vào kết quả (giá trị các cột của <bảng 1> lặp lại nhiều lần).
Ví dụ: Tìm họ tên các phi công có số ngày làm việc cho một công ty nào đó là 20 ngày
SELECT hoten
FROM PHICONG AS pc JOIN LAMVIEC AS lv
ON pc.MPC = lv.MPC
WHERE songay = 20;
3.3. LEFT JOIN
Cú pháp LEFT JOIN:
SELECT <tên cột> [ ,…]
FROM <bảng 1>
LEFT JOIN | LEFT OUTER JOIN <bảng 2>
ON <bảng 1>.<tên cột> = <bảng 2>.<tên cột>;
Kết quả bao gồm:
-
Các dòng tương ứng ở cả 2 bảng (kết quả INNER JOIN)
-
Và các dòng thuộc bảng <bảng 1> không tương ứng với <bảng 2>. Các cột tương ứng của <bảng 2> sẽ mang giá trị NULL
Ví dụ: Tìm họ tên các phi công, mã công ty và số ngày làm việc cho công ty nào đó kể các các phi công chưa làm việc cho công ty nào.
SELECT hoten, MCT, songay
FROM PHICONG AS pc
LEFT JOIN LAMVIEC AS lv
ON pc.MPC = lv.MPC;
3.4. RIGHT JOIN
Cú pháp RIGHT JOIN:
SELECT <tên cột> [ ,…]
FROM <bảng 1>
RIGHT JOIN | RIGHT OUTER JOIN <bảng 2>
ON <bảng 1>.<tên cột> = <bảng 2>.<tên cột>;
Kết quả bao gồm :
-
Các dòng tương ứng ở cả 2 bảng (kết quả INNER JOIN)
-
Và các dòng thuộc bảng <bảng 2> không tương ứng với <bảng 1>. Các cột tương ứng của <bảng 1> sẽ mang giá trị NULL
Ví dụ: Tìm họ tên, mã phi công, địa chỉ và số ngày làm việc của các phi công sống ở Anh làm việc cho công ty có mã số là 1 kể cả trường hợp công ty này không có phi công ở Anh làm việc.
SELECT lv.MPC, hoten,dchi, songay
FROM (SELECT * FROM PHICONG WHERE nuoc LIKE 'Anh') AS pc
RIGHT JOIN (SELECT * FROM LAMVIEC where MCT = 1) AS lv
ON pc.MPC = lv.MPC;
3.5. FULL JOIN
Cú pháp FULL JOIN:
SELECT <tên cột> [ ,…]
FROM <bảng 1>
FULL JOIN | FULL OUTER JOIN <bảng 2>
ON <bảng 1>.<tên cột> = <bảng 2>.<tên cột>;
Kết quả bao gồm :
-
Các dòng tương ứng ở cả 2 bảng (kết quả INNER JOIN)
-
Và các dòng thuộc bảng <bảng 1> không tương ứng với <bảng 2>. Các cột tương ứng của <bảng 2> sẽ mang giá trị NULL
-
Và các dòng thuộc bảng <bảng 2> không tương ứng với <bảng 1>. Các cột tương ứng của <bảng 1> sẽ mang giá trị NULL
Ví dụ: Tìm họ tên, MPC, địa chỉ và số ngày làm việc của các phi công sống ở Anh làm việc cho công ty mã số 1 kể cả trường hợp các phi công ở Anh không làm việc cho công ty 1 và cả trường hợp công ty này không có phi công ở Anh làm việc.
SELECT lv.MPC, hoten,dchi, songay
FROM (SELECT * FROM PHICONG WHERE nuoc LIKE 'Anh') AS pc
FULL JOIN (SELECT * FROM LAMVIEC where MCT = 1) AS lv
ON pc.MPC = lv.MPC ;