Oracle 模糊查询like用法

本文详细介绍了在Oracle数据库中如何使用LIKE关键字和通配符进行模糊查询的方法,包括%、_、[]、[^]的使用场景及示例,并对比了使用instr函数进行模糊查询的效率优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、我们可以在where子句中使用like关键字来达到Oracle模糊查询的效果;在Where子句中,可以对datetime、char、varchar字段类型的列用Like关键字配合通配符来实现模糊查询,以下是可使用的通配符: 
(1)% :零或者多个字符,使用%有三种情况 
字段 like ‘%关键字%’字段包含”关键字”的记录 
字段 like ‘关键字%’字段以”关键字”开始的记录 
字段 like ‘%关键字’字段以”关键字”结束的记录 
例子: 
SELECT * FROM [user] WHERE uname LIKE ‘%三%’ 
搜索结果:“张三”,“小三”、“三脚猫”,“猫三脚” 有“三” 的记录全找出来。 
SELECT * FROM [user] WHERE uname LIKE ‘%三’ (从后开始匹配) 
搜索结果:“张三”,“小三” 
另外,如果需要找出uname中既有“三”又有“猫”的记录,请使用and条件 
SELECT *FROM [user] WHERE uname LIKE ‘%三%’ AND uname LIKE ‘%猫%’ 
若使用SELECT * FROM [user] WHERE uname LIKE ‘%三%猫%’,虽然能搜索出“三脚猫”,但不能搜索出“猫三脚”。

(2)_: 单一任何字符(下划线)常用来限制表达式的字符长度语句: 
例子: 
SELECT * FROM [user] WHERE uname LIKE ‘三’ 
搜索结果:“猫三脚”这样uname为三个字符且中间一个是“三”的; 
SELECT * FROM [user] WHERE uname LIKE ‘三__’; 
搜索结果:“三脚猫”这样uname为三个字符且第一个是“三”的;

(3)[]:在某一范围内的字符,表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 
例子: 
SELECT * FROM [user] WHERE u_name LIKE ‘[张李王]三’ 
搜索结果:“张三”、“李三”、“王三”(而不是“张李王三”); 
如 [ ]内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e” 
SELECT * FROM [user] WHERE u_name LIKE ‘老[1-9]’ 
搜索结果:“老1”、“老2”、……、“老9”;

(4)[^]: 不在某范围内的字符,用法与[ ]相反。

二、在Oracle中提供了instr(strSource,strTarget)函数,比使用’%关键字%’的模式效率高很多。

instr函数也有三种情况: 
instr(字段,’关键字’)>0相当于 字段like ‘%关键字%’ 
instr(字段,’关键字’)=1相当于 字段like ‘关键字%’ 
instr(字段,’关键字’)=0相当于 字段not like ‘%关键字%’ 
例子: 
SELECT * FROM [user] WHEREinstr(uname ,’三’)>0 
用法参照上面的Like 即可

特殊用法: 
select id, namefrom user where instr(‘101914, 104703’, id) > 0; 
它等价于 
select id, namefrom user where id = 101914 or id = 104703;

