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

MariaDBマイナスオペレーターの説明

    MariaDBでは、MINUS 演算子は、右側の入力クエリでは出力されない、左側の入力クエリからの個別の行を返します。

    MINUS 演算子は、EXCEPTの同義語としてMariaDB10.6.1で導入されました Oracleとの互換性を目的とした演算子。したがって、MINUSを使用できます およびEXCEPT 互換性があります(MariaDB 10.6.1以降)。

    ただし、MINUS 演算子は、sql_mode = "oracle"の場合にのみ機能します 。これはMariaDBのドキュメントでは明示的に言及されていませんが、MINUSを実装するためのタスクで暗示されています MariaDBの演算子。

    サンプルデータ

    次のテーブルがあるとします。

    SELECT * FROM Teachers;
    SELECT * FROM Students;

    結果:

    +-----------+-------------+
    | TeacherId | TeacherName |
    +-----------+-------------+
    |         1 | Warren      |
    |         2 | Ben         |
    |         3 | Cathy       |
    |         4 | Cathy       |
    |         5 | Bill        |
    |         6 | Bill        |
    +-----------+-------------+
    
    +-----------+-------------+
    | StudentId | StudentName |
    +-----------+-------------+
    |         1 | Faye        |
    |         2 | Jet         |
    |         3 | Spike       |
    |         4 | Ein         |
    |         5 | Warren      |
    |         6 | Bill        |
    +-----------+-------------+

    MINUSを使用できます 生徒ではない教師を返すためのオペレーター。

    sql_modeを設定します Oracle

    MINUSの使用を開始する前に 演算子、sql_modeを設定しましょう oracleへ :

    SET sql_mode = "oracle";

    OK、これでMINUSを使用できます オペレーター。

    MINUSの例

    SELECT TeacherName FROM Teachers
    MINUS
    SELECT StudentName FROM Students;

    結果:

    +-------------+
    | TeacherName |
    +-------------+
    | Ben         |
    | Cathy       |
    +-------------+

    したがって、Teachersに表示される値のみを取得します Studentsにも表示されないテーブル テーブル。

    デフォルトでは、個別の行が返されるため、Cathyに対して返される行は1つだけです。 、その名前の先生が2人いるのに。この動作は変更できます。これについては後で詳しく説明します。

    切り替えてStudentsを配置することもできます 左側の表とTeachers 右側にあります。

    SELECT StudentName FROM Students
    MINUS
    SELECT TeacherName FROM Teachers;

    結果:

    +-------------+
    | StudentName |
    +-------------+
    | Faye        |
    | Jet         |
    | Spike       |
    | Ein         |
    +-------------+

    MINUSを使用しなくても同じ結果を得ることができます (またはEXCEPT )演算子。たとえば、最初の例を次のように書き直すことができます。

    SELECT 
        DISTINCT TeacherName
    FROM Teachers t 
    WHERE NOT EXISTS (SELECT StudentName FROM Students s
    WHERE t.TeacherName = s.StudentName);

    結果:

    +-------------+
    | TeacherName |
    +-------------+
    | Ben         |
    | Cathy       |
    +-------------+
    重複を含める

    デフォルトでは、MINUS 演算子は暗黙的にDISTINCTを適用します 手術。つまり、デフォルトでは個別の値のみを返します。ただし、MINUS ALLを指定することはできます 結果に重複を含めるには:

    SELECT TeacherName FROM Teachers
    MINUS ALL
    SELECT StudentName FROM Students;

    結果:

    +-------------+
    | TeacherName |
    +-------------+
    | Cathy       |
    | Ben         |
    | Cathy       |
    | Bill        |
    +-------------+

    今回は、最初の例で取得した2行ではなく、4行を取得しました。

    最初の例のように1つだけではなく、両方のCathyが返されたことがわかります。

    ビルは? Teachersには2つの請求書があります テーブルですが、ここでは1つだけが返されます。これはおそらく、Studentsに1つの請求書があるためです。 表。これにより、請求書の1つが結果から除外されます。

    そして、これがDISTINCTを明示的に使用する例です。 演算子:

    SELECT TeacherName FROM Teachers
    MINUS DISTINCT
    SELECT StudentName FROM Students;

    結果:

    +-------------+
    | TeacherName |
    +-------------+
    | Ben         |
    | Cathy       |
    +-------------+

    予想どおり、DISTINCTを削除した場合と同じ結果が得られます。 オペレーター。

    Oracleモードではありませんか?

    MINUSを使おうとすると次のようになります Oracleモードでない場合。

    sql_modeをリセットしましょう デフォルト設定に:

    SET sql_mode = default;

    それでは、MINUSを使ってみましょう 再びオペレーター:

    SELECT TeacherName FROM Teachers
    MINUS
    SELECT StudentName FROM Students;

    結果:

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT StudentName FROM Students' at line 3

    1. Postgres:コンポジットキーを実行する方法は?

    2. mybatisによって実行されたoracleプロシージャからパラメータを受信できません

    3. カンマ区切り値を含む列の値

    4. SQL SELECT SUM