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

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

Trong MariaDB, INTERSECT toán tử giao nhau giữa hai truy vấn và chỉ trả về những hàng được trả về trong cả hai truy vấn.

Nó trả về tất cả các hàng từ SELECT bên trái tập hợp kết quả cũng có trong SELECT bên phải tập hợp kết quả.

Cú pháp

Cú pháp chính thức như sau:

SELECT ...
(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...
[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...]
[ORDER BY [column [, column ...]]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]

Ở trên cũng bao gồm EXCEPTUNION các toán tử trong cú pháp, vì cú pháp tương tự áp dụng cho các toán tử đó.

Từ MariaDB 10.4.0, dấu ngoặc đơn có thể được sử dụng để chỉ định mức độ ưu tiên.

Ví dụ

Giả sử chúng ta có các bảng sau:

SELECT * FROM Employees;
SELECT * FROM Customers;

Kết quả:

+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
|          1 | Bart         |
|          2 | Jan          |
|          3 | Ava          |
|          4 | Rohit        |
|          5 | Monish       |
|          6 | Monish       |
|          7 | Monish       |
+------------+--------------+

+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
|          1 | Mia          |
|          2 | Rohit        |
|          3 | Peter        |
|          4 | Ava          |
|          5 | Monish       |
|          6 | Monish       |
+------------+--------------+

Chúng ta có thể sử dụng INTERSECT nhà điều hành để trả lại nhân viên cũng là khách hàng:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Kết quả:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Vì vậy, chúng tôi chỉ nhận được các giá trị xuất hiện trong Employees bảng cũng xuất hiện trong Customers bàn.

Theo mặc định, nó trả về các hàng riêng biệt, vì vậy chỉ có một hàng được trả về cho Monish, mặc dù có nhiều nhân viên và nhiều khách hàng có tên đó. Chúng tôi có thể thay đổi điều này mặc dù.

Bao gồm các bản sao

Theo mặc định, INTERSECT 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.

Trước MariaDB 10.5.0, DISTINCT ngầm là lựa chọn duy nhất của chúng tôi - chúng tôi không thể chỉ định ALL . Tuy nhiên, MariaDB 10.5.0 đã giới thiệu INTERSECT ALLINTERSECT DISTINCT cú pháp.

Điều này có nghĩa là bây giờ chúng ta có thể thực hiện các truy vấn như sau:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Kết quả:

+--------------+
| EmployeeName |
+--------------+
| Monish       |
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Lần này chúng ta có bốn hàng, thay vì ba hàng như trong ví dụ đầu tiên.

Chúng ta có thể thấy rằng hai hàng chứa tên Monish đã được trả về thay vì chỉ một hàng như trong ví dụ đầu tiên của chúng tôi. Thực tế có ba khách hàng được gọi là Monish, nhưng chỉ có hai nhân viên có tên đó. Do đó, hoạt động chỉ giao nhau giữa hai trong số chúng.

Và để đầy đủ, đây là một ví dụ sử dụng rõ ràng DISTINCT nhà điều hành:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Kết quả:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Đây là kết quả tương tự mà chúng tôi sẽ nhận được nếu xóa DISTINCT nhà điều hành.

Một Truy vấn Thay thế

Có thể nhận được kết quả tương tự mà không cần sử dụng INTERSECT 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 EmployeeName
FROM Employees e 
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Kết quả:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Phiền bạn, INTERSECT toán tử giúp đơn giản hóa mã.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm SUM () trong MariaDB

  2. MariaDB 10.6 và NextCloud:Hàng COMPRESSED được mặc định chỉ đọc

  3. Cách LOWER () hoạt động trong MariaDB

  4. Sử dụng Plugin nhật ký kiểm tra Percona để bảo mật cơ sở dữ liệu

  5. MariaDB DAY () Giải thích