<think>好的,我现在需要帮助用户了解MySQL中模糊查询用法,特别是LIKE语法和相关示例。根据用户提供的引用内容,我需要整理这些信息,并结合之前的回答结构来组织内容。 首先,用户提到了几个引用,其中引用[1]和[2]主要关于LIKE子句的基本语法和示例,而引用[3]和[5]提到了正则表达式和全文搜索作为替代方法。引用[4]涉及了连接查询,但用户当前的问题是关于模糊查询,所以可能需要暂时忽略这部分,除非有相关联系。 用户的上一次问题涉及C#前端的数据展示和下载,可能与数据库查询有关联,但当前问题集中在MySQL的模糊查询上,因此需要专注于这部分内容。需要确保回答结构清晰,分步骤说明,并包含示例代码,同时比较不同方法的优缺点。 接下来,我需要组织内容: 1. **LIKE子句基础**:说明基本语法,使用%和_通配符,给出简单示例,如查找包含特定字符的数据。注意转义字符的使用,如引用[2]中的例子可能需要提及。 2. **正则表达式查询**:根据引用[3],介绍REGEXP操作符,提供正则表达式的示例,如查找以某个词开头或结尾的记录,比较LIKE和正则表达式的区别。 3. **全文搜索**:引用[3]和[5]提到MATCH和AGAINST的使用,需要解释全文索引的优势,比如性能更好,支持自然语言查询,但需要创建全文索引。给出示例,并说明布尔模式的使用。 4. **性能对比与选择建议**:比较三种方法的优缺点,如LIKE简单但性能差,正则灵活但复杂,全文搜索高效但需要索引。根据用户的需求场景推荐合适的方法,比如数据量大时使用全文搜索。 5. **相关问题生成**:参考用户之前的问题,生成相关问题,如优化模糊查询性能、特殊字符处理、全文索引创建等。 需要注意引用来源,在回答中适当标注引用标识,如[^1]、[^2]、[^3]等,确保用户知道信息出处。同时,保持回答结构清晰,分点说明,代码示例用正确的格式,并标注注意事项,如通配符的位置影响性能,索引的使用条件等。 最后,检查是否有遗漏,比如用户是否可能需要知道如何在实际项目中应用这些查询,或者与其他SQL语句(如JOIN)结合使用,但根据当前问题,可能不需要深入,除非有直接关联。保持回答紧扣主题,覆盖用户的需求点。</think>以下关于MySQL模糊查询的总结整合了引用资料的核心要点,并结合实际应用场景提供完整解决方案: ### 一、LIKE子句基础用法 #### 1. 基础语法结构 ```sql SELECT {列名} FROM {表名} WHERE {字段} LIKE {匹配模式}; ``` 通配符说明: - `%`:匹配任意长度字符(含空字符) 示例:`SELECT * FROM products WHERE name LIKE '%手机%'`(查找名称含"手机"的记录)[^2] - `_`:匹配单个字符 示例:`SELECT * FROM users WHERE phone LIKE '138____8888'`(匹配138开头、8888结尾的11位号码) #### 2. 转义特殊字符 ```sql SELECT * FROM docs WHERE content LIKE '%100\%%' ESCAPE '\'; ``` 此语句匹配包含`100%`的内容(`ESCAPE`指定转义符)[^1] ### 二、进阶查询方案 #### 1. 正则表达式查询(REGEXP) ```sql SELECT * FROM articles WHERE title REGEXP '^[0-9]{4}年度报告$'; ``` 匹配以4位数字开头且以"年度报告"结尾的标题[^3] #### 2. 全文搜索(FULLTEXT) ```sql -- 创建全文索引 ALTER TABLE articles ADD FULLTEXT(title, content); -- 自然语言模式查询 SELECT * FROM articles WHERE MATCH(title, content) AGAINST('数据库优化' IN NATURAL LANGUAGE MODE); -- 布尔模式高级查询 SELECT * FROM articles WHERE MATCH(title, content) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE); ``` 布尔模式支持操作符: - `+` 必须包含 - `-` 必须排除 - `"短语搜索"`[^5] ### 三、性能对比与方案选择 | 方法 | 响应速度 | 匹配精度 | 适用场景 | 索引要求 | |---------------|----------|----------|-----------------------------------|------------------| | LIKE | 慢 | 低 | 简单模式匹配 | 无法使用B树索引 | | REGEXP | 最慢 | 高 | 复杂模式匹配 | 无优化 | | FULLTEXT | 快 | 高 | 文本内容搜索(支持分词) | 需创建全文索引 | ### 四、实战建议 1. **查询优化**: - LIKE左模糊(`LIKE '%xxx'`)会导致全表扫描,建议结合`LIMIT`分页[^1] ```sql SELECT * FROM logs WHERE message LIKE '%error%' LIMIT 100 OFFSET 0; ``` - 全文搜索默认忽略50%以上文档出现的常见词,可通过`ft_stopword_file`配置停用词 2. **混合使用示例**: ```sql SELECT a.title, b.category FROM articles a JOIN categories b ON a.cat_id = b.id WHERE MATCH(a.content) AGAINST('性能优化') AND b.name LIKE '%技术%' ORDER BY a.publish_time DESC; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值