Ngoại trừ mysql

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

Open start

SQL là ngôn ngữ được định nghĩa từ tập hợp luận, đây cũng là một chủ đề được nêu lên trong cuốn sách này. Chính vì vậy mà SQL được gọi là ngôn ngữ hướng tập hợp và lần đầu tiên tôi thấy sức mạnh nhìn từ quan điểm tập hợp. Tuy nhiên, trên thực tế thì SQL vẫn đang ngơ ngác về mặt này

Về bối cảnh này thì đó cũng là một phần trách nhiệm của SQL. Because in a short time before here, SQL không được trang bị các phép toán tập hợp cơ bản được học cho tầm trung học phổ biến. Tổng [UNION] được trang bị từ SQL-86 cổ nhưng cho phép giao [INTERSECT] hay hiệu [EXCEPT] thì mới được cho vào SQL-92 mới đây rồi cho phép chia [DIVIDE BY] vẫn chưa được cho vào thông thường hóa thì vấn đề . Do đó nên có thể nói lý do cũng là do SQL chưa được hoàn thiện đầy đủ

Tuy nhiên, đối với hiện tại thì những phép tính cơ bản đã được trang bị đầy đủ trong SQL, rồi ta cũng có thể kết hợp những thứ đó, tiến hàng thực thi và cuối cùng cũng có khả năng ứng dụng một cách đúng nghĩa. Chương này sẽ giới thiệu các tiện ích SQL sử dụng phép toán hợp lệ, giải thích về cách suy nghĩ của nó và sẽ tiếp cận bản chất của SQL bằng các mức độ khác nhau cho đến nay

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

Phép toán tập hợp trong SQL cũng lưu ý như tên của nó, sẽ là phép toán để lấy tập hợp được, và trong vài trường hợp sẽ là phép toán mà đối số là xem hoặc 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ổ biến nên chắc chắn mọi người chắc chắn 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ú thích 1. Tập hợp được sử dụng trong SQL có thể sử dụng tập hợp có dòng trùng lặp nên để đối chiếu với cái đó thì có tùy chọn TẤT CẢ

Thông thường nếu nói về tập hợp bằng cách bình luận tập hợp, thì sẽ không chấp nhận các thành phần trùng lặp. Do đó, tập hợp {1,1,2,3,3,3} sẽ được nhìn giống như lối thoá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 trùng lặp dòng [multiset, bag]

Vì vậy nên khi cho phép tập hợp toán học của SQL thì chuẩn bị 2 phiên bản là phiên bản nhận dòng trùng lặp và phiên bản không nhận dòng trùng lặp. 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 lặp sẽ bị xóa đi. Nếu trong trường hợp muốn lùi dòng trùng lặp thì chúng ta bổ sung ALL như UNION ALL. Vừa đúng ngược lại hoàn toàn bằng cách sử dụng DISTINCT vào câu lệnh CHỌN. Tuy nhiên không hiểu sao nhưng cách viết như UNION DISTINCT thì không được chấp nhận

Trong 2 cách sử dụng trên thì tồn tại thêm 1 điểm khác ngoài kết quả của phép tính. Đó chính là để xóa các dòng trùng lặp trong phép toán tổ hợp thì sẽ phát sinh sắp xếp dữ liệu ẩn nhưng nếu thêm TẤT CẢ vào thì sắp xếp dữ liệu không diễn ra và hướng hiệu suất. Đây là hiệu quả điều chỉnh hiệu suất nên đối với những trường hợp không cần thiết để nhắc đến dòng trùng hoặc trường hợp chắc chắn không xuất hiện những dòng trùng thì thêm TẤT CẢ vào dòng trùng sẽ tốt hơn

Chú thích 2. Trong thứ tự của phép tính thì có 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. Do đó, 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 trích dẫn một cách rõ ràng. [Ví dụ về điểm chú ý này sẽ được nêu trong phần luyện tập]

Chú thích 3. Tùy từng DBMS mà trạng thái thực thi phép toán tổ hợp sẽ khác nhau

