Bài tập

1-7 Phép toán tập hợp trong SQL

Huy Erick

Mở đầu SQL là ngôn ngữ lấy luận tập hợp là một trong những cơ bản. Cho đến nay thì những tính năng của SQL vẫn chưa được sử dụng một cách đầy đủ trong...

Mở đầu

SQL là ngôn ngữ lấy luận tập hợp là một trong những cơ bản. Cho đến nay thì những tính năng của SQL vẫn chưa được sử dụng một cách đầy đủ trong những phép toán tập hợp. Tuy nhiên trong những năm gần đây thì cuối cùng SQL đã tập hợp đủ những tính năng của phép toán tập hợp cơ bản và có khả năng ứng dụng một cách đúng cách. Chương này sẽ giới thiệu những technique sử dụng phép toán tập hợp của SQL và giải thích cách nghĩ trong bối cảnh đó.

Nhập môn - Những điểm chú ý liên quan đến phép toán tập hợp

Phép toán tập hợp trong SQL cũng ý hệt như tên của nó, sẽ là phép toán để lấy được tập hợp, và trong vài trường hợp sẽ là lấy phép toán mà argument là view hay bảng để thực thi. Về cơ bản thì giống như đại số tổ hợp được học trong trung học cơ sở và phổ thông nên chắc mọi người chắc sẽ dễ hiểu trực quan hơn nhưng trong SQL thì cần chú ý một vài đặc trưng đặc biệt.

Chú ý 1: Tập hợp được dùng trong SQL có thể sử dụng tập hợp có dòng trùng nên để đối ứng với cái đó thì có option ALL

Thông thường nếu nói về tập hợp bằng luận tập hợp thì sẽ không chấp nhận những thành tố trùng. Vậy nên, tập hợp {1,1,2,3,3,3} sẽ được nhìn giống ý hệt như tập hợp {1,2,3}. Tuy nhiên bảng trong cơ sở dữ liệu quan hệ thì có thể chấp nhận được dòng trùng (multiset, bag).

Vì vậy nên trong phép toán tập hợp của SQL thì được chuẩn bị 2 phiên bản là phiên bản chấp nhận dòng trùng và phiên bản không chấp nhận dòng trùng. Bình thường nếu sử dụng UNION và INTERSECT mà không thêm điều kiện gì thì những dòng trùng sẽ bị xóa đi. Nếu trong trường hợp muốn để lại dòng trùng thì chúng ta thêm ALL như UNION ALL. Vừa đúng ngược lại hoàn toàn với cách dùng DISTINCT vào câu lệnh SELECT.

Chú ý 2: Trong thứ tự của phép tính thì có những thứ tự ưu tiên

Trong SQL thông thường thì trong UNION và EXCEPT thì INTERSECT được thực hiện trước hơn hết. Vậy nên ví dụ trong trường hợp có UNION và INTERSECT mà muốn thực hiện UNION trước thì chúng ta phải chỉ định cho vào ngoặc một cách rõ ràng.

Chú ý 3: Tùy từng DBMS mà tình trạng thực thi phép toán tổ hợp sẽ khác nhau

SQL Server từ bản 2005 đã hộ trợ INTERSECT và EXCEPT, nhưng MySQL vẫn chưa có cả 2 chức năng đó. Mặt khác, giống như trong Oracle có những DBMS có những biệt danh như MINUS thay cho EXCEPT. Mặc dù đây là một điểm khá bất tiện nhưng những người dùng Oracle thì hãy hãy thay tất cả EXCEPT bằng MINUS.

Chú ý 4: Phép chia vẫn chưa được định nghĩa một cách thông thường, chính thống

Trong 4 phép tính cơ bản thì có tổng (UNION), tích (CROSS JOIN), hiệu (EXCEPT) được định nghĩa. Tuy nhiên, còn một thứ nữa là phép thương (DIVIDE BY) vẫn chưa được thông thường hóa. Vậy nên khi sử dụng phép chia thì cần thiết phải tạo một truy vấn.

Kết luận

Cuối cùng, những phép toán tập hợp trong SQL là một công cụ mạnh mẽ để thực hiện những truy vấn phức tạp và tối ưu hóa hiệu suất của cơ sở dữ liệu. Bằng cách áp dụng đúng các quy tắc và kỹ thuật, ta có thể tận dụng hết sức mạnh của SQL và xây dựng các truy vấn có hiệu suất cao và kết quả chính xác.

1