Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cần trợ giúp về SQL chính xác

Xem lại thứ tự ưu tiên giữa AND và OR.

Trong số học, phép nhân có ưu tiên cao hơn phép cộng.

Ví dụ:10 + 10 * 10 =110, nhưng (10 + 10) * 10 =200.

Nó tương tự với AND và OR. AND có mức độ ưu tiên cao hơn OR, vì vậy điều này không có dấu ngoặc đơn:

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

hoạt động như thế này:

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

Nhưng bạn muốn nó hoạt động như thế này:

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

Vì vậy, hãy đặt trong dấu ngoặc đơn để đảm bảo thứ tự ưu tiên hoạt động theo cách bạn muốn.

Tôi cũng vừa nhận thấy rằng bạn đang sử dụng ngày ở định dạng MM-DD-YYYY, định dạng này không được MySQL nhận dạng cho các ký tự ngày. Bạn phải sử dụng định dạng YYYY-MM-DD. Điều đó có thể gây ra một vấn đề khác.

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

Nhận xét lại của bạn:

Có, tôi chắc chắn VÀ có mức độ ưu tiên cao hơn HOẶC. Thứ nhất, thứ bậc ưu tiên của tất cả các toán tử trong MySQL được ghi lại ở đây: http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html

Hãy xem qua một ví dụ bằng cách sử dụng vấn đề đã nêu ban đầu của bạn:

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

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

Sử dụng biểu thức này, chỉ hàng đầu tiên phải khớp. Nhưng bạn thấy rằng cả hai hàng đều khớp, mặc dù ngày của hàng thứ hai không đúng. Tại sao? Hãy thay thế mỗi so sánh bằng TRUE hoặc FALSE:

TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE

Nếu HOẶC có mức độ ưu tiên cao hơn, nó sẽ đánh giá như thế này:

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

Vì bất kỳ giá trị nào được kết hợp với OR TRUE đều cho ra kết quả là TRUE, biểu thức con bên trong các dấu ngoặc đơn này sẽ giảm thành:

TRUE AND (TRUE)
FALSE AND (TRUE)

Và hàng thứ hai sẽ không khớp, bởi vì FALSE VÀ TRUE tạo ra FALSE. Nhưng điều đó không thể xảy ra, vì bạn thấy hàng thứ hai khớp không chính xác.

Trên thực tế, AND có mức độ ưu tiên cao hơn OR, vì vậy nó thực sự đánh giá như thể bạn có dấu ngoặc đơn xung quanh biểu thức con AND:

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

Điều này giảm xuống:

(FALSE) OR TRUE
(FALSE) OR TRUE

Trong cả hai trường hợp, FALSE OR TRUE cho ra TRUE và cả hai hàng đều khớp.

Vì vậy, không có dấu ngoặc đơn, ngữ nghĩa mặc định là AND có mức độ ưu tiên cao hơn OR. Bạn cần dấu ngoặc đơn:

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. Chọn tần suất của một kết quả có thể xuất hiện trong nhiều cột (SQL)

  2. Nguồn MySQL do người dùng xác định của Google Cloud Dataflow

  3. PDOException::( PDO ::__ construct ():Máy chủ không mong đợi hồi sinh khi thực hiện caching_sha2 auth:109) với MySQL 8 / PHP 7.2 / Laravel

  4. Một phương thức khởi tạo lớp con sẽ tương tác với một phương thức khởi tạo lớp cha trong php như thế nào?

  5. Công cụ cơ sở dữ liệu MySQL nào tốt hơn để lưu trữ các phiên và dữ liệu phiên:MyISAM hay InnoDB?