MySQL模糊查询

MySQL模糊查询与正则表达式:通配符、内置函数及正则匹配详解
本文详细介绍了MySQL中通配符(%和_)的使用、LIKE操作符、以及locate(),position(),instr()内置函数的应用。同时对比了正则表达式的使用,包括regexp和rlike关键字,展示了如何利用正则表达式进行更灵活的匹配。

一、MySQL通配符模糊查询(%,_)

1.1.通配符的分类

1.“%”百分号通配符:表示任何字符出现任意次数(可以是0次)

2.“_”下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然也可以like "张__",多个"_",数量不限。

3.like操作符:LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较;但如果like后面没出现通配符,则在SQL执行优化时将like默认为"="执行

1.2.通配符的使用

1.“%”通配符

--模糊匹配含有“嵩”字的数据

select * from table where name like '%嵩%';

--模糊匹配以“嵩”字结尾的数据

select * from table where name like '%嵩';

--模糊匹配以“嵩”字开头的数据

select * from table where name like '嵩%';

--模糊匹配含有“xxx网xxx车xxx”的数据,如“滴滴网约车司机端,网络约车平台”

select * from table where name like '%网%车%';

2.“_”通配符

--查询以“网”为结尾的,长度为三个字的数据,如:“链家网”

select * from app_info where appname like '__网'

注意:'%__网、__%网'等同于'%网'

--查询前三个字符为xx网,后面任意匹配,如:“城通网盘、模具网平台”

select * from app_info where appname like '__网%';

--模糊匹配含义“xx网x车xxx”的数据,如:“携程网约车客户端”

select * from app_info where appname like '__网_车%';

注意:%通配符可以匹配任意字符,但是不能匹配NULL,也就是说SELECT * FROM blog where title_name like '%';是匹配不到title_name为NULL的的记录。

1.3.技巧与建议

MySQL的通配符很有用,但是这种功能是有代价的:通配符搜索的处理一般要比其他搜索所花时间更长,消耗更多的内存等资源。

  • 不要过度使用通配符,如果其他操作符能达到相同的目的,应该使用其他操作符
  • 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。因为MySQL在where后面的执行顺序是从左往右执行的,如果把通配符置于搜索模式的开始处,搜索起来是最慢的(因为要对全库进行扫描)
  • 仔细注意通配符的位置,如果放错位置,可能不会返回想要的数据。

1.4.数据中的“%”、“_”等符合和通配符冲突

使用escape关键字进行转义

如下:escape后面跟着一个字符,里面写着什么,MySQL就把那个符号当做转义符,一般就写成“/”;然后就像c语言中转义字符一样,例如'\n','\t',把这个字符写在需要转义的那个%号前就可以了

SELECT * from app_info where appName LIKE '%/_%' ESCAPE '/'; 

二、MySQL内置函数检索(locate,position,instr)

通过内置函数locate,position,instr进行匹配,相当于Java中的str.contains()方法,返回的是匹配内容在字符串中的位置,效率和可用性上都优于通配符匹配。

SELECT * from app_info where INSTR(`appName`, '%') > 0;
 
SELECT * from app_info where LOCATE('%', `appName`) > 0;
 
SELECT * from app_info where POSITION( '%' IN `appName`) > 0;

如上,三种内置函数默认都是:>0,所以下列>0可加可不加,加上可读性更好

注意:MySQL中的角标从左往右是从1开始的,不像java最左边第一位角标是0,因此在MySQL中角标为0时说明不存在。

2.1.locate()函数</

MySQL 模糊查询可借助通配符(如`%`和`_`)与`LIKE`操作符来实现。以下为使用方法与示例: ### 通配符分类 - **`%`百分号通配符**:表示任何字符出现任意次数(可以是 0 次)。 - **`_`下划线通配符**:表示只能匹配单个字符,不能多也不能少,就是一个字符,当然,也可以`like “陈____”`,数量不限。 - **`LIKE`操作符**:作用是指示 MySQL 后面的搜索模式是利用通配符而不是直接相等匹配进行比较;但如果`like`后面没出现通配符,则在 SQL 执行优化时将`like`默认为 “=” 执行 [^3]。 ### 示例 #### 通配符模糊查询 - 查找以 “张” 开头的用户: ```sql SELECT * FROM users WHERE name LIKE '张%'; ``` - 查找包含 “.com” 的邮箱: ```sql SELECT * FROM users WHERE LOWER(email) LIKE '%.com'; ``` - 查找 “陈” 姓且名字为 4 个字符的用户: ```sql SELECT * FROM users WHERE name LIKE '陈____'; ``` #### 区分大小写的模糊查询 MySQL 默认不区分大小写(取决于字符集设置),若需强制区分,可使用`BINARY`关键字: ```sql -- 区分大小写的模糊查询 SELECT * FROM users WHERE name LIKE BINARY '张%'; ``` ### Python 中使用 MySQL 进行模糊查询 #### 安装库 可使用`pymysql`或`mysql-connector-python`库连接 MySQL 数据库并执行查询。以下是安装示例: ```bash # 安装 pymysql pip install pymysql # 安装 mysql-connector-python pip install mysql-connector-python ``` #### Python 代码示例(使用`mysql-connector-python`) ```python import mysql.connector # 数据库连接配置 config = { 'host': 'localhost', 'user': 'your_username', 'password': 'your_password', 'database': 'your_database' } # 连接数据库 cnx = mysql.connector.connect(**config) try: cursor = cnx.cursor(dictionary=True) # 使用字典游标以便获取结果作为字典 # 编写 SQL 查询语句,使用 LIKE 进行模糊查询 # 假设我们有一个名为 "articles" 的表,其中有一个 "content" 字段,我们想要查询包含 "Python" 关键字的文章 query = ("SELECT * FROM articles WHERE content LIKE %s") search_term = '%Python%' # LIKE 查询中,% 是通配符 # 注意:mysql-connector-python 中的参数化查询需要确保 % 是查询字符串的一部分 # 因此我们直接构造完整的 LIKE 表达式字符串 cursor.execute(query, (search_term,)) # 获取所有查询结果 results = cursor.fetchall() # 处理查询结果 for row in results: print(f"ID: {row['id']}, Title: {row['title']}, Content: {row['content'][:50]}...") # 只打印内容的前 50 个字符作为示例 finally: # 关闭游标和连接 if cursor: cursor.close() if cnx.is_connected(): cnx.close() ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值