MariaDBでは、EXCEPT
演算子は、右側の入力クエリでは出力されない行を左側の入力クエリから返します。
別の言い方をすれば、左からすべての行を返す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}]
上記には、INTERSECT
も含まれます およびUNION
同じ構文がそれらの演算子に適用されるため、構文内の演算子。
MariaDB 10.4.0以降、括弧を使用して優先順位を指定できます。
次のテーブルがあるとします。
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 | +-----------+-------------+
EXCEPT
を使用できます 生徒ではない教師を返すためのオペレーター:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
結果:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
したがって、Teachers
に表示される値のみを取得します Students
にも表示されないテーブル テーブル。
デフォルトでは、個別の行が返されるため、Cathy
に対して返される行は1つだけです。 、その名前の先生が2人いるのに。この動作は変更できます。これについては後で詳しく説明します。
切り替えてStudents
を配置することもできます 左側の表とTeachers
右側にあります。
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
結果:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
EXCEPT
を使用しなくても同じ結果を得ることができます オペレーター。たとえば、最初の例を次のように書き直すことができます。
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
結果:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
気をつけてください、EXCEPT
演算子は、コードを大幅に簡素化するのに役立ちます。
デフォルトでは、EXCEPT
演算子は暗黙的にDISTINCT
を適用します 手術。つまり、デフォルトでは個別の値のみを返します。
MariaDB 10.5.0より前は、暗黙のDISTINCT
唯一の選択肢でした– ALL
を指定できませんでした 。ただし、MariaDB10.5.0ではEXCEPT ALL
が導入されました およびEXCEPT DISTINCT
構文。
これは、次のようなクエリを実行できることを意味します:
SELECT TeacherName FROM Teachers
EXCEPT 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
EXCEPT DISTINCT
SELECT StudentName FROM Students;
結果:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
予想どおり、DISTINCT
を削除した場合と同じ結果が得られます。 オペレーター。
MariaDB 10.6.1では、MINUS
EXCEPT
の同義語として導入されました 。したがって、MINUS
を使用できます EXCEPT
の代わりに MariaDB10.6.1以降。