sql >> データベース >  >> RDS >> MariaDB

MariaDBINTERSECTオペレーターの説明

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


    1. SQLServerのエスケープ文字

    2. intからのキャスト/変換がアスタリスクを返す理由

    3. SQLServerデータベースの破損の原因と解決策を調べる

    4. MariaDBでのUTC_TIME()のしくみ