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
演算子はコードを単純化するのに役立ちます。