MySQL查询排除一项特定值(mysql 不包含某值)

MySQL查询排除一项特定值

在进行MySQL查询时,有时候需要排除一项特定值来得到更准确的结果。这种情况可以通过使用“NOT IN”语句来实现。

例如:我们有一个表存储销售订单的数据,其中有一个“状态”列,包含订单的不同状态,例如“已付款”、“已发货”、“已完成”等等。假设我们想查询所有“已完成”的订单,但又不想包含“已取消”的订单,可以使用以下语句:

SELECT * FROM orders
WHERE status = '已完成' AND order_number NOT IN
(SELECT order_number FROM orders WHERE status = '已取消');

以上语句中,子查询通过“NOT IN”来排除“已取消”状态的订单。这样就可以得到所有“已完成”状态下,没有被取消的订单。

另一种实现方式是使用“LEFT JOIN”语句:

SELECT o.* FROM orders o 
LEFT JOIN orders c ON o.order_number = c.order_number AND c.status = '已取消'
WHERE o.status = '已完成' AND c.order_number IS NULL;

以上语句中,我们通过“LEFT JOIN”将所有“已完成”的订单和所有“已取消”的订单关联起来,然后通过“WHERE c.order_number IS NULL”来排除那些有“已取消”状态的订单。

除了上述两种方式外,还可以使用“NOT EXISTS”语句来实现。例如:

SELECT * FROM orders o1
WHERE status = '已完成' AND NOT EXISTS
(SELECT * FROM orders o2 WHERE o2.order_number = o1.order_number AND status = '已取消');

以上语句中,我们使用“NOT EXISTS”来排除和当前订单号相同,并且状态是“已取消”的所有订单。

以上三种方式都可以实现同样的功能,只是语法略有不同。在实际应用中,我们选择使用哪种方式,可以根据具体情况灵活选择。

附上完整代码示例:

CREATE TABLE orders (
order_number INT PRIMARY KEY,
status VARCHAR(50)
);

INSERT INTO orders VALUES (1, '已付款');
INSERT INTO orders VALUES (2, '已付款');
INSERT INTO orders VALUES (3, '已发货');
INSERT INTO orders VALUES (4, '已完成');
INSERT INTO orders VALUES (5, '已取消');
INSERT INTO orders VALUES (6, '已完成');
INSERT INTO orders VALUES (7, '已完成');
INSERT INTO orders VALUES (8, '已取消');
INSERT INTO orders VALUES (9, '已完成');
INSERT INTO orders VALUES (10, '已完成');
-- 使用 NOT IN
SELECT * FROM orders
WHERE status = '已完成' AND order_number NOT IN
(SELECT order_number FROM orders WHERE status = '已取消');
-- 使用 LEFT JOIN
SELECT o.* FROM orders o
LEFT JOIN orders c ON o.order_number = c.order_number AND c.status = '已取消'
WHERE o.status = '已完成' AND c.order_number IS NULL;
-- 使用 NOT EXISTS
SELECT * FROM orders o1
WHERE status = '已完成' AND NOT EXISTS
(SELECT * FROM orders o2 WHERE o2.order_number = o1.order_number AND status = '已取消');

数据运维技术 » MySQL查询排除一项特定值(mysql 不包含某值)