MySQL这几个函数用法,你必须掌握
扎实的编程基础,是你走向大佬的途径。 ——安前码后 :::
前言
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;
执行结果如下:
可以看到,使用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;
如果你还想返回毫秒,可以使用now(3),例如:
select now(3) from brand limit 1;
方便吧
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查看
从执行结果中,我们可以查看当前的连接状态,帮助识别出有问题的查询语句。
- id 线程id
- User 执行sql的账号
- Host 执行sql的数据库的ip和端号
- db 数据库名称
- Command 执行命令,包括:Daemon、Query、Sleep等。
- Time 执行sql所消耗的时间
- State 执行状态
- info 执行信息,里面可能包含sql信息。 如果发现了异常的sql语句,可以直接kill掉,确保数据库不会出现严重的问题。
写在最后
又到了结束的时候,还是唠嗑一下,新技术有很多,实际用到的也就那些,但是扎实的基础就是你成为大佬的资本。与其看很多新技术,不如沉下心来,每天给自己一点思考的空间。不用怀疑,时间会证明你是对的。
如果能感受到用心整理,帮忙给个三连,欢迎持续关注"安前码后"公众号,一个专注分享使用干货的号。
转载自:https://juejin.cn/post/7222237243527921701