谈谈mysql locate函数

mysql 专栏收录该内容
1 篇文章 0 订阅

大家都知道,当我们mysql需要使用模糊查询的时候,往往会使用like去做相关查询条件的模糊匹配,但是很多场景下,使用locate会获取同样的效果

create table user(
	id int primary key auto_increment,
	name varchar(18),
	description varchar(255)
) charset=UTF8;

select * from user order by id;

在这里插入图片描述
测试环境插入如上数据:
场景1,我么需要查询所有名字中含有 王 的所有数据,用like很简单

select * from user where name like '%王%' order by id;

那么使用locate如何去实现呢,首先我们先看看locate的用法,如下为官方给出的该函数的详细使用说明
在这里插入图片描述
意思也比较简单

LOCATE(substr,str)
LOCATE(substr,str,pos)

1,从str的起始位置开始匹配str中的substr串,如果匹配上,返回下标,如果没有匹配上,返回0,如果substr或者str为null的时候,返回null
2,表示从下标为pos(int值)处开始匹配

使用locate实现上述效果:

select * from user where locate('王',name)

在这里插入图片描述

但是如果我现在需求是找出所有名字中含有王,但是不姓王的人找出来,使用like就不太好实现了,但是使用locate就很容易实现,我们用下面那种实现方式如下

select * from user where locate('王',name,2)

在这里插入图片描述
我们从第2个字符串开始匹配,就很把所有姓王的给过滤掉了

关于locate的用法如上,结合具体的业务,配合合理的数据库设计,可以很容易避开复杂的like查询。

问题:但是有一种说法是在同样数据量情况下,使用locate查询比使用like效率要高,但是查看语句的执行计划,二者是一模一样的,不明白是为什么,官方也没找到相关说明,还望知道的大神可以留言一起交流一波!

  • 3
    点赞
  • 3
    评论
  • 11
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 3 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

baomw

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值