Cũng như đã nêu lên từ trước thì trong SQL đời đầu, những chuẩn bị để thực hiện phép toán tập hợp vẫn đang làm vất vả. Chính vì vậy nên trạng thái thực thi ở từng DBMC không được thống nhất. SQL Server from bản 2005 đã hỗ trợ INTERSECT và EXCEPT, nhưng MySQL vẫn chưa có cả 2 chức năng đó. Other face, same as in Oracle has the DBMS has the other list as MINUS instead for 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 thay đổi tất cả NGOẠI TRỪ bằng MINUS

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

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à thương [DIVIDE BY] vẫn chưa được thông thường hóa. Do đó, khi sử dụng phép chia thì nhất thiết phải tạo một truy vấn

1. So sánh giữa các bảng với nhau - kiểm tra tính tương đồng của tập tin. phần cơ bản

Trong những trường hợp di chuyển môi trường DB sẽ có những trường hợp muốn sao lưu dữ liệu sau khi sao lưu có giống như ban đầu dữ liệu không. Ở đây, nói là "bằng" có nghĩa là số dòng hoặc số cột rồi nội dung dữ liệu giống nhau, có nghĩa là "giống nhau như cách nói của một tập hợp". Ví dụ chúng ta có 2 bảng là tbl_A và tbl_B chỉ khác nhau về tên gọi nhưng về mặt tập hợp thì giống y như sau

tbl_A

keycol_1col_2col_3A234B079C516

tbl_B

keycol_1col_2col_3A234B079C516

Do đó có phương pháp nào để biết được bảng này nếu giống nhau thì cho kết quả là giống nhau, nếu không giống nhau thì cho kết quả là không giống nhau? . Theo như ví dụ, ở một mức độ nào đó về số dòng thì kiểm tra bằng mắt cũng có thể không sai, nhưng với qui mô hàng trăm dòng, hàng nghìn dòng thì chuyện kiểm tra bằng mắt chắc chắn sẽ không thực hiện được.

Về trường hợp này chúng ta có 2 con đường để thực hiện. Đầu tiên chúng ta sẽ xem từ cách đơn giản sử dụng UNION. Đầu tiên chúng ta sẽ giả định đã kiểm tra xong rằng 2 bảng này giống nhau về số dòng. [If number of lines not same nhau, from that program will end]

Trong trường hợp này thì cả 2 bảng đều có 3 dòng. Nếu kết quả truy vấn dưới đây là 3 thì chúng ta có thể hiểu 2 bảng này giống nhau nhưng người lại Nếu kết quả lớn hơn 3 thì hai bảng này khác nhau

Kết quả của truy vấn này nếu số dòng của tbl_A và tbl_B đồng nhất với nhau thì hai bảng giống nhau

SELECT COUNT[*] AS row_cnt
  FROM [ SELECT *
           FROM tbl_A
         UNION
         SELECT *
           FROM tbl_B ] TMP;

Kết quả

row_cnt
---------
      3

Tại sao lại có thể nói như vậy? . Tập hợp toán trong SQL nếu không gắn thêm TẤT CẢ thì sẽ xóa đi các dòng trùng lặp. Chính vì vậy nếu tbl_A và tbl_B giống nhau thì dòng trùng lặp bị xóa đi, 2 bảng hoàn toàn nhập lại với nhau thành 1

Tất nhiên chỉ cần một dòng khác nhau thôi thì kết quả sẽ là 4. Các dòng khác nhau sau khi qua giai đoạn xóa các dòng trùng lặp thì không thể hóa tốt nhất mà vẫn còn dư ra bên ngoài

Ví dụ bảng B khác và kết quả trở thành 4

tbl_A

keycol_1col_2col_3A234B079C516

tbl_B

keycol_1col_2col_3A234B078C516

Câu hỏi này kể cả bảng có chứa NULL thì cũng được chạy đúng, và điều thuận lợi là nó không chỉ định dạng dữ liệu là số hay chữ. Chỉ sử dụng UNION thôi nên ngay trong MySQL cũng có thể sử dụng được. Tất nhiên, chúng ta cũng có thể so sánh dãy là một bộ phận của bảng hoặc một bộ phận của dãy thôi cũng được. Trong trường hợp đó, chúng ta phải chỉ định tên dãy muốn so sánh, thiết lập điều kiện ở câu lệnh WHERE được

