MySQL-MySQL使用小技巧

本文最后更新于:January 8, 2023 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

group_concat函数

拼接内容。

拼接所有字段

1
select group_concat(xh) from xsxkb;

分组拼接所有内容

找出每个人所有选课的成绩。

1
2
select xh,group_concat(cj) from xsxkb
group by xh;

如下:

char_length函数

获取字符的长度

1
2
3
4
5
select * from brand 
where name like '%lee%'
order by char_length(name)
asc
limit 5;

replace函数

替换字符串中部分内容。

替换

将字符串中的字符A替换成B。

1
2
update brand set name=REPLACE(name,'A','B') 
where id=1;

去掉空格

去掉前后空格

1
2
update brand set name=REPLACE(name,' ','') where name like ' %';
update brand set name=REPLACE(name,' ','') where name like '% ';

插入数据

insert into … select:需要插入的数据来源于另外一张表或者多张表的结果集中。

1
2
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`) 
select null,code,name,now(3) from `order` where code in ('004','005');

insert into … ignore:判断插入数据的唯一键是否存在。如果存在,则不插入数据。如果不存在,才需要插入数据。

1
2
INSERT ignore INTO `brand`(`id`, `code`, `name`, `edit_date`) 
VALUES (123, '108', 'lee', now());

如果brand表中没有id为123的数据,则可以直接插入成功。但如果已经存在了,则该sql语句也能正常执行,并不会报错。因为它会忽略异常,返回的执行结果影响行数为0,它不会重复插入数据。

悲观锁

select … for update:在一个事务中使用for update锁住一行记录,其他事务就不能在该事务提交之前,去更新那一行的数据。

MYSQL数据库自带了悲观锁,它是一种排它锁,根据锁的粒度从大到小分为:表锁间隙锁行锁

1
select * from `user` where id=1 for update;

需要注意的是for update前的id条件,必须是表的主键或者唯一索引,不然行锁可能会失效,有可能变成表锁

查询更新

on duplicate key update:在插入数据之前判断,如果主键或唯一索引不存在,则插入数据。如果主键或唯一索引存在,则执行更新操作。具体需要更新的字段可以指定。这样能实现既不会产生重复数据,也能更新最新的数据。

1
2
3
INSERT  INTO `brand`(`id`, `code`, `name`, `edit_date`) 
VALUES (123, '108', 'lee', now())
on duplicate key update name='loong',edit_date=now();
  • 需要注意的是,在高并发的场景下使用on duplicate key update语法,可能会存在死锁的问题,所以要根据实际情况酌情使用。