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 (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (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 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
使用以下SELECT查询,我们将尝试通过在记录上应用NOT运算符的约束来显示上述创建的表的选定列。
SELECT * FROM CUSTOMERS
WHERE NOT (SALARY > 2000.00);
输出
执行查询时,显示的表仅包含薪水低于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表的筛选行-
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 Operator with IN
使用NOT IN运算符,当表列中的值不属于WHERE子句中指定的数值范围时,返回TRUE。
以下是一个示例:
在下面的示例中,我们尝试使用以下查询来显示Customers表的过滤行:
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 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+---------+-----+---------+----------+
SQL NOT运算符与IS NULL一起使用
IS NULL运算符用于检查表中的记录是否为NULL。如果遇到NULL值,它返回TRUE;否则返回FALSE。
使用NOT运算符与IS NULL运算符,我们可以提取所有不包含NULL值的记录。
示例
使用下面给出的查询,我们试图过滤掉Customers表中存在的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 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
然而,如果表格中包含任何NULL值,包含它的行将在结果表中被省略。
带有BETWEEN的SQL NOT运算符
BETWEEN运算符用于建立一个范围作为条件。当与WHERE子句一起使用时,此运算符的行为类似于布尔表达式。也就是说,如果表列的值在指定的范围内,返回TRUE;否则返回FALSE。
使用带有WHERE子句的NOT BETWEEN运算符将返回其否定。也就是说,如果表列的值在指定的范围内,返回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 | MP | 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 (OID, DATE, CUSTOMER_ID, AMOUNT)
VALUES (102, '2009-10-08 00:00:00', 3, 3000.00);
INSERT INTO ORDERS (OID, DATE, CUSTOMER_ID, AMOUNT)
VALUES (100, '2009-10-08 00:00:00', 3, 1500.00);
INSERT INTO ORDERS (OID, DATE, CUSTOMER_ID, AMOUNT)
VALUES (101, '2009-11-20 00:00:00', 2, 1560.00);
INSERT INTO ORDERS (OID, DATE, CUSTOMER_ID, AMOUNT)
VALUES (103, '2008-05-20 00:00:00', 4, 2060.00);
表格的显示如下:
+-----+---------------------+-------------+---------+
| OID | DATE | 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 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+--------+-----+-----------+----------+