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 INSELECT * FROM orders
WHERE status = '已完成' AND order_number NOT IN (SELECT order_number FROM orders WHERE status = '已取消');
-- 使用 LEFT JOINSELECT 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 EXISTSSELECT * FROM orders o1
WHERE status = '已完成' AND NOT EXISTS (SELECT * FROM orders o2 WHERE o2.order_number = o1.order_number AND status = '已取消');