黄小水的sql进阶之路之postgresql的模糊查询

ilike和not ilike

ilike 表示在模糊匹配字符串时不区分大小写,前置的i是ignore的意思。
举例
在这里插入图片描述
not ilike自然就是不模糊匹配字符串,且不区分大小写的意思了
上述例子如图
在这里插入图片描述

使用like时模糊匹配通配符时的问题

在使用like和not like有时需要模糊匹配%和_,这个时候就需要使用escape进行转义
例子如下
在这里插入图片描述
如图,/作为转义符,/后面的通配符可以当做普通字符来进行匹配
左模糊查询效率不高,尽量不要再应用中去使用

~ ,~* ; !~ , !~ *

~ 同样被用作于模糊查询,但是使用~来进行模糊查询的话不需要使用%等通配符,所以也就不存在使用like时的转义问题了,另一个比较强大的功能是 ~ 可以匹配正则表达式,且区分大小写,而 ~*表示不区分大小写
例子
在这里插入图片描述

~~ , ~~ * ; !~~ , !~~ *

~~ 等效于like,~~* 等效于ilike。

!~~ 等效于not like,!~~* 等效于not ilike。

例子
在这里插入图片描述

<think>好的,我现在需要帮助用户解决关于模糊查询SQL语句的问题。首先,我得回忆一下模糊查询的基本语法,用户可能想知道如何使用LIKE操作符,以及通配符的使用方法。记得LIKE通常和%以及_一起用,%代表任意多个字符,_代表单个字符。然后,用户提供的引用中有提到转义符的使用,比如用ESCAPE来指定转义字符,防止通配符被误解,比如查询包含下划线的情况。还有引用中提到了MyBatis的动态SQL和模糊查询的区别,比如#{}和${}的不同,这里需要注意防止SQL注入的问题,应该推荐使用#{}配合concat或者使用bind标签。 接下来,用户可能需要具体的示例,比如如何查询以某个字开头,包含某些字符,或者特定格式的数据。例如,查询姓张的员工,或者名字中包含“小”字的。同时,用户可能还会想知道如何处理大小写的问题,比如有些数据库使用ILIKE,但标准SQL可能需要使用函数如LOWER()或UPPER()来转换。此外,正则表达式的应用也可能被提及,比如在某些数据库中使用REGEXP_LIKE,但不同数据库支持不同,需要指出常见数据库的差异。 还要注意子查询中的模糊查询,比如在WHERE子句中使用子查询的结果进行IN操作,但用户的问题主要集中在模糊查询本身,可能需要结合引用中的例子,如使用IN和子查询的结构。不过用户的问题是关于模糊查询的,所以重点应放在LIKE和相关语法上。 另外,用户可能对性能优化感兴趣,比如模糊查询对索引的影响,前导通配符%的使用可能导致索引失效,这时候可以建议使用全文检索或者其他方法。同时,动态SQL中的模糊查询,比如在MyBatis中拼接%的情况,使用concat函数或者bind标签会更安全,避免SQL注入。 最后,整理步骤,从基础语法到示例,再到进阶用法和注意事项,确保覆盖用户可能需要的各个方面。同时,生成相关问题,比如如何优化模糊查询的性能,或者在不同数据库中的语法差异,以及防止SQL注入的方法等。</think>### 模糊查询SQL语句编写指南 #### 1. **基础语法** 模糊查询主要通过`LIKE`运算符结合通配符实现: - `%`:匹配任意多个字符(包括0个),例如`张%`匹配以“张”开头的字符串。 - `_`:匹配单个字符,例如`张_`匹配“张”后跟一个字符的字符串。 - 转义符:使用`ESCAPE`处理特殊字符,例如查询含`_`的字符串: ```sql SELECT * FROM table WHERE name LIKE '张/_小%' ESCAPE '/'; -- 匹配“张_小”开头的字符串[^3] ``` #### 2. **常见场景示例** - **前缀匹配**(查询姓“张”的员工): ```sql SELECT * FROM emp WHERE name LIKE '张%'; ``` - **后缀匹配**(查询以“.com”结尾的邮箱): ```sql SELECT * FROM users WHERE email LIKE '%.com'; ``` - **包含特定字符**(查询名字含“小”的员工): ```sql SELECT * FROM emp WHERE name LIKE '%小%'; ``` - **固定长度匹配**(查询手机号格式为“138****1234”): ```sql SELECT * FROM contacts WHERE phone LIKE '138____1234'; ``` #### 3. **进阶用法** - **大小写不敏感查询**: - PostgreSQL使用`ILIKE`: ```sql SELECT * FROM emp WHERE name ILIKE '%xiaoming%'; -- 不区分大小写 ``` - MySQL使用函数转换: ```sql SELECT * FROM emp WHERE LOWER(name) LIKE '%xiaoming%'; ``` - **正则表达式匹配**(部分数据库支持): ```sql -- MySQL示例:匹配以字母A开头、数字结尾的字符串 SELECT * FROM table WHERE name REGEXP '^A.*[0-9]$'; ``` #### 4. **动态SQL中的模糊查询** 在MyBatis等框架中: - **安全方式**(使用`#{}`防止SQL注入): ```xml <select id="search" resultType="User"> SELECT * FROM users WHERE name LIKE CONCAT('%', #{keyword}, '%') </select> ``` - **替代方案**(使用`bind`标签): ```xml <bind name="pattern" value="'%' + keyword + '%'" /> SELECT * FROM users WHERE name LIKE #{pattern} ``` #### 5. **性能注意事项** - **索引失效**:前导通配符(如`%keyword`)可能导致全表扫描,需结合全文检索优化。 - **避免过度模糊**:尽量明确匹配范围,如`张%`优于`%张%`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值