MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Operator MariaDB MINUS Dijelaskan

Di MariaDB, MINUS operator mengembalikan baris berbeda dari kueri input kiri yang tidak dikeluarkan oleh kueri input kanan.

MINUS operator diperkenalkan di MariaDB 10.6.1 sebagai sinonim untuk EXCEPT operator untuk tujuan kompatibilitas dengan Oracle. Oleh karena itu, kita dapat menggunakan MINUS dan EXCEPT bergantian (dalam MariaDB 10.6.1 dan yang lebih baru).

Namun, saya menemukan bahwa MINUS operator hanya berfungsi ketika sql_mode = "oracle" saya . Meskipun ini tidak disebutkan secara eksplisit dalam dokumentasi MariaDB, ini tersirat dalam tugas untuk mengimplementasikan MINUS operator di MariaDB.

Contoh Data

Misalkan kita memiliki tabel berikut:

SELECT * FROM Teachers;
SELECT * FROM Students;

Hasil:

+-----------+-------------+
| 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        |
+-----------+-------------+

Kita bisa menggunakan MINUS operator untuk mengembalikan guru yang bukan juga siswa.

Setel sql_mode ke oracle

Sebelum kita mulai menggunakan MINUS operator, mari kita atur sql_mode our ke oracle :

SET sql_mode = "oracle";

Oke, sekarang kita bisa melanjutkan dan menggunakan MINUS operator.

Contoh MINUS

SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;

Hasil:

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

Jadi kita hanya mendapatkan nilai yang muncul di Teachers tabel yang juga tidak muncul di Students meja.

Secara default, ini mengembalikan baris yang berbeda, jadi hanya satu baris yang dikembalikan untuk Cathy , meskipun ada dua guru dengan nama itu. Kita dapat mengubah perilaku ini – lebih lanjut tentang ini nanti.

Kami juga dapat mengubahnya dan menempatkan Students tabel di sebelah kiri dan Teachers di sebelah kanan.

SELECT StudentName FROM Students
MINUS
SELECT TeacherName FROM Teachers;

Hasil:

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

Anda bisa mendapatkan hasil yang sama tanpa menggunakan MINUS (atau EXCEPT ) operator. Misalnya, kita dapat menulis ulang contoh pertama kita menjadi ini:

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

Hasil:

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

Sertakan Duplikat

Secara default, MINUS operator secara implisit menerapkan DISTINCT operasi. Dengan kata lain, ini hanya mengembalikan nilai yang berbeda secara default. Tapi kita bisa menentukan MINUS ALL untuk menyertakan duplikat dalam hasil:

SELECT TeacherName FROM Teachers
MINUS ALL
SELECT StudentName FROM Students;

Hasil:

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

Kali ini kami mendapat empat baris, bukan dua baris yang kami dapatkan di contoh pertama kami.

Kita dapat melihat bahwa kedua Cathys dikembalikan, bukan hanya satu seperti pada contoh pertama kita.

Adapun Bill? Ada dua RUU di Teachers tabel, tetapi hanya satu yang dikembalikan ke sini. Itu mungkin karena ada satu RUU di Students tabel, yang akan mengecualikan salah satu Tagihan dari hasil kami.

Dan berikut adalah contoh yang secara eksplisit menggunakan DISTINCT operator:

SELECT TeacherName FROM Teachers
MINUS DISTINCT
SELECT StudentName FROM Students;

Hasil:

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

Seperti yang diharapkan, kami mendapatkan hasil yang sama seperti yang kami dapatkan jika kami menghapus DISTINCT operator.

Tidak dalam Mode Oracle?

Inilah yang terjadi ketika kami mencoba menggunakan MINUS saat tidak dalam mode Oracle.

Mari kita reset sql_mode kita ke pengaturan default:

SET sql_mode = default;

Sekarang mari kita coba menggunakan MINUS operator lagi:

SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;

Hasil:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memigrasikan Azure Database untuk MySQL/MariaDB ke Server Lokal

  2. MariaDB POWER() Dijelaskan

  3. Cara Mencadangkan Basis Data MariaDB Moodle Anda

  4. 3 Cara Mengembalikan Modulo di MariaDB

  5. Cara Mengatur Replikasi Asinkron Antara Cluster MySQL Galera