本文主要介绍MySQL模糊查询用法百科(正则、通配符、内置函数),通过示例代码介绍的非常详细,对大家的学习或工作有一定的参考价值。下面让我们跟随边肖一起学习。
目录
一、MySQL通配符模糊查询(%),_)1-1。通配符的分类1-2。通配符的使用1-3。提示和建议:二。MySQL内置函数检索(locate,position,Instr)2-1。定位()函数2-2。POSITION()方法2-3。INSTR()方法3。基于regexp和rlike 3-1的MySQL正则匹配查询。或者:| 3-2。正则表达式。正则表达式中的正则匹配:[]3-3。字符分类匹配(POSIX)
从表中选择*其中用户名如“%陈哈哈%”,爱好如“%牛逼”
这是MySQL中常用的模糊查询方法,通过通配符%进行匹配。其实这只是冰山一角。MySQL中支持模糊匹配的方法有很多,各有各的优势。好了,今天就让我带你撩起MySQL的小裙子,看看模糊查询下隐藏了多少鲜为人知的好东西。
一、MySQL通配符模糊查询(%,_)
1-1. 通配符的分类
% '通配符百分比:表示任何字符出现任意次(可以是0次)。
_ '下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然也可以像‘陈_ _ _ _’一样,数量不限。
like运算符:LIKE用于表示mysql背后的搜索模式采用通配符进行比较,而不是直接相等匹配;但是,如果like后面没有通配符,那么在SQL优化时,like将默认执行为“=”。
注意: 如果在使用like操作符时,后面没有使用通用匹配符(%或_),那么效果是和“=”一致的。SQL优化时,查询优化器默认会像“=”一样执行,选择* from movies其中movie _ name像‘唐伯虎’;只能匹配movie_name="唐伯虎"的结果,不能匹配"唐伯虎点燃秋香"或"唐伯虎点燃香烟"这样的结果。
1-2. 通配符的使用
1)%通配符:
-包含单词“net”的数据的模糊匹配
Select * from app _ info其中appname类似于“% net %”;
-以单词“net”结尾的数据的模糊匹配
Select * from app _ info其中appname类似于“% net”;
-以单词“net”开头的数据的模糊匹配
Select * from app _ info其中appname类似于“net %”;
-精确匹配,appName like' net '等价于:appName=' net '
Select * from app _ info其中app name=' net
-相当于
Select * from app _ info其中appname类似于“net”;
-包含“xxx网约车xxx”的模糊匹配数据,如:‘图图网约车司机,网约车平台’
Select * from app _ info其中appname类似于“% net % car %”;
2) _通配符:
-查询以“net”结尾且长度为三个字的数据,如‘lianjia . com’,
select * from app _ info where appname like ' _ _ net ';
注意:'%__网、__%网' 等同于 '%网'
-查询的前三个字符是XX网,后面的字符可以任意匹配,如:'诚通网盘,模具网平台'
select * from app _ info where appname like ' _ _ net % ';
-包含“xx网X车xxx”的模糊匹配数据,如:‘携程网约车客户端’
Select * from app _ info其中应用名称如“_ _ net _ car %”;
注意事项:
注意大小写。使用模糊匹配时,即匹配文本时,MySQL默认配置是不区分大小写的。使用别人的MySQL数据库时,要注意是否区分大小写。是否区分大小写取决于用户如何配置MySQL。如果是区分大小写的,像Test12这样的记录就不能通过类似“test__”这样的匹配条件来匹配。
注意尾随空格。“%test”无法匹配类似“test”的记录。
注意空;%通配符可以匹配任何字符;但它不能匹配null也就是;select * from blog,其中title _ name类似“%”;是title_name为NULL的记录。
1-3. 技巧与建议:
如您所见,MySQL的通配符非常有用。但是这个功能是有价格的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长,消耗更多的内存等资源。这里给出一些使用通配符要记住的技巧。
不要过度使用通配符。如果其他运算符可以达到相同的目的,则应使用其他运算符。
在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。因为MySQL在where后面的执行顺序是从左往右执行的,如果把通配符置于搜索模式的开始处(最左侧),搜索起来是最慢的(因为要对全库进行扫描)。
请仔细注意通配符的位置。如果放错了位置,所需的数据可能无法返回。
细心的朋友会发现,如果数据中有“%”和“_”这样的符号,难道不会和通配符冲突吗?
SELECT * from app_info其中appName LIKE“% % %”;
SELECT * from app _ info where appName LIKE“% _ %”;
的确,上面两条SQL语句查询的是整个表的数据,而不是用“%”和“_”指定的数据。这里需要加ESCAPE关键字进行转义。
如下,ESCAPE后面跟一个字符,MySQL把那个符号作为转义字符。一般我写为'/';然后就像C语言中的转义字符如' \ n ',' \ t ',只需在需要转义的%符号前写这个字符即可;
SELECT * from app _ info where appName LIKE ' %/_ % ' ESCAPE '/';
但是这种情况有更高端的解决方案吗?能让查你代码的同事或者领导对你刮目相看的那种~ ~
当然,我们来看看MySQL的第二种模糊匹配——内置函数查询。
二、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(' ` appname ` '中的' % ')0;
如上,三个内置函数的默认值都是:0,所以后面的0可以加也可以不加,可读性更好。
好了,我们来看看这三个内置函数的用法。
明确一下,MySQL中的角标从左到右是从1开始的,不像java最左边的角标是0。所以在MySQL中,当角标为0时,表示不存在。
2-1. LOCATE()函数
语法:LOCATE(substr,str)
返回str中第一个出现的substr。如果str中不存在substr,返回值为0;如果str中确实存在substr,则返回值为:str中substr的第一个出现位置。
注意:LOCATE(substr,str)与 POSITION(substr IN str)是同义词,功能相同。
语法:LOCATE(substr, str, [pos])
从位置pos开始,substr在字符串str中第一次出现的位置。如果substr不在str中,则返回0。如果substr或str为NULL,则返回NULL。
选择定位(' a ','香蕉');- 2
选择locate('a ',' banana ',3);- 4
选择定位(' z ','香蕉');- 0
选择定位(10,'香蕉');- 0
选择locate(NULL,' banana ');-空
选择locate('a ',NULL);-空
实例:
-使用LOCATE关键字的模糊匹配等效于:“like“% net %”
SELECT * from app _ info where LOCATE(' net ',appname `)0;
-使用LOCATE关键字进行模糊匹配,从第二个字符开始匹配' net ',那么'网易云游戏,网商'等数据就会被过滤掉。
SELECT * from app _ info where LOCATE(' net ',appName `,2)0;
2-2. POSITION()方法
语法:POSITION(substrIN substr)
这个方法可以理解为locate(substr,str)方法的别名,因为它与locate(substr,str)方法具有相同的功能。
实例:
-使用位置关键字进行模糊匹配,相当于:“like“% net %”
select * from app _ info where position(` appname `中的' net ');
2-3. INSTR()方法
语法:INSTR(str,substr)
返回字符串str中第一次出现子字符串substr的位置。INSTR()与LOCATE()的双参数形式相同,只是参数的顺序相反。
实例:
-用INSTR关键字进行模糊匹配与like的作用相同,相当于:' like '% net% ' '
select * from app _ info where instr(` appname ',' net ');
instr函数通常用于检索字符串中某个字符的位置,相当于:“like“% net %”
Select * from app _ info其中instr (`appname ',' net ')0;
三、MySQL基于regexp、rlike的正则匹配查询
MySQL中的regexp和rlike关键字属于同义词,功能相同。本文以regexp为准。
REGEXP 不支持通配符"%、_",支持正则匹配规则是更精细更优雅的搭配方式。让我们看一看。
-以下是regexp包含的参数类型。
参数类型
功能
(^)
匹配字符串的起始位置,如“A”表示以字母A开头的字符串。
($)
匹配字符串的结束位置,如“X”表示以字母X结尾的字符串。
(.)
这个字符就是英文下面的点,它匹配任何字符,包括回车、换行符等。
(*)
星号匹配0个或多个字符,并且其前面必须有内容。例如,select * from table where name regexp ' b a* '(您可以点击“baaa”)
( )
加号匹配一个或多个字符,它前面必须有内容。加号的用法与星号类似,只是星号允许出现0次,加号必须至少出现一次。
(?)
匹配问号0或1次。
{n}
匹配
{n,}
匹配不少于n
{n,m}
N-m匹配
-REGEXP“net”相当于like“% net %”
select * from app _ info where app name regexp ' net ';
-相当于
Select * from app _ info其中appname类似于“% net %”;
3-1. regexp中的 OR : |
功能:可以搜索多个字符串中的一个,相当于or。
-支持' | '或'符号,匹配包含“中国”或“互联网”或“大学”的数据,支持多个叠加。
select * from app _ info where app name regexp '中国|互联网|大学';
-同时匹配“China”和“Net”的数据可以用“.”连接,代表xxxx网在中国。中间允许有任何字符,顺序不能颠倒。
select * from app _ info where app name regexp ' China . com ';
3-2. REGEXP中的正则匹配: []
函数:匹配[]符号中的几个字符之一,支持解析正则表达式。
-匹配包含英文字符的数据,默认情况下不区分大小写。
SELECT * from app _ info where appName REGEXP“[a-z]”;
-就像like一样,取逆集加' not REGEXP ',这里不再赘述。
SELECT * from app _ info where appName not REGEXP“[a-z]”;
-匹配包含大写英文字符的数据,默认忽略大小写,需要加上"BINARY"关键字。例如appName REGEXP二进制文件“Hello”
-关于区分大小写:MySQL(从3.23.4版开始)中的正则表达式匹配不区分大小写。
SELECT * from app _ info where appName REGEXP BINARY“[A-Z]”;
-匹配包含数字的数据。
SELECT * from app _ info where appName REGEXP“[0-9]”;
-匹配包含数字或英语的数据,
SELECT * from app _ info where appName REGEXP '[a-z0-9]';
a-z、0-9都认定为一个单位,不要加多余符号,前两天发现一个特例。这是一个非常有趣的错误。让我们分享给他的家人。
-在写查询语句之前,我加了“|”符号,以为是'或',也没在意,但万万没想到找到的数字不一样。
SELECT * from app _ info where appName REGEXP '[567]';-87篇文章
SELECT * from app _ info where appName REGEXP“[5 | 6 | 7]”;-88篇文章
迷茫,赶紧看看到底是哪个的区别。
-原来的“|”符号也参与了匹配,被识别为一个单位。无独有偶,有一个数据:“无线调音台|无线调音台”正好匹配。我和一个DJ上床了。
SELECT * from app _ info where appName REGEXP '[5 | 6 | 7]' and PID not in(SELECT PID from app _ info where appName REGEXP '[567]');
-查询从5、6和7之一开始的数据。
select * from app _ info where appname regexp '^[5|6|7]';
-查询以5、6和7之一结尾的数据。
SELECT * from app _ info where appName REGEXP '[5 | 6 | 7]$ ';
小贴士:MySQL,UTF-8的中文=3个字节;GBK的中文=2个字节
-用10个字节的appName和任意内容查询数据。
select * from app _ info where appname regexp '^.{10}$';
-查询appName字节长度为10且全部为英文的数据。
select * from app _ info where appname regexp '^[a-z]{10}$';
-查询appName字节长度为10的数据,都是大写英文,加二进制。
select * from app _ info where appname regexp binary '^[a-z]{10}$';
-查询version_name字节长度为6,且全部为数字或'.'的数据
select * from app _ info where version _ name regexp '^[0-9.]{6}$';
-查询version_name字节长度为6,且全部为数字或'.'的数据;第一个要求是1。
select * from app _ info where version _ name regexp '^1[0-9.]{5}$' ;
-查询version_name字节长度为6,且全部为数字或'.'的数据;第一个要求是1,最后一个要求是7。
select * from app _ info where version _ name regexp '^1[0-9.]{4}7$' ;
-查询version_name字节长度为6位以上的数据,全部为数字或'.';第一个要求是1,最后一个要求是7。
select * from app _ info where version _ name regexp '^1[0-9.]{4,}7$' ;
-查询version_name字节长度为6 - 8 位的数据,全部为数字或'.';第一个要求是1,最后一个要求是7。
select * from app _ info where version _ name regexp '^1[0-9.]{4,6}7$' ;
——第一个字不是中文。
select * from app _ info where appname regexp '^[-~]';
——第一个字是中文。
select * from app _ info where appname regexp '^[^-~]';
-查询不包含中文的数据。
select * from app _ info where appname regexp '^([a-z]|[0-9]|[a-z])$ ';
-以5或f开头并包含英语的数据
select * from app _ info where appname regexp binary '^[5f][a-za-z].';
特殊符号匹配,如。需要加\ \(注意是两个斜杠),但如果在[],可以省略:
-名称与匹配.
select * from app _ info where appName regexp ' \ \ . ';
-名称与匹配.
select * from app _ info where appName regexp '[。]';
3-3. 字符类匹配(posix)
mysql中有一些具有特殊含义的符号,可以表示不同类型的匹配:
-匹配名字和数字。
select * from app _ info where appName regexp '[[:digit:]]';
其他此类字符类别包括:
性格类型
功能
[:alnum:]
匹配文字和数字字符。(相当于[A~Za~z0~9])
[:alpha:]
匹配字母字符。(相当于[A~Za~z])
[:空白:]
匹配空格或制表符(与[\ \ t]相同)
[:cntrl:]
匹配字符(ASCII0到37和127)
[:数字:]
匹配十进制数字。(相当于[0-9])
[:图形:]
匹配ASCII代码值范围为33到126的字符。类似于[:print:],但不包括空格字符。
[:打印:]
任何可打印字符
[:下限:]
匹配小写字母,相当于[a-z]
[:上:]
匹配大写字母,相当于[A-Z]
[:空格:]
匹配空白字符(与[\\f\\n\\r\\t\\v]相同)
[:xdighter:]
匹配十六进制数字。相当于[0-9A-Fa-f]
这个角色类需要主外层加一层[]。
3-4. [::]和[::]
上述字符类中有两个特殊字符。这两个是关于位置的,[:]匹配词的开头,[:]匹配词的结尾。它们不同于美元
后者是匹配整体的开头和结尾,前者是匹配一个词的开头和结尾。
-只能整体匹配A开头的,比如abcd。
select * from app _ info where appname regexp '^a';
-可以匹配以A开头的整词,也可以匹配以A开头的中间词,如:dance after。
select * from app _ info where appName regexp '[[:]]a ';
[[:]],[[:]]分别匹配单词开头和结尾的空字符串。这个单词的开头和结尾不是alnum中包含的字符,不能是下划线。
select ' a word a ' REGEXP '[[:]]word[[:]]';-1(表示匹配)
select ' a xword a ' REGEXP '[[:]]word[[:]]';-0(表示不匹配)
选择“工作日夜晚”正则表达式'^(wee|week)(knights|nights)$';-1(表示匹配)
四、总结
好了,这篇文章就到这里。希望这篇文章能帮助你进一步了解MySQL。更多相关MySQL模糊查询内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。