Trong SQL, NOT
toán tử phủ định đầu vào Boolean (nó đảo ngược giá trị của bất kỳ biểu thức Boolean nào). Do đó, nó trả về TRUE
khi biểu thức là FALSE
.
Bảng nguồn
Bảng sau được sử dụng cho các ví dụ trên trang này.
SELECT * FROM Pets;
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Ví dụ 1
Dưới đây là một ví dụ đơn giản để chứng minh NOT
nhà điều hành.
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Trong trường hợp này, chúng tôi đã sử dụng NOT
toán tử để phủ định kết quả của LIKE
nhà điều hành. Truy vấn của chúng tôi trả về tất cả các vật nuôi không bắt đầu bằng chữ F.
Ví dụ 2 - Sử dụng KHÔNG với các toán tử so sánh
Nếu bạn đang sử dụng NOT
để phủ định toán tử so sánh, bạn sẽ cần sửa đổi một chút cú pháp của mình so với cú pháp được sử dụng trong ví dụ trước.
Ví dụ:nếu bạn muốn sử dụng nó để phủ định toán tử bằng (=
), sử dụng cú pháp sau:
SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Điều này trả về tất cả các vật nuôi có tên không phải là Fluffy.
Trong ví dụ này, chúng tôi đặt NOT
toán tử ở phía trước tên cột. Nếu chúng tôi không làm điều đó, chúng tôi sẽ nhận được lỗi như sau:
SELECT * FROM Pets
WHERE PetName NOT = 'Fluffy';
Kết quả:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '='.
Chúng tôi cũng có thể đạt được kết quả tương tự bằng cách sử dụng toán tử không bằng với (<>
hoặc !=
tùy thuộc vào DBMS của bạn).
Ví dụ:điều này:
SELECT * FROM Pets
WHERE PetName <> 'Fluffy';
Hoặc cái này:
SELECT * FROM Pets
WHERE PetName != 'Fluffy';
Ví dụ 3 - Cú pháp tương tự với các toán tử lôgic
Hóa ra, chúng ta cũng có thể sử dụng cú pháp đó khi sử dụng các toán tử logic, chẳng hạn như LIKE
toán tử mà chúng tôi đã sử dụng trong ví dụ đầu tiên.
Do đó, chúng tôi có thể viết lại ví dụ đầu tiên cho điều này:
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Trong trường hợp bạn không chắc sự khác biệt là gì, chúng tôi đã chuyển NOT
toán tử sau PetName
cột, đến trước nó.
Đây là hai câu kết hợp với nhau:
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%';
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%';
Ví dụ 4 - Áp dụng Nhiều Điều kiện
NOT
toán tử chỉ phủ định một điều kiện duy nhất. Nếu bạn có nhiều điều kiện mà bạn cần phải phủ định, hãy sử dụng NOT
riêng biệt toán tử cho mỗi điều kiện,
SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy'
AND NOT PetName = 'Wag';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Ví dụ 5 - Mức độ ưu tiên
Khi sử dụng điều kiện kết hợp, trong đó bạn có nhiều toán tử, NOT
toán tử được đánh giá trước bất kỳ toán tử logic nào, nhưng sau bất kỳ toán tử nào. toán tử so sánh,
Khi hai toán tử trong một biểu thức có cùng mức ưu tiên, chúng được đánh giá từ trái sang phải dựa trên vị trí của chúng trong biểu thức. Tuy nhiên, bạn có thể sử dụng dấu ngoặc đơn để chỉ định thứ tự mà bạn muốn đánh giá từng điều kiện.
Đây là một ví dụ.
SELECT * FROM Pets
WHERE
NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag'
AND NOT DOB > '2020-01-01';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Chúng tôi không sử dụng bất kỳ dấu ngoặc đơn nào ở đây và tất cả các điều kiện đều bị phủ định với NOT
toán tử, và AND
toán tử được ưu tiên hơn OR
nhà điều hành.
Tuy nhiên, chúng ta có thể sử dụng dấu ngoặc đơn để chỉ định rằng OR
điều kiện phải được đánh giá trước AND
điều kiện.
SELECT * FROM Pets
WHERE
(NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag')
AND NOT DOB > '2020-01-01';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | +---------+-------------+-----------+-----------+------------+
Trong trường hợp này, chúng tôi nhận được một kết quả khác.
Ví dụ 6 - Phủ nhận Toán tử GIỮA
Đây là một ví dụ khác, lần này sử dụng NOT
toán tử để phủ định kết quả của BETWEEN
nhà điều hành.
SELECT * FROM Pets
WHERE DOB NOT BETWEEN '2018-10-01' AND '2020-09-17';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Trong ví dụ này, chúng tôi trả về tất cả các hàng có DOB
cột là không giữa 2018-10-01
và 2020-09-17
.
Trong trường hợp này, hai hàng khớp với tiêu chí đó và do đó, hai hàng đã được trả về.
Đây là kết quả ngược lại với truy vấn sau:
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Trong ví dụ này, chúng tôi trả về tất cả các hàng có DOB
cột là giữa 2018-10-01
và 2020-09-17
.
Trong trường hợp này, bốn hàng phù hợp với tiêu chí đó và do đó, bốn hàng đã được trả về.