Di MariaDB, INTERSECT
operator memotong dua kueri dan hanya mengembalikan baris yang dikembalikan di kedua kueri.
Ini mengembalikan semua baris dari kiri SELECT
kumpulan hasil yang juga ada di kanan SELECT
kumpulan hasil.
Sintaks
Sintaks resminya seperti ini:
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}]
Di atas juga termasuk EXCEPT
dan UNION
operator dalam sintaks, karena sintaks yang sama berlaku untuk operator tersebut.
Dari MariaDB 10.4.0, tanda kurung dapat digunakan untuk menentukan prioritas.
Contoh
Misalkan kita memiliki tabel berikut:
SELECT * FROM Employees;
SELECT * FROM Customers;
Hasil:
+------------+--------------+ | 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 | +------------+--------------+
Kita dapat menggunakan INTERSECT
operator untuk mengembalikan karyawan yang juga pelanggan:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Hasil:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Jadi kami hanya mendapatkan nilai yang muncul di Employees
tabel yang juga muncul di Customers
meja.
Secara default, ini mengembalikan baris yang berbeda, jadi hanya satu baris yang dikembalikan untuk Monish, meskipun ada beberapa karyawan dan beberapa pelanggan dengan nama itu. Kita bisa mengubah ini sekalipun.
Sertakan Duplikat
Secara default, INTERSECT
operator secara implisit menerapkan DISTINCT
operasi. Dengan kata lain, ini hanya mengembalikan nilai yang berbeda secara default.
Sebelum MariaDB 10.5.0, implisit DISTINCT
adalah satu-satunya pilihan kami – kami tidak dapat menentukan ALL
. Namun, MariaDB 10.5.0 memperkenalkan INTERSECT ALL
dan INTERSECT DISTINCT
sintaksis.
Artinya, sekarang kita dapat melakukan kueri seperti ini:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Hasil:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
Kali ini kami mendapat empat baris, bukan tiga baris yang kami dapatkan di contoh pertama kami.
Kita dapat melihat bahwa dua baris yang berisi nama Monish dikembalikan, bukan hanya satu seperti pada contoh pertama kita. Sebenarnya ada tiga pelanggan bernama Monish, tetapi hanya dua karyawan dengan nama itu. Oleh karena itu, operasi hanya memotong dua dari mereka.
Dan demi kelengkapan, berikut adalah contoh yang secara eksplisit menggunakan DISTINCT
operator:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Hasil:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Ini adalah hasil yang sama yang akan kita dapatkan jika kita menghapus DISTINCT
operator.
Kueri Alternatif
Anda bisa mendapatkan hasil yang sama tanpa menggunakan INTERSECT
operator. Misalnya, kita dapat menulis ulang contoh pertama kita menjadi ini:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Hasil:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Ingat, INTERSECT
operator membantu menyederhanakan kode.