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

Toán tử SQL NOT cho người mới bắt đầu

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-012020-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 giữa 2018-10-012020-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ề.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thông tin liên hệ đang phát triển có nghĩa là thay đổi cơ sở dữ liệu của bạn không?

  2. Kích thước cấp chuẩn cho cơ sở dữ liệu Azure SQL mới

  3. Thống kê chờ Knee-Jerk:SOS_SCHEDULER_YIELD

  4. Các nguyên tắc cơ bản về biểu thức bảng, Phần 8 - CTE, tiếp tục xem xét tối ưu hóa

  5. Tách chuỗi:Theo dõi