MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Giải thích về toán tử MariaDB MINUS

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 MINUSEXCEPT 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. So sánh Giải pháp Oracle RAC HA với Galera Cluster cho MySQL hoặc MariaDB

  2. 4 Chức năng để Nhận Giờ từ Giá trị Thời gian trong MariaDB

  3. Hiển thị đối chiếu trong MariaDB

  4. Chuẩn bị máy chủ MySQL hoặc MariaDB để sản xuất - Phần thứ nhất

  5. DBaaS, định tuyến truy vấn đám mây và trong suốt