Như ví dụ trên ta có thể nhìn thấy rõ, UNION của SQL đối với bảng S là

CÔNG ĐOÀN S = S

Điều này có nghĩa là UNION mang một tính chất rất quan trọng. Tính chất này trong toán học được gọi là khái niệm kết quả không thay đổi khi thực hiện 1 lần hay nhiều lần cũng vẫn như vậy [idempotency]. Bây giờ đây là khái niệm được sử dụng trong đại số hiển thị, nó có một vài ý nghĩa khác nhau nhưng nói về nghĩa được sử dụng trong trường hợp này, thì nó có ý nghĩa là đối với S nhập vào trong phép toán nhị phân. . UNION được dùng với nghĩa như thế này

Trong lĩnh vực lập trình thì chúng ta mở rộng trường nghĩa này ra thì cũng có thể dùng với nghĩa "kết quả sau khi chạy nhiều lần với kết quả trong trường hợp chạy một lần là giống nhau". Ví dụ như một ví dụ gần với ta sẽ là tệp đầu của ngôn ngữ C được thiết kế mang tính bất khả thi. Ta bao gồm một tệp bao nhiêu lần thì kết quả cũng không thay đổi so với trường hợp bao gồm một lần. With the meaning that, then GET in HTTP also impedency. Một yêu cầu được phát hành đi lặp lại cũng được thực hiện một cách an toàn. Mặt khác, tính chất này đặc biệt với giao diện người dùng thì sẽ có một sự trách nhiệm rất quan trọng. Cơ bản của công việc thiết kế giao diện an toàn đó chính là có nhấn một nút bao lần đi chăng nữa thì cũng giống như nhấn nút đó 1 lần

Trong trường hợp phép toán tập hợp là UNION thì nếu nhìn [S UNION S] như một đơn vị xử lý thì bao nhiêu lần thực hiện lý cũng vậy thì kết quả xử lý không thay đổi. Cái này chúng ta cũng gọi là bất khả thi. Như vậy chúng ta cũng có thể so sánh xem 3 hay nhiều bảng giống nhau hay không

CÔNG ĐOÀN S CÔNG ĐOÀN S CÔNG ĐOÀN S. CÔNG ĐOÀN S = S

Một điểm cần chú ý ở đây chính là nếu ta lặp lại phép toán UNION ALL thì mỗi lần như vậy kết quả sẽ thay đổi nên sẽ không tính được tính không khả thi. Lý do tương tự như vậy, đối với những bảng có dòng trùng nhau thì UNION sẽ mất đi tính bất khả thi. Có nghĩa là tính năng mạnh và đẹp này tồn tại chỉ là câu chuyện của thế giới tập hợp, đối với thế giới tập hợp có nhiều dòng trùng nhau thì không sử dụng được

Do đó, before before process up, we have a question. Thực ra, trong phép toán tổ hợp thì ngoài UNION ra còn có một thứ nữa cũng có tính bất khả thi. Vì vậy nó là gì?

2. So sánh giữa các bảng với nhau - kiểm tra tính tương đồng của tập tin. application section

Với giải pháp trước, khi so sánh giữa 2 bảng thì chúng ta cần phải điều tra trước dòng số của 2 bảng chuẩn trước. Mặc dù cái này cũng không tốn quá nhiều thời gian và công sức nhưng chúng ta hãy cùng suy nghĩ về phương pháp cải thiện thiện chí để có thể kiểm tra tính đồng nhất của bảng mà không cần sự chuẩn bị trước đó. Về ví dụ, chúng ta luôn sử dụng tbl_A và tbl_B có từ phần 1

Trong luận tập hợp, về cơ bản về công thức điều tra tính giống nhau của tập hợp thì về công thức thì có 2 công thức sau được biết đến nhiều nhất

  1. [A ⊆ B ] かつ [A ⊇ B] ⇒ [A = B]
  2. [A ∪ B ] = [A ∩ B] ⇒ [A = B]

