Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Butuh bantuan dengan SQL yang benar

Tinjau urutan prioritas antara AND dan OR.

Dalam aritmatika, perkalian lebih diutamakan daripada penjumlahan.

Contoh:10+10*10 =110, tetapi (10+10)*10 =200.

Ini mirip dengan AND dan OR. AND memiliki prioritas lebih tinggi daripada OR, jadi ini tanpa tanda kurung:

WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1' 
  OR BookingInfo.ClinicID = '2'

bekerja seperti ini:

WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1') 
  OR BookingInfo.ClinicID = '2'

Tapi Anda ingin bekerja seperti ini:

WHERE BookingInfo.BookingDate = '05-18-2010' AND 
  (BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')

Jadi, masukkan tanda kurung untuk memastikan urutan prioritas berfungsi seperti yang Anda inginkan.

Saya juga baru menyadari bahwa Anda menggunakan tanggal dalam format MM-DD-YYYY, yang tidak dikenali oleh MySQL untuk literal tanggal. Anda harus menggunakan format YYYY-MM-DD. Itu bisa menyebabkan masalah yang berbeda.

SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18

Kembali komentar Anda:

Ya, saya yakin AND lebih diutamakan daripada OR. Untuk satu hal, hierarki prioritas semua operator di MySQL didokumentasikan di sini:http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html

Mari kita lihat contoh menggunakan masalah yang Anda nyatakan sebelumnya:

BookingDate   ClinicID 
2010-05-18    2
2008-05-18    2

WHERE BookingInfo.BookingDate = '2010-05-18' AND 
  BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'

Menggunakan ekspresi ini, hanya baris pertama yang cocok. Tetapi Anda menemukan bahwa kedua baris cocok, meskipun tanggal baris kedua tidak tepat. Mengapa? Mari kita ganti setiap perbandingan dengan TRUE atau FALSE:

TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE

Jika OR memiliki prioritas yang lebih tinggi, evaluasinya akan seperti ini:

TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)

Karena nilai apa pun yang digabungkan dengan OR TRUE menghasilkan TRUE, subekspresi di dalam tanda kurung ini akan berkurang menjadi:

TRUE AND (TRUE)
FALSE AND (TRUE)

Dan baris kedua tidak cocok, karena FALSE AND TRUE menghasilkan FALSE. Tapi itu tidak mungkin, karena Anda menemukan baris kedua salah cocok.

Faktanya, AND memiliki prioritas lebih tinggi daripada OR, jadi ini benar-benar mengevaluasi seolah-olah Anda memiliki tanda kurung di sekitar subekspresi AND:

(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE

Yang dikurangi menjadi:

(FALSE) OR TRUE
(FALSE) OR TRUE

Dalam kedua kasus, FALSE OR TRUE menghasilkan TRUE, dan kedua baris cocok.

Jadi tanpa tanda kurung, semantik defaultnya adalah AND memiliki prioritas lebih tinggi daripada OR. Anda memerlukan tanda kurung:

WHERE BookingInfo.BookingDate = '2010-05-18' AND 
  (BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan bidang dengan nama dalam kueri Python?

  2. Dapatkan data dari dua tabel untuk membuat kalender acara

  3. Dapatkan Karyawan Yang Di Bawah Gaji Rata-Rata Setelah Kenaikan

  4. docker.io - Docker yang menghubungkan antara wadah aplikasi &basis data

  5. mysql NOT IN QUERY mengoptimalkan