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

Sự khác biệt giữa Is Not Null và Not Is Null

Không có sự khác biệt.

Tất cả các công cụ chính (đó là MySQL , SQL Server , OraclePostgreSQL ) sẽ hợp nhất các vị từ này trong giai đoạn phân tích cú pháp, tạo các kế hoạch giống hệt nhau từ chúng.

Việc xử lý các điều kiện này phức tạp hơn nếu chỉ áp dụng các toán tử theo thứ tự này hoặc thứ tự khác.

Ví dụ:trong Oracle , IS NOT NULL (hoặc NOT IS NULL ) điều kiện ngụ ý khả năng sử dụng một chỉ mục, vì vậy hãy truy vấn như sau:

SELECT  column
FROM    mytable
WHERE   column IS NOT NULL

hầu hết có thể sẽ được thực thi với quá trình quét nhanh toàn bộ index fast full scan , không có kiểm tra bổ sung nào được thực hiện trong thời gian chạy (kể từ NULL các giá trị sẽ không được đưa vào chỉ mục, vì vậy việc kiểm tra chúng sẽ không có ích lợi gì).

Ngay cả khi mỗi bản ghi cần được kiểm tra, thứ tự kiểm tra sẽ được xác định bởi trình tối ưu hóa (chứ không phải theo thứ tự các vị từ và toán tử xuất hiện trong WHERE mệnh đề).

Ví dụ, đây là một kế hoạch cho một Oracle truy vấn:

SQL> EXPLAIN PLAN FOR
  2  
  2  SELECT *
  3  FROM   t_test
  4  WHERE  NOT column IS NULL
  5  /

Explained

SQL> SELECT  *
  2  FROM    TABLE(DBMS_XPLAN.display())
  3  /

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 958699830
----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |    30 |  1260 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T_TEST |    30 |  1260 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("COLUMN" IS NOT NULL)

Như bạn có thể thấy, filter đã được dịch nội bộ thành IS NOT NULL (mà Oracle cùng với hầu hết những người bình luận dường như tin rằng đó là một hình thức thích hợp hơn)

Cập nhật:

Như Jonathan Leffler đã chỉ ra, đây là sự khác biệt khi đánh giá các bộ giá trị (trái ngược với các cột đơn).

Một bộ bao gồm NULL hỗn hợp và không phải NULL các giá trị không phải là NULL cũng không phải là NOT NULL .

Trong PostgreSQL (hỗ trợ vị từ này chống lại các bộ giá trị), cả hai biểu thức sau:

SELECT  (1, NULL) IS NULL
SELECT  (1, NULL) IS NOT NULL

đánh giá thành sai.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tạo LEFT JOIN với truy vấn con SELECT bằng QueryBuilder trong Doctrine 2?

  2. Tạo khung dữ liệu Spark từ truy vấn SQL

  3. Không thể sửa đổi thông tin tiêu đề

  4. Mô phỏng SEQUENCE an toàn cho giao dịch trong MySQL

  5. CHÈN và CẬP NHẬT trong một truy vấn MYSQL