Phương pháp số 1 là phương pháp dùng quan hệ bao hàm để điều tra tính toán đồng nhất của tập hợp. Có nghĩa là nếu B thuộc A cùng với A thuộc B thì A = B. Chúng ta cũng có thể sử dụng phương pháp này để điều trị nhưng sẽ hơi thành công. [Trở về phương pháp này sẽ có ví dụ được nhắc đến trong phần sau]

Mặt khác, về một phía thì phương pháp số 2 là công thức tra cứu đồng nhất dựa trên phép giao và phép cộng của tập hợp. Nếu chúng ta dịch ra bằng ngôn ngữ SQL thì chính là [A UNION B = A INTERSECT B thì A=B]. Chúng ta có thể viết dễ dàng hơn theo cách này

Nếu A và B là hai tập tin giống nhau thì [A UNION B = A = B]. Và thực ra ở INTERSECT cũng vậy, A INTERSECT B = A = B đã được thiết lập. Đúng vậy, ngoài UNION thì còn một phép tính nữa cũng có tính bất khả thi mà chính là INTERSECT

Ngược lại, nếu A khác B thì kết quả của UNION và INTERSECT sẽ khác nhau. Chắc chắn kết quả của UNION sẽ lớn hơn. Đầu tiên chúng ta tưởng tượng hình ảnh nếu tập A và B khác nhau với hình ảnh như sau thì sẽ dễ hiểu hơn

Vấn đề còn lại là chúng ta làm thế nào để so sánh kết quả của UNION và INTERSECT. Bây giờ chúng ta hiểu là đã có,

[ A GIAO DIỆN B ] ⊆ [ A UNION B ]

Do đó, chúng ta tiếp tục theo chỉ cần phán đoán xem [A UNION B] NGOẠI TRỪ [A INTERSECT B] có kết quả trống không được. Nếu A = B thì kết quả sẽ trống, còn nếu A khác B thì chắc chắn sẽ còn sót trên 1 dòng

--Truy vấn điều tra nếu hai tập hợp bằng nhau thì sẽ trả lại kết quả bằng, còn không bằng nhau thì sẽ trả lại kết quả khác.
SELECT DISTINCT CASE WHEN COUNT[*] = 0
                     THEN 'Bằng'
                     ELSE 'Khác' END AS result
  FROM [[SELECT * FROM  tbl_A
         UNION
         SELECT * FROM  tbl_B]
         EXCEPT
        [SELECT * FROM  tbl_A
         INTERSECT
         SELECT * FROM  tbl_B]] TMP;

Với truy vấn này thì tất nhiên chúng ta không cần biết đó là dãy chữ hay dãy số, kể cả bảng NULL cũng có thể sử dụng được thì điểm mạnh này vẫn được tặng kèm, cùng với điểm lợi hơn là mất tiêu chuẩn là . Tuy nhiên, các chức năng cao thì sẽ phát sinh khuyết điểm. Bộ toán học tập hợp phát sinh 3 lần sắp xếp sẽ làm giảm hiệu suất. Vì vậy nên dùng trước khi sử dụng thì mọi người hãy suy xét điểm và thiếu điểm trước nhé

Bây giờ chúng ta đã biết rằng sự khác biệt hay giống nhau của 2 bảng nhưng lần này chúng ta cùng hiển thị cụ thể hơn dòng nào khác của hai bảng. Chúng ta chỉ cần tưởng tượng chúng ta thực hiện lệnh khác với tệp như đối với bảng này là được. Cái này thì chỉ cần chọn tập hợp loại trừ tổng hợp là được

--diff của bảng
[SELECT * FROM  tbl_A
 EXCEPT
 SELECT * FROM  tbl_B]
UNION ALL
[SELECT * FROM  tbl_B
 EXCEPT
 SELECT * FROM  tbl_A];

Kết quả

key     col_1     col_2     col_3
-----   -------   -------   -------
B           0         7         9
B           0         7         8

