Mysql模糊查询

Mysql模糊查询

      • 一、like
      • 二、REGEXP正则表达式
      • 三、 LOCATE('substr',str,pos)方法
      • 四、POSITION('substr' IN \`field \`)方法
      • 五、INSTR(\`str`,'substr')方法
      • 六、FIND_IN_SET(str1,str2):

一、like

#一般模糊查询语句如下:
SELECT 字段 FROMWHERE 某个字段 LIKE 条件

其中关于条件,SQL提供了四种匹配模式:

  1. % :表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
    例:
SQL语句中
 # 将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。
 SELECT * FROM [user] WHERE u_name LIKE '%三%'
 # 需要找出u_name中既有“三”又有“猫”的记录,请使用and条件
 SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'
# 虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。
 SELECT * FROM [user] WHERE u_name LIKE '%三%猫%'

在Java开发中,查询条件往往是作为参数传递过来的,所以既要使用concat()函数,concat()函数的作用为连接字符串。
select * from user where u_name like concat('%', #{name}, '%')      
或者
 select * from user e
 <where>
 <if test="queryDTO.name!= null and queryDTO.name!= ''">
     <bind name="likeName" value=" '%' + queryDTO.name +'%' "></bind>
      AND e.name like #{likeName}
 </if>
 </where>
  1. _ : 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:
# 只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;、
SELECT * FROM [user] WHERE u_name LIKE '_三_'
# 只找出“三脚猫”这样name为三个字且第一个字是“三”的;
SELECT * FROM [user] WHERE u_name LIKE '三__';
  1. [ ] :表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
#将找出“张三”、“李三”、“王三”(而不是“张李王三”)
SELECT * FROM [user] WHERE u_name LIKE '[张李王]三'

#如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
#将找出“老1”、“老2”、……、“老9”;
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
  1. [^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
#将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
SELECT * FROM [user] WHERE u_name LIKE '[^张李王]三'

# 将排除“老1”到“老4”,寻找“老5”、“老6”、……
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
  1. 查询内容包含通配符时
    由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:
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]《'》是要有单引号的,别忘了,我经常忘!


SQL模糊查询,使用like比较关键字,加上SQL里的通配符,请参考以下:
1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
4、LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
5、LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
7、LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。


二、REGEXP正则表达式

如果要区分大小写,应该使用BINARY关键字,如where xxx REGEXP BINARY ‘Hello.000’

SELECT column_list FROM table_name WHERE string_column REGEXP pattern

下表说明了正则表达式中一些常用的元字符和构造。

通配符 说明
^ 匹配搜索字符串开头处的位置,定位字符串开始的地方,该符号不匹配字符
$ 匹配搜索字符串末尾的位置,定位字符串结束的地方,该符号不匹配字符
\b 定位字符串边界的地方,该符号不匹配字符
\B 定位字符串非边界的地方,该符号不匹配字符,和\b正好相反
. 匹配任何单个字符
[…] 匹配方括号内的任何字符
[^…] 匹配方括号内未指定的任何字符
匹配p1或p2模式 匹配p1或p2模式
* 匹配前面的字符零次或多次
+ 匹配前一个字符一次或多次
{n} 匹配前几个字符的n个实例 , 作用对象重复n次
{m,n} 从m到n个前一个字符的实例匹配,作用对象重复至少m次,至多n次
{m,} 作用对象重复至少m次
[aA@] 匹配”a”或”A”或”@”其中的一个字符
[^aA@] 匹配除”a”,”A”,”@”之外的一个字符
[f-k] 匹配英文字母”f”到”k”中的一个字符
[^f-k] 匹配非除英文字母”f”到”k”之外的一个字符
[f-k0-5] 匹配英文字母”f”到”k”或数字”0″到”5″中的一个字符
[^f-k0-5] 匹配除英文字母”f”到”k”和数字”0″到”5″之外的一个字符
[f-k178] 匹配”f”到”k”或”1″或”7″或”8″中的一个字符
\s 匹配一个空白字符,包括空格,制表符,换页符
\S 匹配一个非空白字符,和\s正好相反
\d 匹配一个数字字符(0~9)
\D 匹配一个非数字字符,和\d正好相反
\w 匹配一个字母或数字或下划线字符
\W 匹配一个非字母、数字、下划线字符,和\w正好相反

正则表达式中需要转义的字符

^
$
.
(
)
[
]
{
}
?
+
*
|
\
/

换行符(\n),
回车符(\r),
制表符(\t)

三、 LOCATE(‘substr’,str,pos)方法

返回 substr 在 str 中第一次出现的位置,如果 substr 在 str 中不存在,返回值为 0 。如果pos存在,返回 substr 在 str 第pos个位置后第一次出现的位置,如果 substr 在 str 中不存在,返回值为0。

SELECT LOCATE('xbar',`foobar`);        ###返回0 

四、POSITION(‘substr’ IN `field `)方法

position可以看做是locate的别名,功能跟locate一样

五、INSTR(`str`,‘substr’)方法

SELECT `column` FROM `table` WHERE INSTR(`field`, 'keyword' )>0  

六、FIND_IN_SET(str1,str2):

返回str2中str1所在的位置索引,其中str2必须以","分割开。(字段内容必须以“,”隔开才能匹配)

SELECT * FROM `person` WHERE FIND_IN_SET('apply',`name`);

你可能感兴趣的:(java-ee)