SQL - NOT 運算子



大多數情況下,需要使用兩個或更多條件來過濾表中所需記錄;但有時滿足其中一個條件就足夠了。也有一些情況下,您需要檢索不滿足指定條件的記錄。SQL為此目的提供了**邏輯連線符**。它們列在下面:

  • **AND** - 運算子

  • **OR** - 運算子

  • **NOT** - 運算子

藉助這些邏輯連線符,可以檢索所需的記錄,併為不需要檢索的記錄建立例外。

SQL NOT 運算子

**SQL NOT** 是一個邏輯運算子/連線符,用於在 WHERE 子句中否定條件或布林表示式。也就是說,TRUE 變為 FALSE,反之亦然。

可以使用此運算子的最常見場景是,指定結果表中**不包含**什麼,而不是包含什麼。

例如,在印度的投票系統中,未滿 18 歲的民眾**不允許**投票。因此,在檢索所有有資格投票的人的資訊時,使用 NOT 運算子,我們可以為未成年人建立一個例外,因為這是唯一的規定。

NOT 運算子始終用於 WHERE 子句中,因此其在子句中的作用域並不總是很明確。因此,一個更安全的選項是透過括號將布林表示式或子查詢括起來,以精確執行查詢。

語法

以下是 SQL NOT 運算子的語法:

NOT [CONDITION or BOOLEAN EXPRESSION];

示例

在下面的示例中,我們首先建立一個表來演示 NOT 運算子的用法。

使用下面的查詢,我們建立一個名為**CUSTOMERS**的表,其中包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和薪水等:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
); 

現在,使用 INSERT 語句將值插入此表,如下所示:

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),   
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),   
(5, 'Hardik', 27, 'Bhopal', 8500.00 ), 
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

表將建立如下:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

下面的 SQL 查詢檢索 'CUSTOMERS' 表中 'SALARY' 列不大於 2000.00 的所有行:

SELECT * FROM CUSTOMERS WHERE NOT (SALARY > 2000.00);

輸出

以下是上述查詢的輸出:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00

SQL NOT 運算子與 LIKE

LIKE 運算子使用萬用字元在表記錄上執行模式匹配,然後提取匹配的記錄。

但是,為了否定此操作(改為提取不匹配的記錄),我們可以將 NOT 運算子與 LIKE 結合使用,形成**NOT LIKE**關鍵字。

示例

使用下面的查詢,我們檢索 'CUSTOMERS' 表中 'NAME' 列不以字母 'K' 開頭的所有行:

SELECT * FROM CUSTOMERS WHERE NAME NOT LIKE 'K%';

輸出

執行上述查詢後,表將顯示如下:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
1 Ramesh 32 Ahmedabad 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00

SQL NOT 運算子與 IN

如果表列中的值屬於 WHERE 子句中指定的數字範圍,則 IN 運算子返回 TRUE;否則返回 FALSE。

要否定此操作,我們可以改用 NOT IN 運算子。使用此運算子,如果記錄不存在於給定範圍內,則布林表示式返回 TRUE。

示例

以下 SQL 查詢選擇 'CUSTOMERS' 表中 'AGE' 列的值不為 25、26 或 32 的所有行:

SELECT * FROM CUSTOMERS WHERE AGE NOT IN (25, 26, 32);

輸出

結果表顯示如下:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
3 Kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

SQL NOT 運算子與 IS NULL

IS NULL 運算子用於檢查表中的記錄是否為 NULL。如果遇到 NULL 值,則返回 TRUE;否則返回 FALSE。

將 NOT 運算子與 IS NULL 運算子一起使用,我們可以提取所有不包含 NULL 值的記錄。

示例

此 SQL 查詢檢索 'CUSTOMERS' 表中 'AGE' 列不為 null 的所有行,即包含有效年齡值的行:

SELECT * FROM CUSTOMERS WHERE AGE IS NOT NULL;

輸出

結果表與原始表完全相同,因為它不包含 NULL 值:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

但是,如果表包含任何 NULL 值,則結果表中將省略包含它的行。

SQL NOT 運算子與 BETWEEN

BETWEEN 運算子用於將範圍作為條件建立。當與 WHERE 子句一起使用時,此運算子就像一個布林表示式。也就是說,如果表列的值落在指定的範圍內,則返回 TRUE;否則返回 FALSE。

將 NOT BETWEEN 運算子與 WHERE 子句一起使用將返回其否定。也就是說,如果表列的值落在指定的範圍內,則返回 FALSE;否則返回 TRUE。

示例

在下面的給定查詢中,我們顯示 CUSTOMERS 表中薪水不在 1500.00 到 2500.00 之間的記錄:

SELECT * FROM CUSTOMERS 
WHERE SALARY NOT BETWEEN 1500.00 AND 2500.00;

輸出

結果表如下所示:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

SQL NOT 運算子與 EXISTS

EXISTS 運算子的工作方式類似於 IN 運算子;它將表記錄與 WHERE 子句中指定的範圍進行比較。但是,IN 運算子無法將 NULL 記錄與範圍進行比較,而 EXISTS 可以。

NOT EXISTS 運算子用於否定此操作。

示例

在下面的示例中,讓我們建立另一個名為 Orders 的表來幫助演示 NOT 運算子與 EXISTS 運算子的用法:

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2)
);

使用 INSERT 語句,將值插入此表,如下所示:

INSERT INTO ORDERS VALUES 
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

表顯示如下:

OID 日期 (DATE) 客戶 ID (CUSTOMER_ID) 金額 (AMOUNT)
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

以下查詢用於列印 CUSTOMERS 表中不存在於 ORDERS 表中的客戶的 ID:

SELECT * FROM CUSTOMERS WHERE NOT EXISTS (
SELECT CUSTOMER_ID FROM ORDERS 
WHERE ORDERS.CUSTOMER_ID = CUSTOMERS.ID);

輸出

執行查詢後獲得的輸出如下所示:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
1 Ramesh 32 Ahmedabad 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00
廣告