MariaDBでは、INTERSECT 演算子は2つのクエリを交差させ、両方のクエリで返される行のみを返します。
左からすべての行を返しますSELECT 右側のSELECTにも存在する結果セット 結果セット。
公式の構文は次のようになります:
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}]
上記には、EXCEPTも含まれます およびUNION 同じ構文がそれらの演算子に適用されるため、構文内の演算子。
MariaDB 10.4.0以降、括弧を使用して優先順位を指定できます。
次のテーブルがあるとします。
SELECT * FROM Employees;
SELECT * FROM Customers; 結果:
+------------+--------------+ | 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 | +------------+--------------+
INTERSECTを使用できます 顧客でもある従業員を返すオペレーター:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers; 結果:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
したがって、Employeesに表示される値のみを取得します Customersにも表示されるテーブル テーブル。
デフォルトでは、個別の行が返されるため、その名前の従業員と顧客が複数いる場合でも、Monishには1つの行のみが返されます。ただし、これは変更できます。
デフォルトでは、INTERSECT 演算子は暗黙的にDISTINCTを適用します 手術。つまり、デフォルトでは個別の値のみを返します。
MariaDB 10.5.0より前は、暗黙のDISTINCT 唯一の選択肢でした– ALLを指定できませんでした 。ただし、MariaDB10.5.0ではINTERSECT ALLが導入されました およびINTERSECT DISTINCT 構文。
これは、次のようなクエリを実行できることを意味します:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers; 結果:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
今回は、最初の例で取得した3行ではなく、4行を取得しました。
最初の例のように1つだけではなく、Monishという名前を含む2つの行が返されたことがわかります。実際にはMonishという顧客は3人いますが、その名前の従業員は2人だけです。したがって、操作はそれらのうちの2つとのみ交差します。
また、完全を期すために、DISTINCTを明示的に使用する例を次に示します。 演算子:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers; 結果:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
これは、DISTINCTを削除した場合に得られる結果と同じです。 オペレーター。
INTERSECTを使用しなくても同じ結果を得ることができます オペレーター。たとえば、最初の例を次のように書き直すことができます。
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName); 結果:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
気をつけてください、INTERSECT 演算子はコードを単純化するのに役立ちます。