NOT
NOT 对条件取反——"除了这些,其他的都要"。NOT 可以放在任何条件表达式前面:NOT LIKE、NOT IN、NOT BETWEEN、NOT EXISTS,甚至 NOT (A AND B)。
NOT 有一个关键坑:它不反转 NULL。NOT (NULL) 的结果仍然是 NULL,而不是 TRUE。比如 WHERE NOT (performance_bonus > 1000) 会把 performance_bonus 为 NULL 的行也排除——因为 NULL > 1000 是 NULL,NOT NULL 还是 NULL,不是 TRUE。想拿 NULL 行还得额外加 OR 列名 IS NULL。
以飞翔科技为例:
-- 查非技术部的员工
SELECT emp_name, dept_code
FROM employees
WHERE NOT (dept_code = 2);
-- 查商品名不含"飞翔"的商品
SELECT product_name, price
FROM products
WHERE product_name NOT LIKE '%飞翔%';
-- 查工资不在 5000~15000 范围内的员工
SELECT emp_name, basic_salary
FROM employees
WHERE basic_salary NOT BETWEEN 5000 AND 15000;
-- 查部门和年份都不匹配特定组合的员工
SELECT emp_name, dept_code, join_year
FROM employees
WHERE NOT (dept_code = 2 AND join_year = 2018);
注意第一个例子:NOT (dept_code = 2) 不会返回 dept_code 为 NULL 的行。如果表里有些员工还没分配部门,用 NOT (dept_code = 2) 是拿不到他们的。