十念 发表于 2025-3-10 02:21:59

MySQL这几个函数用法,你必须把握

::: block-1
   踏实的编程基础,是你走向大佬的途径。 ——安前码后
:::
前言

MySQL数据库,信赖在日常的工作中,你肯定跟他打过交道,说实话,数据库基础真的非常重要。万变不离CRUD,你和高手的区别,就是对于性能这一块有没有条件反射般的头脑了,先说一句,好好把握原理,哪怕是点滴积累。以下记录了一下工作中常见并且非常重要的几个用法。
1、replace

作用:字符替换

比如:将字符串中的字符X替换成Y。
update user set name=REPLACE(name,'X','X')
where id=10;
2、locate

作用:查找某个关键字

比如:李四,需要明确知道它在某个字符串中的位置时,可以使用locate函数
select * from user where name like '%李四%'
order by char_length(name) asc, locate('李四',name) asc limit 5,5;
先按长度排序,小的排在前面。如果长度相同,则按关键字从左到右进行排序,越靠左的越排在前面。
3、group_concat

作用:使用group by进行分组

比如想统计出用户表中,名称不同的用户的具体名称是哪些
具体sql如下:
常见头脑
select name from `user` group by name;
如果想把name相同的code拼接在一起,放到另外一列中需要怎么做?
select name,group_concat(code) from `user`
group by name;
执行效果如下:
https://i-blog.csdnimg.cn/blog_migrate/530482f79ad89e361d485041c38b3d63.png
可以看到,使用group_concat函数,可以轻松的把分组后,name相同的数据拼接到一起,组成一个字符串,用逗号分隔。
4、char_length

作用:获取字符串的长度

比如:获取字符长度并且排序的sql如下
select * from brand where name like '%张三%'
order by char_length(name) asc limit 10;
4、now

作用:获取当前的系统时间

select now() from brand limit 1;
https://i-blog.csdnimg.cn/blog_migrate/19f74e58d8f0b0f2a1f39946d58bc236.png
如果你还想返回毫秒,可以使用now(3),例如:
select now(3) from brand limit 1;
https://i-blog.csdnimg.cn/blog_migrate/d28f8fddcc1043f10bfa2ecdbd35586f.png
方便吧
6、insert into … select

对于数据量比较小的插入操作,一般用 insert into tableName values(…)的情势即可处置惩罚,但是对于数据量大的,大概想把一个表数据直接插入到另外一个表结构一模一样的表中,那么用insert into … select绝对是优选之一,像下面这样:
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
select null,code,name,now(3) from `order` where code in ('111','222');
这样就能将order表中的部分数据,非常轻松插入到brand表中。
7、select … for update

MYSQL数据库自带了悲观锁,它是一种排它锁,根据锁的粒度从大到小分为:表锁、间隙锁和行锁。
在我们的现实业务场景中,有些情况并发量不太高,为了保证数据的精确性,使用悲观锁也可以。
比如:用户扣减积分,用户的操作并不集中。但也要思量系统自动赠送积分的并发情况,所以有须要加悲观锁限定一下,防止出现积分加错的情况发生。
这时候就可以使用MYSQL中的select … for update语法了。
begin;
select * from `user` where id=1
for update;

//业务逻辑处理

update `user` set score=score-1 where id=1;
commit;
这样在一个变乱中使用for update锁住一行记录,其他变乱就不能在该变乱提交之前,去更新那一行的数据。
需要注意的是for update前的id条件,必须是表的主键大概唯一索引,否则行锁大概会失效,有大概变成表锁。
温馨提醒:这个在高并发情况下,慎用,这里只是遍及一下这个写法。要根据情况使用。
8、insert into … ignore

作用:对于已经存在的数据,插入的时候忽略,否则轻易产生重复数据
举个例子:在插入1000个品牌之前,需要先根据name,判定一下是否存在。如果存在,则不插入数据。如果不存在,才需要插入数据。如果直接这样插入数据:
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
VALUES (123, '108', '赵六', now(3));
肯定不可,由于brand表的name字段创建了唯一索引,同时该表中已经有一条name等于赵六的数据了。执行之后会直接报错了:
这就需要在插入之前加一下判定。
一般人会通过在sql语句背面拼接not exists语句,也能到达防止出现重复数据的目标,比如:
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
select null,'108', '赵六',now(3)
from dual wherenot exists (select * from `brand` where name='赵六');
可以是可以,但是有没有发现写法冗余了一点,咱是为了慢慢成为别生齿中的大佬的,那就换个写法吧。
INSERT ignore INTO `brand`(`id`, `code`, `name`, `edit_date`)
VALUES (123, '108', '赵六', now(3));
OK,如果brand表中没有name为赵六的数据,则可以直接插入成功。
但如果brand表中已经存在name为赵六的数据了,则该sql语句也能正常执行,并不会报错。由于它会忽略异常,返回的执行效果影响行数为0,它不会重复插入数据。
9、show processlist

有些时候我们线上sql大概数据库出现了问题。比如出现了数据库连接过多问题,大概发现有一条sql语句的执行时间特别长。可以用这个SQL查看

https://i-blog.csdnimg.cn/blog_migrate/7215ab0487208fab8e47a4e5a50c8a9b.png
从执行效果中,我们可以查看当前的连接状态,帮助辨认出有问题的查询语句。


[*]id 线程id
[*]User 执行sql的账号
[*]Host 执行sql的数据库的ip和端号
[*]db 数据库名称
[*]Command 执行命令,包括:Daemon、Query、Sleep等。
[*]Time 执行sql所消耗的时间
[*]State 执行状态
[*]info 执行信息,内里大概包罗sql信息。
如果发现了异常的sql语句,可以直接kill掉,确保数据库不会出现严肃的问题。
写在最后

又到告终束的时候,还是唠嗑一下,新技术有很多,现实用到的也就那些,但是踏实的基础就是你成为大佬的资本。与其看很多新技术,不如沉下心来,天天给自己一点思索的空间。不用怀疑,时间会证实你是对的。
如果能感受到用心整理,帮助给个三连,欢迎一连关注"安前码后"公众号,一个专注分享使用干货的号。
https://i-blog.csdnimg.cn/blog_migrate/2331f7c3053826b4985b8608bf3f9c34.gif

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MySQL这几个函数用法,你必须把握