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