SQL 之 模糊匹配

本文介绍了在SQL中如何进行模糊匹配,包括使用LIKE操作符和通配符%、_、[]进行模式匹配。此外,还讲解了SOUNDEX和DIFFERENCE函数在按照读音匹配时的应用,帮助找到读音相似的单词或名字。

模糊匹配

关键字:LIKE , SOUNDEX , DIFFERENCE

 

1. 模式匹配

WHERE子句中使用LIKE操作符来查找针对列值的某个部分的匹配。LIKE + 通配符 来指定。

SELECT

MovieTitle AS Movie

FROM Movies

WHERE MovieTitle LIKE %LOVE%

查找电影名包含LOVE的电影(LOVE不区分大小写)。

 

%string表示字符string前面可以有任意多字符,string%表示string后面可以有任意多字符。即

LOVE开头:LOVE%

LOVE结尾:%LOVE

LOVE是单独一个单词而不作为名字中的开头或者结尾:% LOVE %

 

但注意如果是Oracle,是区分大小写的,通配符里面的字符严格匹配大小写,这和在SQL中使用本例是不一样的。一般等价的话,要在Oracle里面使用UPPER转换为全大写后进行匹配:

SELECT

MovieTitle AS Movie

FROM Movies

WHERE UPPER (MovieTitle) LIKE %LOVE%;

 

2. 通配符

除了 %,还有下划线 (_)、方括号[] 括起来的字符列表,以及用方括号[] 括起来的脱字符号加上字符列表。

 

通配符

             含义

%

             任意多个字符(可以是没有字符)

_

             刚好1个字符(可以是任意的字符)

[characterlist]

             出现在字符列表里面的1个字符(刚好1个)

[^characterlist]

             没有出现在字符列表里面的1个字符(刚好1个)

 

MySQLOracle里面没有后两种通配符。

 

_ARY     Cary ,  Mary ,  Gray

[CM]ARY   Cary ,  Mary

[^CG]ARY   Mary

 

上面只能匹配以ARY结尾的单词。

NOT使用:

SELECT

FirstName,

LastName

FROM Actors

WHERE FirstName LIKE %ARY%

AND FirstName NOT LIKE  [MG]ARY

 

NOT LIKE  [MG]ARY 和 [^MG]ARY也是不同的,注意区分意义。

 

3. 按照读音匹配

SOUNDEXDIFFERENCE

 

SELECT

SOUNDEX (Smith) AS Sound of Smith

SOUNDEX (Smythe) AS Sound of Smythe

 

结果:

Sound of Smith       Sound of Smythe

---------------------------------------------

5530                  5530

 

SOUNDEX返回4个字符的代码,表示短语的读音。代码相同说明读音相似。

 

DIFFERENCE MySQLOracle没有DIFFERENCE函数)

SELECT

DIFFERENCE (Smith, Smythe) AS The Difference

 

The Difference

--------------------

4

 

DIFFERENCE总是需要两个参数,先得到这两个参数的SOUNDEX值,再比较这两个值。返回4说明SOUNDEX值中的4个字符全部相等,返回0则字符中没有相等的值。因此,DIFFERENCE的值为4是最大可能的匹配。

SELECT

FirstName,

LastName

FROM Actors

WHERE DIFFERENCE (FirstName, John) = 4

 

Actors表中查找FirstName读音和John非常相似的名字:

可能返回

FirstName    LastName        

Jon            Voight

John          Wayne

 

SQL 中,**模糊匹配**是通过 `LIKE` 操作符实现的,用于在 `WHERE` 子句中对字符串进行模式匹配。它常用于查找包含、开头、结尾或符合某种模式的文本数据。 --- ### ✅ 基本语法: ```sql SELECT column1, column2, ... FROM table_name WHERE column LIKE pattern; ``` - `pattern` 是一个字符串模式,可以包含两个通配符: - `%`:匹配任意数量的字符(包括零个字符) - `_`:匹配单个字符 --- ### 🌰 示例说明 假设有一个 `users` 表,结构如下: | id | name | email | |----|----------|---------------------| | 1 | Alice | alice@example.com | | 2 | Bob | bob@gmail.com | | 3 | Charlie | charlie@yahoo.com | | 4 | David | david@outlook.com | --- #### 1. 匹配以某个字符串开头(使用 `%`) ```sql -- 查找名字以 'A' 开头的用户 SELECT * FROM users WHERE name LIKE 'A%'; ``` > 结果:Alice --- #### 2. 匹配以某个字符串结尾 ```sql -- 查找邮箱以 'gmail.com' 结尾的用户 SELECT * FROM users WHERE email LIKE '%gmail.com'; ``` > 结果:Bob --- #### 3. 匹配包含某个子串 ```sql -- 查找名字中包含 'ar' 的用户 SELECT * FROM users WHERE name LIKE '%ar%'; ``` > 结果:Charlie --- #### 4. 使用 `_` 匹配单个字符 ```sql -- 查找名字第二个字母是 'o' 的用户 SELECT * FROM users WHERE name LIKE '_o%'; ``` > 结果:Bob(因为 B-o-b) --- #### 5. 组合使用多个通配符 ```sql -- 查找邮箱格式为 'x@y.z',其中用户名有两个字符 SELECT * FROM users WHERE email LIKE '__@%.%'; ``` > 匹配如 `ab@cd.ef` 这类格式。 --- ### 🔁 NOT LIKE:反向模糊匹配 ```sql -- 查找名字不以 'C' 开头的用户 SELECT * FROM users WHERE name NOT LIKE 'C%'; ``` --- ### 🚫 转义特殊字符 如果要搜索的内容本身包含 `%` 或 `_`,需要用 `ESCAPE` 指定转义字符: ```sql -- 假设要查找名字中包含下划线 '_' 的记录 INSERT INTO users (name) VALUES ('user_1'); -- 使用 ESCAPE 定义转义符(例如 `\`) SELECT * FROM users WHERE name LIKE '%\_%' ESCAPE '\'; ``` 这表示匹配包含字面意义的 `_` 字符。 --- ### 💡 不同数据库中的扩展支持 虽然标准 SQL 使用 `LIKE`,但一些数据库提供了更强大的正则表达式支持: #### MySQL: 使用 `REGEXP` 或 `RLIKE` ```sql -- 查找名字以 A 或 B 开头的用户 SELECT * FROM users WHERE name REGEXP '^[AB]'; ``` #### PostgreSQL: 使用 `~`(正则匹配) ```sql SELECT * FROM users WHERE name ~ '^A'; -- 以 A 开头 ``` #### SQLite: 支持 `REGEXP`(需自定义函数) --- ### ⚠️ 性能提示 - `LIKE 'abc%'` 可以使用索引(前缀匹配),性能较好。 - `LIKE '%abc'` 或 `LIKE '%abc%'` 通常无法有效使用索引,可能导致全表扫描。 - 对大数据量字段做模糊查询时,建议结合全文索引(如 MySQL 的 `FULLTEXT`)或使用搜索引擎(如 Elasticsearch)。 --- ### ✅ 小结 | 模式 | 含义 | |----------------|------------------------| | `'abc%'` | 以 "abc" 开头 | | `'%abc'` | 以 "abc" 结尾 | | `'%abc%'` | 包含 "abc" | | `'_bc'` | 第二和第三个字符是 bc | | `'a_c'` | 三个字符,中间是任意一个字符 | | `'%\%%' ESCAPE '\'` | 包含字面的 `%` 字符 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值