,,MySQL模糊查询用法大全(正则、通配符、内置函数)

,,MySQL模糊查询用法大全(正则、通配符、内置函数)

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 使用php连接mysql数据库,php连接数据库的方法
  • 使用php连接mysql数据库,php连接数据库的方法,一文详解PHP连接MySQL数据库的三种方式
  • pymysql菜鸟教程,pymysql 使用
  • pymysql菜鸟教程,pymysql 使用,pymysql模块使用简介与示例
  • mysql锁实现,mysql锁算法
  • mysql锁实现,mysql锁算法,MySQL锁机制与用法分析
  • mysql连接报错10061,mysql连接错误10060
  • mysql连接报错10061,mysql连接错误10060,MYSQL无法连接 提示10055错误的解决方法
  • mysql连接报10060错误,mysql连接报错10055
  • mysql连接报10060错误,mysql连接报错10055,MySQL连接异常报10061错误问题解决
  • mysql辅助索引和主键索引,mysql 主键 外键 索引
  • mysql辅助索引和主键索引,mysql 主键 外键 索引,MySQL索引之主键索引
  • MySQL语句大全,mysql常见语句总结
  • MySQL语句大全,mysql常见语句总结,MySQL语句整理及汇总介绍
  • mysql触发器的使用方法实验报告,mysql中触发器的使用
  • 留言与评论(共有 条评论)
       
    验证码: