sql中模糊查询主要依赖like操作符配合通配符%(代表任意长度的任意字符)和_(代表单个任意字符),用于实现非精确匹配;2. 常见用法包括:’张%’查找以“张”开头的字符串,’%三’查找以“三”结尾的字符串,’%限量版%’查找包含“限量版”的字符串,’_小_’查找三个字且中间为“小”的字符串;3. 模糊匹配在用户搜索、数据清洗、报告统计和异常识别中至关重要,能应对输入不规范或数据变体问题;4. 通配符%可匹配零到多个字符,适用于模糊和包含场景,而_仅匹配一个字符,适用于固定长度或特定位置的精确匹配;5. not like用于排除符合特定模式的记录,常用于排除测试数据、识别格式异常(如邮箱、电话号码)、筛选不包含关键词的内容以及结合escape排除含通配符字面值的数据,提升了数据过滤的灵活性。
SQL中,要进行简单的模糊查询,我们主要依赖
LIKE
操作符。它的核心在于通过模式匹配来筛选字符串数据,而不是进行精确的比对。这就像你在一个杂乱的文档堆里找东西,不记得确切的名字,只记得几个关键词或开头结尾,
LIKE
就是帮你做这件事的工具。它主要配合两个通配符使用:百分号(
%
)代表任意长度(包括零个)的任意字符序列,而下划线(
_
)则代表一个且仅一个任意字符。
SQL模糊查询的基础语句用法,说白了,就是把
LIKE
操作符放到
WHERE
子句后面,然后跟上你想要匹配的模式字符串。这个模式字符串里,通配符就是我们的魔法棒。
最常见的几种用法:
-
查找以特定字符开头的记录:如果你想找所有名字以“张”开头的用户,你可以这么写:
SELECT * FROM Users WHERE UserName LIKE '张%';
这里
'张%'
的意思是“以‘张’字开头,后面跟着任意数量的任意字符”。
-
查找以特定字符结尾的记录:要是你只记得某个名字的最后一个字是“三”,那可以这样:
SELECT * FROM Products WHERE ProductName LIKE '%三';
'%三'
表示“前面可以是任意数量的任意字符,但必须以‘三’字结尾”。
-
查找包含特定字符序列的记录:这是最常用的,比如你想找所有描述里包含“限量版”的产品:
SELECT * FROM Descriptions WHERE ProductDescription LIKE '%限量版%';
'%限量版%'
意味着“无论前面有什么,后面有什么,只要中间包含‘限量版’就行”。
-
查找特定位置的字符:有时候我们对长度有要求,或者知道某个位置的字符是什么。比如,我想找所有名字是三个字,且中间那个字是“小”的:
SELECT * FROM Employees WHERE EmployeeName LIKE '_小_';
'_小_'
表示“第一个字符是任意一个字符,第二个字符是‘小’,第三个字符是任意一个字符”。这在处理一些固定格式的编码或者特定长度的字段时特别有用。
理解了这几个基础模式,基本上就能应付日常大部分的模糊查询需求了。
为什么在数据查询中模糊匹配如此重要?它能解决哪些实际问题?
在我看来,模糊匹配在数据查询中简直是不可或缺的。想想看,我们的数据世界从来都不是完美无缺的,用户输入可能五花八门,数据录入也难免有疏漏。如果只有精确匹配,那很多时候我们根本就找不到想要的信息。
它能解决的实际问题太多了:
- 用户搜索体验:当用户在电商网站搜索“手机壳”时,他可能输入“手机壳”、“手机保护套”、“手机套”,甚至“IPHONE壳”。如果只支持精确匹配,那用户体验会非常糟糕。模糊查询能让系统理解用户的意图,即使输入不完全精确也能返回相关结果。
- 数据清洗与分析:我在处理一些历史数据时,经常遇到“张三”、“张叁”、“张三丰”这样的情况。如果想找出所有“张三”相关的人,精确匹配肯定不行。利用
LIKE '张三%'
或者
LIKE '%张三%'
,就能把这些变体都找出来,方便后续的清洗和统一。
- 报告与统计:需要统计所有“销售部”或“市场部”的员工,但部门名称可能写成“销售部(北京)”、“销售一部”、“市场部-华南区”等。一个
LIKE '%销售部%' OR LIKE '%市场部%'
就能轻松搞定。
- 识别异常或模式:比如,你想找出所有邮箱地址不符合常规格式(比如没有
@
符号)的用户,或者所有电话号码不是11位的记录。模糊查询配合
NOT LIKE
就能派上用场。
可以说,模糊匹配是让数据“活”起来的关键,它让查询变得更加灵活和智能,适应了现实世界中数据固有的不确定性。
LIKE
LIKE
操作符中的通配符
%
和
_
,它们在实际使用中有何异同?
%
和
_
这两个通配符,虽然都是用来做模式匹配的,但它们的“权力”和“范围”是截然不同的,理解它们的不同,能让你写出更精确、更符合需求的查询语句。
百分号(
%
):
- 含义:代表零个、一个或多个任意字符。它的特点是“贪婪”且“灵活”。
- 何时用:
- 当你只知道字符串的开头或结尾,想匹配所有可能性时(如
'ABC%'
或
'%XYZ'
)。
- 当你只知道字符串中包含某个子串,而对子串前后的内容长度不确定时(如
'%KEYWORD%'
)。
- 你甚至可以只用一个
'%'
来匹配所有非NULL的字符串,虽然这没什么实际意义,但说明了它的“全能性”。
- 当你只知道字符串的开头或结尾,想匹配所有可能性时(如
- 例子:
-
LIKE '王%'
:能匹配“王”、“王小明”、“王大锤”。
-
LIKE '%手机'
:能匹配“华为手机”、“我的手机”。
-
LIKE '%苹果%'
:能匹配“苹果手机”、“我爱吃苹果派”。
-
下划线(
_
):
- 含义:代表一个且仅一个任意字符。它的特点是“精准”且“固定”。
- 何时用:
- 当你对字符串的长度有严格要求,或者你知道某个位置的字符是任意的,但其他位置是固定的时。
- 在处理一些编码、序列号或者固定格式的短文本时非常有用。
- 例子:
-
LIKE '张__'
:只匹配三个字的,且第一个字是“张”的名字,如“张三丰”、“张小明”,但不会匹配“张”或“张大炮”。
-
LIKE 'A_C'
:只匹配三个字符,开头是A,结尾是C的,如“ABC”、“ADC”、“A9C”。
-
LIKE '_____'
:匹配任意五个字符的字符串。
-
异同总结:
- 相同点:都是用于
LIKE
操作符的通配符,都匹配任意字符。
- 不同点:
-
%
匹配零到多个字符,
_
匹配一个字符。这是最核心的区别。
-
%
更适合“模糊”和“包含”的场景,
_
更适合“固定长度”和“特定位置”的场景。
-
实际使用中,我通常会根据对匹配精度的要求来选择。如果只是想看看有没有包含某个词,
%
是首选;如果我知道某个字段是固定格式,比如产品编码是
XXX-YYY-ZZZ
,而我只记得
XXX
和
ZZZ
,那
LIKE 'XXX-%-ZZZ'
可能就更合适,或者如果我知道中间是3个字符,
LIKE 'XXX-___-ZZZ'
则更精确。
NOT LIKE
NOT LIKE
的用途是什么?何时会用到它?
NOT LIKE
,顾名思义,就是
LIKE
的反面,它用于查找那些不符合指定模式的字符串。这在数据过滤、异常数据识别或者排除特定类型信息时,简直是神来之笔。
我个人在以下几种场景中经常用到
NOT LIKE
:
-
排除特定类型的记录:
- 比如,我想查看所有产品中,除了“测试”或“演示”用的产品以外的真实商品数据。
SELECT * FROM Products WHERE ProductName NOT LIKE '%测试%' AND ProductName NOT LIKE '%演示%';
- 或者,我想列出所有部门,但不想看到“临时部门”或“已撤销部门”:
SELECT * FROM Departments WHERE DeptName NOT LIKE '%临时%' AND DeptName NOT LIKE '%撤销%';
- 比如,我想查看所有产品中,除了“测试”或“演示”用的产品以外的真实商品数据。
-
数据质量检查与异常识别:
- 这是
NOT LIKE
非常实用的一个地方。比如,我想找出所有邮箱地址格式不规范(比如没有
@
符号,或者没有
.com
等后缀)的用户,以便进行数据清洗。
SELECT UserID, Email FROM Users WHERE Email NOT LIKE '%@%' OR Email NOT LIKE '%.%'; -- 简单示例,实际邮箱校验更复杂
- 再比如,我想找出所有电话号码不是以“1”开头的记录,这可能意味着数据录入错误。
SELECT CustomerID, PhoneNumber FROM Customers WHERE PhoneNumber NOT LIKE '1%';
- 这是
-
筛选不包含特定关键词的内容:
- 在内容管理系统中,你可能想找出所有文章中,不包含某个敏感词或已过时术语的。
SELECT ArticleID, Title FROM Articles WHERE Content NOT LIKE '%敏感词%' AND Content NOT LIKE '%过时术语%';
- 在内容管理系统中,你可能想找出所有文章中,不包含某个敏感词或已过时术语的。
-
处理包含通配符本身的数据:
- 如果你的数据中本身就包含
%
或
_
字符,而你想把它们作为字面值来匹配,就需要用到
ESCAPE
子句。但如果你想排除那些包含这些字面值的记录,
NOT LIKE
就配合
ESCAPE
一起用。例如,查找不包含字面值
50%
的字符串:
SELECT ItemCode FROM Inventory WHERE ItemCode NOT LIKE '%50%%' ESCAPE '';
这里
是转义字符,告诉SQL
%
不是通配符,而是要匹配的字面值。
- 如果你的数据中本身就包含
总的来说,
NOT LIKE
是
LIKE
的有力补充,它让我们可以从“找什么”转变为“排除什么”,在数据筛选和质量控制上提供了极大的灵活性。
评论(已关闭)
评论已关闭