Giữa A-B và B-A chắc chắn sẽ không tồn tại phần giao tiếp nên khi hợp nhất hai bộ phận này thì chúng ta sử dụng UNION ALL cũng không thành vấn đề gì cả. Truy vấn này trong trường hợp một bảng này là một bộ phận trong bảng kia cũng có thể thực thi đúng. [Trong trường hợp đó thì 1 trong A-B hay B-A sẽ là tập hợp trống]. Sử dụng dấu ngoặc để chỉ định thứ tự thực hiện cho phép tính nên nếu bỏ ra thì không chắc chúng ta đã có kết quả đúng

3. Hiển thị cho phép chia quan hệ bằng tập hợp giao

Cũng như đã nêu trong phần mở đầu thì trong SQL chưa có một dấu hiệu cho phép các công cụ có thể cho phép chia. Chính vì vậy thì chúng ta cần phải viết truy vấn trước mới có thể thực hiện được phép chia. Có rất nhiều phương pháp nhưng có những cách tiêu biểu như

  1. NOT EXISTS to gang table
  2. Use 1 đối 1 trong câu lệnh HAVING
  3. Allowed icon divide

Lần này phần tiếp theo sẽ giới thiệu về phương pháp thứ 3

Allowance in a nullosystem that is allowable of a interface file. Trong lúc giới thiệu phương pháp viết tập hợp giao tiếp bằng OUTER JOIN trong phần "Cách sử dụng OUTER JOIN" thì chúng tôi đã ra bài tập để mọi người suy nghĩ về phương pháp, thì đây chính là cách giải thích của phương pháp đó

Ví dụ dữ liệu sử dụng 2 bảng quản lý thông tin kỹ thuật của nhân viên trong công ty

Kỹ năng

skillOracleUNIXJava

EmpSkills

empskillAidaOracleAidaUNIXAidaJavaAidaC#KanzakiOracleKanzakiUNIXKanzakiJavaHiraiUNIXHiraiOracleHiraiPHPHiraiPerlHiraiC++WakatabePerlToraiOracle

Vấn đề là từ bảng EmpSkills tìm những nhân viên có tất cả những kỹ năng có trong bảng Kỹ năng. Tức là câu trả lời là Aida và Kanzaki. Hirai thì hơi tiếc vì không sử dụng được Java nên bị loại

Phương pháp giới thiệu lần này có thể sẽ dễ hiểu hơn cách sử dụng câu lệnh HAVING. Nó xuất phát từ ý tưởng rất gần với kiểu thủ tục. Đầu tiên chúng ta sẽ nhìn từ câu trả lời

--Phép chia quan hệ bằng tập hợp giao [Phép chia có số dư]
SELECT DISTINCT emp
  FROM EmpSkills ES1
 WHERE NOT EXISTS
        [SELECT skill
           FROM Skills
         EXCEPT
         SELECT skill
           FROM EmpSkills ES2
          WHERE ES1.emp = ES2.emp];

Kết quả

Aida
Kanzaki

Điểm nhấn ở đây là truy vấn con tương quan và cho phép tính NGOẠI TRỪ. Truy vấn con tương đồng gắn quan hệ với bảng EmpSkills nhưng đây là để tiến hành cho phép trừ đối với từng nhân viên. Kỹ năng của từng nhân viên được loại trừ khỏi tập hợp những kỹ năng yêu cầu, nếu kết quả là rỗng thì có nghĩa là có tất cả những gì yêu cầu, còn nếu còn một dòng thì đó là thiếu kỹ năng đó

Ví dụ đối với anh Aida

Vì kết quả là tập hợp rỗng nên anh được chọn. Mặt khác ví dụ trường hợp của anh Hirai

Bên cạnh còn sót lại một dòng "Java" nên không có trong kết quả. Nói một cách khác is so with allow chia thì ta chuyển thành phép trừ đơn giản. Đây là một phương pháp rất sắc khi được sử dụng

Xem về phần logic thì mọi người có phát hiện ra điều gì không? . Để thử thì mọi người cứ nghĩ bảng này là file rồi cho từng dòng vào vòng lặp để xử lý. Với mỗi nhân viên thì chúng ta thực hiện phép trừ giữa những kỹ năng hiện có nếu hết kỹ năng đó rồi thì chúng ta chuyển sang nhân viên khác và thực hiện các vòng lặp tương tự

