likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 84

扎实的编程基础,是你走向大佬的途径。 ——安前码后 :::

前言

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;

执行结果如下:

MySQL这几个函数用法,你必须掌握 可以看到,使用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;

MySQL这几个函数用法,你必须掌握 如果你还想返回毫秒,可以使用now(3),例如:

select now(3) from brand limit 1;

MySQL这几个函数用法,你必须掌握 方便吧


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 where  not 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查看

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

从执行结果中,我们可以查看当前的连接状态,帮助识别出有问题的查询语句。

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

写在最后

又到了结束的时候,还是唠嗑一下,新技术有很多,实际用到的也就那些,但是扎实的基础就是你成为大佬的资本。与其看很多新技术,不如沉下心来,每天给自己一点思考的空间。不用怀疑,时间会证明你是对的。


如果能感受到用心整理,帮忙给个三连,欢迎持续关注"安前码后"公众号,一个专注分享使用干货的号。

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

转载自:https://juejin.cn/post/7222237243527921701
评论
请登录