在SQL的查询场景中,除了需要匹配特定字符模式的模糊查询外,我们还经常需要筛选出不符合某些字符规则的记录,这种需求可以通过NOT LIKE关键字配合通配符来实现,也就是常说的模糊不匹配查询。

NOT LIKE关键字的基本语法
NOT LIKE是SQL中用于判断字段值不匹配指定模式的操作符,基本语法结构如下:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 字段名 NOT LIKE '匹配模式';
这里的匹配模式中可以包含通配符,用来定义要排除的字符规则,常见的通配符有两个:
- %:代表任意长度的字符,包括零个字符
- _:代表单个任意字符
常见使用场景与示例
场景1:排除包含特定字符的记录
假设我们有一张用户表user_info,需要查询所有用户名中不包含test字符的用户信息,SQL语句如下:
-- 查询用户名不包含test的用户 SELECT user_id, user_name, email FROM user_info WHERE user_name NOT LIKE '%test%';
上述语句中%test%表示任意位置包含test的字符串,加上NOT LIKE后就会排除所有用户名中包含test的记录。
场景2:排除符合特定格式的记录
如果需要查询邮箱不是以qq.com结尾的用户,同时用户名长度为5个字符且第二个字符不是数字的用户,可以这样写:
-- 多条件模糊不匹配查询 SELECT user_id, user_name, email FROM user_info WHERE email NOT LIKE '%@qq.com' AND user_name NOT LIKE '_%[0-9]%' -- 部分数据库支持正则,这里用通用写法 AND LENGTH(user_name) = 5;
场景3:排除特定开头的记录
如果要查询所有产品编号不是以PROD_202开头的商品信息,SQL语句如下:
-- 排除特定开头的记录 SELECT product_id, product_name, price FROM product WHERE product_id NOT LIKE 'PROD_202%';
注意事项
- 如果字段值本身包含
%或者_字符,需要使用转义字符处理,不同数据库的转义方式略有不同,比如MySQL可以用作为转义符。 - NOT LIKE对NULL值无效,如果字段存在NULL值,需要额外加上
字段名 IS NOT NULL的条件。 - 当匹配模式是固定字符串时,NOT LIKE的效果和
<>操作符一致,但是NOT LIKE支持通配符,适用场景更灵活。
与NOT EXISTS的区别
很多开发者会混淆NOT LIKE和NOT EXISTS的用法,两者适用场景不同:NOT LIKE是用于单字段的字符模式匹配排除,而NOT EXISTS是用于子查询的结果判断,当需要排除符合另一个查询结果集的记录时才使用NOT EXISTS,不要混用两个语法。
-- NOT EXISTS示例:查询没有下过订单的用户
SELECT u.user_id, u.user_name
FROM user_info u
WHERE NOT EXISTS (
SELECT 1 FROM order_info o WHERE o.user_id = u.user_id
);