Truy vấn con tương quan cũng như hay được biết đến, nó được đưa vào sử dụng thay cho vòng lặp trong SQL. Ý nghĩa mà đã nói trước phần trên là phương pháp này có thể dễ dàng hiểu rằng chính là vì lý do này

4. Tìm các tập hợp các bộ phận giống nhau

Bài tập này từ khi được đưa ra ngày tháng năm 1993, thì nó đã trở thành một mảnh ghép rất nổi tiếng. Ở ví dụ ta sẽ sử dụng bảng hiển thị mối quan hệ giữa sản phẩm và người cung cấp sản phẩm

Hỗ trợ

Vấn đề cần tính toán ở đây là những cặp nhà cung cấp mà cung cấp những mặt hàng kể cả về lượng hay tên hàng cũng giống nhau. With ví dụ này thì chính là cặp A-C và B-D. A và E mặc dù số lượng cung cấp đều là 3 nhưng vì các loại mặt hàng khác nhau nên không phải là đối tượng của nhau, F thì cả về số lượng và mặt hàng không giống như bất cứ nhà cung cấp nào nên nằm ngoài đề bài

Nhìn qua thì đây có vẻ là một vấn đề dễ, nhưng tại sao ta gọi đây là câu đố thì chính là trong SQL thì không tồn tại những từ lệnh để kiểm tra tính bằng nhau hay quan hệ bao hàm. IN chỉ là để kiểm tra có bao gồm thành phần tố đó trong tập hợp không thôi, tức là ∈ chứ không phải điều tra bộ phận tập hợp ⊆. Mặt khác, trong hệ thống cơ sở dữ liệu mà IBM đã tạo thử nghiệm số 1 "System R" có một lệnh để điều tra về hệ thống bao của tập hợp. Tuy nhiên, cuối cùng vì lý do về hiệu năng nên nó bị xóa đi và bây giờ vẫn chưa thấy khôi phục lại

Vấn đề này với điểm tiến hành so sánh giữa các tập hợp với nhau nên khá giống với phép chia quan hệ được nêu ra ở câu trước. Tuy nhiên, đối với phép chia thì một bên đối tượng đã được cố định, còn lần này thì tập hợp hợp không cố định và để kiểm tra tất cả các bộ phận là sự kết hợp của các tập hợp với nhau nên đã trở thành một vấn đề cao

Đầu tiên, chúng ta thử kết hợp những nhà cung cấp với nhau. Cái này chúng ta có thể tạo ra bằng các liên kết bất đẳng thức. Với phép tính tập hợp ở đây, các dòng trùng lặp sẽ bị xóa một cách đơn giản

--Tạo sự kết hợp giữa những nhà cung cấp
SELECT SP1.sup AS s1, SP2.sup AS s2
  FROM SupParts SP1, SupParts SP2
 WHERE SP1.sup < SP2.sup
GROUP BY SP1.sup, SP2.sup;

Kết quả

________số 8

Tiếp theo, chúng ta sử dụng công thức sau đối với những cặp này, [A ⊆ B ] và [A ⊇ B] ⇒ [A = B] kết quả này cũng giống như chúng ta làm thỏa mãn 2 điều kiện sau

  • Điều kiện 1. Cả hai nhà cung cấp đều cung cấp những sản phẩm giống nhau
  • Điều kiện 2. Number of product product are same nhau

Điều kiện 1 thì chúng ta chỉ cần giao các bộ phận có trong tập hợp, còn điều kiện 2 thì chúng ta chỉ cần sử dụng COUNT là được

SELECT SP1.sup AS s1, SP2.sup AS s2
  FROM SupParts SP1, SupParts SP2
 WHERE SP1.sup < SP2.sup                 --Tạo sự kết hợp giữa các nhà cung cấp
   AND SP1.part = SP2.part               --Điều kiện 1. Các bộ phận có chủng loại giống nhau
