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