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
广告