Không có sự khác biệt.
Tất cả các công cụ chính (đó là MySQL
, SQL Server
, Oracle
và PostgreSQL
) 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.