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 EXCEPT và UNION 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 ALL và INTERSECT 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ã.