Tags:

Phép chia trong SQL

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 
        )
3 2 votes
Article Rating
Subscribe
Notify of
guest
7 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
7
0
Would love your thoughts, please comment.x
()
x