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

MariaDB KECUALI Operator Dijelaskan

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

Cara lain untuk meletakkannya adalah dengan mengembalikan semua baris dari SELECT left kiri kumpulan hasil kecuali baris yang berada di kanan SELECT kumpulan hasil.

Sintaks

Sintaks resminya seperti ini:

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}]

Di atas juga termasuk INTERSECT dan UNION operator dalam sintaks, karena sintaks yang sama berlaku untuk operator tersebut.

Dari MariaDB 10.4.0, tanda kurung dapat digunakan untuk menentukan prioritas.

Contoh

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 dapat menggunakan EXCEPT operator untuk mengembalikan guru yang bukan juga siswa:

SELECT TeacherName FROM Teachers
EXCEPT
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
EXCEPT
SELECT TeacherName FROM Teachers;

Hasil:

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

Anda bisa mendapatkan hasil yang sama tanpa menggunakan 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       |
+-------------+

Ingat, EXCEPT operator membantu menyederhanakan kode dengan cukup signifikan.

Sertakan Duplikat

Secara default, EXCEPT operator secara implisit menerapkan DISTINCT operasi. Dengan kata lain, ini hanya mengembalikan nilai yang berbeda secara default.

Sebelum MariaDB 10.5.0, implisit DISTINCT adalah satu-satunya pilihan kami – kami tidak dapat menentukan ALL . Namun, MariaDB 10.5.0 memperkenalkan EXCEPT ALL dan EXCEPT DISTINCT sintaksis.

Artinya, sekarang kita dapat melakukan kueri seperti ini:

SELECT TeacherName FROM Teachers
EXCEPT 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
EXCEPT 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.

Di MariaDB 10.6.1, MINUS diperkenalkan sebagai sinonim untuk EXCEPT . Oleh karena itu, kita dapat menggunakan MINUS bukannya EXCEPT di MariaDB 10.6.1 dan yang lebih baru.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 Cara Menghapus Baris Duplikat di MariaDB (Mengabaikan Kunci Utama)

  2. Memperkenalkan MariaDB Platform X5:database beban kerja apa pun, sekarang dalam skala apa pun

  3. Cara Mengatur Replikasi MariaDB (Master-Slave) di CentOS/RHEL 7 dan Debian 8/9

  4. Mengamankan Cadangan MySQL:Panduan

  5. Cara Otomatis Mengelola Failover Database MySQL untuk Moodle