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以降。