GROUP BY SP1.sup, SP2.sup
HAVING COUNT[*] = [SELECT COUNT[*]       --Điều kiện 2. Số lượng bộ phận giống nhau.
                     FROM SupParts SP3
                    WHERE SP3.sup = SP1.sup]
   AND COUNT[*] = [SELECT COUNT[*]
                     FROM SupParts SP4
                    WHERE SP4.sup = SP2.sup];

Kết quả

row_cnt
---------
      3
0

Hai điều kiện của câu lệnh HAVING thì chúng ta cứ suy nghĩ như thế là được phép chia quan hệ thì sẽ dễ hiểu hơn. Theo như thế này thì thành phần của tập hợp A và B được đảm bảo không thừa không thiếu mà hệ thống nhất với nhau. Hơn nữa, điều kiện 1 đã đảm bảo chắc chắn những thành phần nào cũng có chủng loại giống nhau

Về câu đố này thì người ta đã có những cách giải quyết khác nhau, nhưng cách sử dụng phép chia như ở trên là một cách rất đặc trưng để sử dụng tập hợp đặc tính hướng đặc biệt của SQL. Tại SQL thì khi so sánh 2 tập hợp thì không phải chúng ta so sánh theo dòng đơn vị có trong tập hợp đó mà ít nhất thì chúng ta nên hiểu điểm mình sẽ so sánh cả tập hợp đó

Và cuối cùng thì chúng ta cùng nói một câu chuyện bên lề. Lúc trước tôi cũng đã nói CONTAINS là một câu lệnh yểu nhưng định mệnh nếu chúng ta có thể sử dụng được thì sẽ được viết với cấu trúc như câu lệnh dưới đây

row_cnt
---------
      3
1

Về ý nghĩa thì đó chính là tất cả những bộ phận mà nhà cung cấp B sử dụng thì cũng được nhà cung cấp A sử dụng. Đối với dữ liệu trên thì nó sẽ trả về kết quả 'A CONTAINS C'. Đây đúng là một thuật toán rất tiện lợi đúng không?

5. Truy vấn nhanh chóng xóa các dòng trùng lặp

Về phương pháp ứng dụng phép toán quan hệ thì chúng ta cũng biết rằng cuối cùng những dòng trùng lặp sẽ bị xóa đi. Đây là vấn đề đã được nêu ra trong chương trình "Cách sử dụng tự liên kết". Lần này một lần nữa chúng ta có sự xuất hiện đáng ngạc nhiên của một bảng không có khóa chính

Phương pháp được giới thiệu từ trước thì chúng ta chỉ đơn giản sử dụng truy vấn con tương quan

row_cnt
---------
      3
2

Phương pháp này không làm hỏng nhưng nó có một điểm không tốt đó chính là về hiệu suất. [DELETE is a time handler]. Tại đây thì chúng ta cùng suy nghĩ phương pháp thực hiện cùng một sử lý mà không sử dụng truy vấn con tương quan

Về cách suy nghĩ của truy vấn trên đó là lúc thu thập sau khi thu thập những kết hợp của tên và giá thì chúng ta tính toán dòng lớn nhất và xóa đi những dòng còn lại. Dòng là đối tượng xóa để yêu cầu trực tiếp thì khó nên chúng ta có cách suy nghĩ đầu tiên tìm ra những dòng còn lại trước đó lấy tất cả để trừ đi, hay còn gọi là tập hợp phụ. Trong phiên bản sử dụng truy vấn con tương quan thì chúng ta tiến hành xử lý đối với từng cặp kết hợp tên và giá. Lần này, chúng ta sẽ yêu cầu tất cả trong subquery những rowid là đối tượng xóa

Chúng ta coi như có những dòng rowid như dưới đây

Cũng giống như chúng ta lấy một dòng rowid muốn quay lại bằng hàm số cực trị. Điểm chính ở đây chính là chúng ta thực hiện cho phép trừ toàn bộ tập hợp đối với bảng Sản phẩm. Truy vấn đó sẽ được trả lời như dưới đây

row_cnt
---------
      3
3

Truy vấn con không tương thích sẽ trả về kết quả là số 2,3. Nếu tưởng tượng bằng hình ảnh thì ta có hình ảnh sau,

