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