关于sql中like操作符的使用及效率优化问题整理
LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
基本语法
一:% 表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示
1.从上面的 “Persons” 表中选取居住在以 “N” 开始的城市里的人:
SELECT * FROM Persons WHERE City LIKE ‘N%’
2.从 “Persons” 表中选取居住在以 “g” 结尾的城市里的人:
SELECT * FROM Persons WHERE City LIKE ‘%g’
3.从 “Persons” 表中选取居住在包含 “lon” 的城市里的人:
SELECT * FROM Persons WHERE City LIKE ‘%lon%’
4.从 “Persons” 表中选取居住在不包含 “lon” 的城市里的人:
SELECT * FROM Persons WHERE City NOT LIKE ‘%lon%’
二 :_ 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:
例如 SELECT * FROM [user] WHERE u_name LIKE ‘三’
只找出“唐三藏”,这样u_name为三个字且中间一个字是“三”的;
三:[ ] 表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
例如 SELECT * FROM [user] WHERE u_name LIKE ‘[张李王]三’
将找出“张三”、“李三”、“王三”(而不是“张李王三”);
四:[^ ] 表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
例如 SELECT * FROM [user] WHERE u_name LIKE ‘[^张李王]三’
将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
五、查询内容包含通配符时
- 表示查找的是所有信息,例如select * from tbl_user
由于通配符的缘故,导致我们查询特殊字符“%”、“”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:
function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最前
str=replace(str,"","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function
备注:
在查询前将待查字符串先经该函数处理即可,并且在网页上连接数据库用到这类的查询语句时侯要注意:
例如 Select * FROM user Where name LIKE ‘老[^1-4]’
上面 《’》老[^1-4]《’》是要有单引号的!
优化
SELECT * FROM
component_dataWHERE creation_date LIKE ‘2012%’;(索引起作用)
优于
SELECT * FROM
component_dataWHERE creation_date LIKE ‘%2012%’;(索引不起作用)
instr()和like
函数的格式 (俗称:字符查找函数)
格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串)
select instr(‘helloworld’,‘lo’) from dual; --返回结果:4 即:在“lo”中,“l”开始出现的位置
格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] ) / instr(源字符串, 目标字符串, 起始位置, 匹配序号)
解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
select instr(‘helloworld’,‘l’,3,2) from dual; --返回结果:4 也就是说:在"helloworld"的第3(l)号位置开始,查找第二次出现的“l”的位置
select id, name from users where instr(id, ‘101’) > 0;
效果等价于
select id, name from users where id like ‘%101%’
效率
select * from gt_alarm where alarm_date like ‘%2016/4/3%’; --11s
select * from gt_alarm where instr(alarm_date,‘2016/4/3’)>0; --9s
时间上的差异很明显,INSTR在一瞬间执行完成,因为这个是查找的字段,而非走全表扫描,看来,oracle 内部函数效率还是高些。
- 关于数据库优化2——关于表的连接顺序,和where子句的前后顺序,是否会影响到sql的执行效率问题
- sql 中使用like时,关于转义符的问题
- sql 中使用like时,关于转义符的问题
- 关于SQL语句中左联操作符的问题 推荐
- DataView.RowFilter的使用(包括in,like等SQL中的操作符)
- 关于C#中用access做数据库,使用like语句的问题
- 关于统计的一个sql问题,使用动态sql语句实现。
- 关于Qt使用SQL模型类数据修改后不能写入数据库的问题
- Mysql 优化——分析表读写和sql效率问题
- asp.net SqlParameter关于Like的传参数无效问题
- 关于oracle sql优化的一个容易忽略的问题。
- 使用智能指针优化C++类对象深度复制效率问题
- 关于oracle的sql语句中 for update 的使用,以及存在的问题
- Mysql 优化——分析表读写和sql效率问题
- 分析Mysql表读写、索引等操作的sql语句效率优化问题
- 关于C#中用access做数据库,使用like语句的问题(转)
- The NOTE of learning ASP.NET [10] 关于.NET整型与浮点型变量使用上的效率和存储问题
- 关于SQL执行效率的优化
- Oracle模糊查询之(3.2从使用函数和sql语法角度来提高模糊查询效率 二)ORACLE中Like与Instr模糊查询性能大比拼
- N-Queens N皇后问题 深搜 关于效率优化(重重)