
- SQL 教程
- SQL - 首頁
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 資料庫
- SQL - 語法
- SQL - 資料型別
- SQL - 運算子
- SQL - 表示式
- SQL 資料庫
- SQL - 建立資料庫
- SQL - 刪除資料庫
- SQL - 選擇資料庫
- SQL - 重新命名資料庫
- SQL - 顯示資料庫
- SQL - 備份資料庫
- SQL 表
- SQL - 建立表
- SQL - 顯示錶
- SQL - 重命名錶
- SQL - 截斷表
- SQL - 克隆表
- SQL - 臨時表
- SQL - 修改表
- SQL - 刪除表
- SQL - 刪除表
- SQL - 約束
- SQL 查詢
- SQL - INSERT 查詢
- SQL - SELECT 查詢
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - UPDATE 查詢
- SQL - DELETE 查詢
- SQL - 排序結果
- SQL 檢視
- SQL - 建立檢視
- SQL - 更新檢視
- SQL - 刪除檢視
- SQL - 重新命名檢視
- SQL 運算子和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布林 (BIT) 運算子
- SQL - LIKE 運算子
- SQL - IN 運算子
- SQL - ANY, ALL 運算子
- SQL - EXISTS 運算子
- SQL - CASE
- SQL - NOT 運算子
- SQL - 不等於
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 運算子
- SQL - UNION 運算子
- SQL - UNION 與 UNION ALL
- SQL - INTERSECT 運算子
- SQL - EXCEPT 運算子
- SQL - 別名
- SQL 連線
- SQL - 使用連線
- SQL - 內連線
- SQL - 左連線
- SQL - 右連線
- SQL - 交叉連線
- SQL - 全連線
- SQL - 自連線
- SQL - DELETE 連線
- SQL - UPDATE 連線
- SQL - 左連線與右連線
- SQL - UNION 與 JOIN
- SQL 金鑰
- SQL - 唯一鍵
- SQL - 主鍵
- SQL - 外部索引鍵
- SQL - 組合鍵
- SQL - 備選鍵
- SQL 索引
- SQL - 索引
- SQL - 建立索引
- SQL - 刪除索引
- SQL - 顯示索引
- SQL - 唯一索引
- SQL - 聚集索引
- SQL - 非聚集索引
- 高階 SQL
- SQL - 萬用字元
- SQL - 註釋
- SQL - 注入
- SQL - 託管
- SQL - MIN & MAX
- SQL - NULL 函式
- SQL - CHECK 約束
- SQL - DEFAULT 約束
- SQL - 儲存過程
- SQL - NULL 值
- SQL - 事務
- SQL - 子查詢
- SQL - 處理重複項
- SQL - 使用序列
- SQL - 自動遞增
- SQL - 日期和時間
- SQL - 遊標
- SQL - 通用表表達式
- SQL - GROUP BY 與 ORDER BY
- SQL - IN 與 EXISTS
- SQL - 資料庫調優
- SQL 函式參考
- SQL - 日期函式
- SQL - 字串函式
- SQL - 聚合函式
- SQL - 數值函式
- SQL - 文字和影像函式
- SQL - 統計函式
- SQL - 邏輯函式
- SQL - 遊標函式
- SQL - JSON 函式
- SQL - 轉換函式
- SQL - 資料型別函式
- SQL 有用資源
- SQL - 問答
- SQL - 快速指南
- SQL - 有用函式
- SQL - 有用資源
- SQL - 討論
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 |