Trong MariaDB, MINUS
toán tử trả về các hàng khác biệt với truy vấn đầu vào bên trái mà không được xuất ra bởi truy vấn đầu vào bên phải.
MINUS
toán tử đã được giới thiệu trong MariaDB 10.6.1 như một từ đồng nghĩa với EXCEPT
cho các mục đích tương thích với Oracle. Do đó, chúng ta có thể sử dụng MINUS
và EXCEPT
thay thế cho nhau (trong MariaDB 10.6.1 trở lên).
Tuy nhiên, tôi nhận thấy rằng MINUS
toán tử chỉ hoạt động khi sql_mode = "oracle"
của tôi . Mặc dù điều này không được đề cập rõ ràng trong tài liệu của MariaDB, nhưng nó được ngụ ý trong nhiệm vụ triển khai MINUS
toán tử trong MariaDB.
Dữ liệu Mẫu
Giả sử chúng ta có các bảng sau:
SELECT * FROM Teachers;
SELECT * FROM Students;
Kết quả:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 1 | Warren | | 2 | Ben | | 3 | Cathy | | 4 | Cathy | | 5 | Bill | | 6 | Bill | +-----------+-------------+ +-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Faye | | 2 | Jet | | 3 | Spike | | 4 | Ein | | 5 | Warren | | 6 | Bill | +-----------+-------------+
Chúng ta có thể sử dụng MINUS
toán tử để trả lại giáo viên không phải là sinh viên.
Đặt sql_mode
tới Oracle
Trước khi chúng tôi bắt đầu sử dụng MINUS
toán tử, hãy đặt sql_mode
của chúng tôi tới oracle
:
SET sql_mode = "oracle";
OK, bây giờ chúng ta có thể tiếp tục và sử dụng MINUS
nhà điều hành.
Ví dụ về MINUS
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Kết quả:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Vì vậy, chúng tôi chỉ nhận được các giá trị xuất hiện trong Teachers
bảng cũng không xuất hiện trong Students
bàn.
Theo mặc định, nó trả về các hàng riêng biệt, vì vậy chỉ một hàng được trả về cho Cathy
, mặc dù có hai giáo viên có tên đó. Chúng tôi có thể thay đổi hành vi này - nhiều hơn về điều này sau.
Chúng tôi cũng có thể chuyển đổi nó và đặt Students
bảng bên trái và Teachers
ở bên phải.
SELECT StudentName FROM Students
MINUS
SELECT TeacherName FROM Teachers;
Kết quả:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
Có thể nhận được kết quả tương tự mà không cần sử dụng MINUS
(hoặc EXCEPT
) nhà điều hành. Ví dụ:chúng tôi có thể viết lại ví dụ đầu tiên của chúng tôi thành ví dụ này:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Kết quả:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Bao gồm các bản sao
Theo mặc định, MINUS
toán tử áp dụng ngầm một DISTINCT
hoạt động. Nói cách khác, nó chỉ trả về các giá trị riêng biệt theo mặc định. Nhưng chúng ta có thể chỉ định MINUS ALL
để bao gồm các bản sao trong kết quả:
SELECT TeacherName FROM Teachers
MINUS ALL
SELECT StudentName FROM Students;
Kết quả:
+-------------+ | TeacherName | +-------------+ | Cathy | | Ben | | Cathy | | Bill | +-------------+
Lần này chúng ta có bốn hàng, thay vì hai hàng như trong ví dụ đầu tiên.
Chúng ta có thể thấy rằng cả hai Cathys đã được trả lại thay vì chỉ một như trong ví dụ đầu tiên của chúng tôi.
Đối với Bill? Có hai Hóa đơn trong Teachers
bảng, nhưng chỉ có một được trả lại ở đây. Đó có thể là do có một Hóa đơn trong Students
bảng này sẽ loại trừ một trong các Hóa đơn khỏi kết quả của chúng tôi.
Và đây là một ví dụ sử dụng rõ ràng DISTINCT
nhà điều hành:
SELECT TeacherName FROM Teachers
MINUS DISTINCT
SELECT StudentName FROM Students;
Kết quả:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Như mong đợi, chúng tôi nhận được kết quả giống như chúng tôi sẽ nhận được nếu chúng tôi xóa DISTINCT
nhà điều hành.
Không ở Chế độ Oracle?
Đây là những gì sẽ xảy ra khi chúng tôi cố gắng sử dụng MINUS
khi không ở chế độ Oracle.
Hãy đặt lại sql_mode
của chúng tôi sang cài đặt mặc định:
SET sql_mode = default;
Bây giờ chúng ta hãy thử sử dụng MINUS
toán tử một lần nữa:
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Kết quả:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT StudentName FROM Students' at line 3