W MariaDB INTERSECT
operator przecina dwa zapytania i zwraca tylko te wiersze, które są zwracane w obu zapytaniach.
Zwraca wszystkie wiersze od lewej SELECT
zestaw wyników, które są również obecne w prawym SELECT
zestaw wyników.
Składnia
Oficjalna składnia wygląda następująco:
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}]
Powyższe obejmuje również EXCEPT
i UNION
operatorów w składni, ponieważ ta sama składnia dotyczy tych operatorów.
Od wersji MariaDB 10.4.0 do określenia pierwszeństwa można użyć nawiasów.
Przykład
Załóżmy, że mamy następujące tabele:
SELECT * FROM Employees;
SELECT * FROM Customers;
Wynik:
+------------+--------------+ | 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 | +------------+--------------+
Możemy użyć INTERSECT
operator zwraca pracowników, którzy są również klientami:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Wynik:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Więc otrzymujemy tylko wartości, które pojawiają się w Employees
tabela, która pojawia się również w Customers
stół.
Domyślnie zwraca różne wiersze, więc dla Monish zwracany jest tylko jeden wiersz, mimo że istnieje wielu pracowników i wielu klientów o tej nazwie. Możemy to jednak zmienić.
Dołącz duplikaty
Domyślnie INTERSECT
operator domyślnie stosuje DISTINCT
operacja. Innymi słowy, domyślnie zwraca tylko różne wartości.
Przed wersją MariaDB 10.5.0 niejawny DISTINCT
była naszą jedyną opcją – nie mogliśmy określić ALL
. Jednak MariaDB 10.5.0 wprowadziła INTERSECT ALL
i INTERSECT DISTINCT
składnia.
Oznacza to, że możemy teraz wykonywać takie zapytania:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Wynik:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
Tym razem otrzymaliśmy cztery wiersze, zamiast trzech, które otrzymaliśmy w naszym pierwszym przykładzie.
Widzimy, że zostały zwrócone dwa wiersze zawierające nazwę Monish zamiast jednego, jak w naszym pierwszym przykładzie. W rzeczywistości jest trzech klientów o nazwie Monish, ale tylko dwóch pracowników o tej nazwie. Dlatego operacja przecina tylko dwa z nich.
A dla kompletności, oto przykład, który wyraźnie używa DISTINCT
operator:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Wynik:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Jest to ten sam wynik, który otrzymalibyśmy, gdybyśmy usunęli DISTINCT
operatora.
Alternatywne zapytanie
Możliwe jest uzyskanie tego samego wyniku bez użycia INTERSECT
operator. Na przykład moglibyśmy przepisać nasz pierwszy przykład do tego:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Wynik:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Pamiętaj, INTERSECT
operator pomaga uprościć kod.