Nếu sử dụng EXCEPT thì chúng ta có thể thực hiện đơn giản được giải pháp sử dụng tập tin phụ đã nêu bên trên. Mặt khác chúng ta cũng có thể suy nghĩ đến phương pháp sử dụng NOT IN thay thế cho NGOẠI TRỪ, thì mã đó sẽ được viết như dưới đây

row_cnt
---------
      3
4

Phương pháp nào có hiệu năng tốt hơn thì tùy vào qui mô của bảng cũng như so sánh giữa dòng xóa và dòng để thì kết quả sẽ thay đổi. Tuy nhiên, với dòng code trên đây thì chúng ta có lợi thế rằng lệnh sẽ được chạy mà KHÔNG CÓ NGOẠI TRỪ

Tuy nhiên, đối với những chương trình có thể chạy được mã ID như thế này thì chỉ có Oracle và PostgreSQL. Trong trường hợp PostgreSQL, it has name is oid. Trường hợp đó thì mọi người đừng quên gắn tùy chọn VỚI OIDS khi TẠO BẢNG nhé

Kết luận

Chương trình này đã giới thiệu về cách sử dụng phép toán tập hợp. Cũng như đã nói ở phần đầu thì vì chuẩn bị về thuật này bị chậm nên không tính đến ứng dụng rất phong phú thì không biết đến nhiều lắm. Mọi người nhất định hãy suy nghĩ những SQL thú vị hơn nữa nhé

Dưới đây sẽ là những điểm chính trong chương trình này

  1. Trong SQL, thì sự chuẩn bị về tính năng cho phép tập hợp cấu trúc toán học. Trong trạng thái thực thi trong DB thì cũng có những điều ngoài ý muốn xảy ra nên khi sử dụng hãy chú ý kỹ năng
  2. Tập hợp tính toán nếu không thêm tùy chọn TẤT CẢ thì sẽ tiến hành xóa các dòng trùng lặp. Trong trường hợp đó thì trong nguồn cũng sẽ diễn ra nên về mặt diễn xuất sẽ không tốt
  3. UNION and INTERSECT mang một tính chất quan trọng đó là impodency, còn EXCEPT thì không vậy
  4. Phép chia không phải là một tập hợp thông tin tính toán được phép, được bình thường hóa nên khi muốn sử dụng thì chúng ta phải tự tạo
  5. Trong phương pháp điều tra sự giống nhau của tập hợp thì chúng ta có 2 con đường để sử dụng đó là sử dụng tính impodency và song ánh
  6. Nếu sử dụng EXCEPT thì có thể biểu thị tập tin phụ một cách dễ dàng

Tài liệu tham khảo

  1. 『プログラマのためのSQL 第2版』 Joe Celko 著、ピアソンエデュケーション、2001年4月

Go to wipe the repeat lines is 9. 1. 4, về phép chia quan hệ sử dụng phép tính tập hợp giao 19. 2. 6. Celko đang sử dụng IS NULL nhưng trong nhiều trường hợp thực hiện thì trong nhiều trường hợp truy vấn phụ sử dụng số phức thì nhiều khi sẽ trở thành lỗi. Trong SQL thông thường thì có thể lấy đối số là danh sách giá trị NULL nên không có gì sai cả nhưng nó là chức năng không được sử dụng rộng rãi

  1. 『SQLパズル 第2版』 Joe Celko 著、ミック 訳、翔泳社、2007年11月

Về truy vấn phát hiện các tập tin giống nhau thì tham khảo Chương 27 Phát hiện các bảng giống nhau. Chương này cũng viết nguồn của tập phim System R

  1. 『Các bài viết về cơ sở dữ liệu quan hệ 1991-1994』 C. J. Date 著、Addison-Wesley Pub、1995年

Về tính bất khả thi của UNION và INTERSECT thì sẽ có trong 「Expression Transformation [Part 1 of 2]」, về sự xuất hiện của câu đố về việc phát hiện các tập tin giống nhau thì chúng ta có thể tham khảo ở 「A Matter of Integrity [Part

Chủ Đề