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ã.