Không giống như các ngôn ngữ lập trình khác, SQL không hỗ trợ phép chia vì thế chúng ta phải thể hiện nó thông qua sự hỗ trợ của các mệnh đề khác như JOIN, EXCEPT, IN.
Thông thường phép chia thường được dùng với các câu truy vấn có chứa từ khoá tất cả, ví dụ như:
- Tìm những người có tài khoản tại tất cả các ngân hàng trong một thành phố?
- Tìm những sinh viên đã học xong tất cả các môn để đủ điều kiện tốt nghiệp.
Cú pháp sử dụng phép chia
Cho cơ sở dữ liệu sau:
Cho các bảng R (A, B, C, D, E) và S (D, E) như sau:
Bị chia:
R Chia: S
Sử dụng EXCEPT
SELECT R1.A, R1.B, R1.C FROM R R1 WHERE NOT EXISTS ( ( SELECT S.D, S.E FROM S) EXCEPT ( SELECT R2.D, R2.E FROM R R2 WHERE R1.A=R2.A AND R1.B=R2.B AND R1.C=R2.C ) )
Ví dụ Tìm các giáo viên (MAGV) mà tham gia tất cả các đề tài Bị chia : THAMGIADT (MAGV, MADT, …)
Chia: DETAI (MADT, …)
SELECT DISTINCT TG1.MAGV FROM THAMGIADT TG1 WHERE NOT EXISTS ( ( SELECT MADT FROM DETAI) EXCEPT ( SELECT MADT FROM THAMGIADT TG2 WHERE TG2.MAGV = TG1.MAGV ) )
Sử dụng NOT EXISTS
SELECT R1.A, R1.B, R1.C FROM R R1 WHERE NOT EXISTS ( SELECT * FROM S WHERE NOT EXISTS ( SELECT * FROM R R2 WHERE R2.D=S.D AND R2.E=S.E AND R1.A=R2.A AND R1.B=R2.B AND R1.C=R2.C ))
Ví dụTìm các giáo viên (MAGV) mà tham gia tất cả các đề tài (Dùng NOT EXISTS)
Bị chia : THAMGIADT (MAGV, MADT, …)
Chia: DETAI (MADT, …)
SELECT TG.MAGV FROM THAMGIADT TG1 WHERE NOT EXISTS ( SELECT * FROM DETAI DT WHERE NOT EXISTS ( ))
Sử dụng Gom nhóm
Cho R(A,B), S(B), thực hiện R÷S
SELECT R.A FROM R [WHERE R.B IN (SELECT S.B FROM S [WHERE <ĐK>]] GROUP BY R.A HAVING COUNT(DISTINCT R.B) = ( SELECT COUNT(S.B) FROM S [WHERE <ĐK>])
Ví dụ Tìm các giáo viên (MAGV) mà tham gia tất cả các đề tài (Dùng NOT EXISTS)
SELECT TG.MAGV FROM THAMGIADT TG1 GROUP BY TG.MAGV HAVING COUNT(DISTINCT TG1.MADT) = ( SELECT COUNT(DT.MADT) FROM DETAI DT )