发布日期:2023-02-20 09:33:11点击次数:次
1.group_concat
在我们平常的工作中,使用group by进行分组的场景,是非常多的。
比如想统计出用户表中,名称不同的用户的具体名称有哪些?
具体sql如下:
select name from `user`
group by name;
但如果想把name相同的code拼接在一起,放到另外一列中该怎么办呢?
答:使用group_concat函数。
2.char_length
有时候我们需要获取字符的长度,然后根据字符的长度进行排序。
MYSQL给我们提供了一些有用的函数,比如:char_length。
通过该函数就能获取字符长度。
获取字符长度并且排序的sql如下:
select * from brand where name like '%苏三%'
order by char_length(name) asc limit 5;
3.locate有时候我们在查找某个关键字,比如:苏三,需要明确知道它在某个字符串中的位置时,该怎么办呢?
答:使用locate函数。
使用locate函数改造之后sql如下:
select * from brand where name like '%苏三%'
order by char_length(name) asc, locate('苏三',name) asc limit 5,5;
4.replace我们经常会有替换字符串中部分内容的需求,比如:将字符串中的字符A替换成B。
这种情况就能使用replace函数。
例如:
update brand set name=REPLACE(name,'A','B')
where id=1;
这样就能轻松实现字符替换功能。
也能用该函数去掉前后空格:
update brand set name=REPLACE(name,' ','') where name like ' %';
update brand set name=REPLACE(name,' ','') where name like '% ';
使用该函数还能替换json格式的数据内容,真的非常有用。
5.now
时间是个好东西,用它可以快速缩小数据范围,我们经常有获取当前时间的需求。
在MYSQL中获取当前时间,可以使用now()函数,例如:
select now() from brand limit 1;
返回结果为下面这样的:
它会包含年月日时分秒。
如果你还想返回毫秒,可以使用now(3),例如:
select now(3) from brand limit 1;
返回结果为下面这样的:
使用起来非常方便好记。
6.insert into ... select
在工作中很多时候需要插入数据。
传统的插入数据的sql是这样的:
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
VALUES (5, '108', '苏三', '2022-09-02 19:42:21');
它主要是用于插入少量并且已经确定的数据。但如果有大批量的数据需要插入,特别是是需要插入的数据来源于,另外一张表或者多张表的结果集中。
这种情况下,使用传统的插入数据的方式,就有点束手无策了。
这时候就能使用MYSQL提供的:insert into ... select语法。
例如:
INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
select null,code,name,now(3) from `order` where code in ('004','005');
这样就能将order表中的部分数据,非常轻松插入到brand表中。
7.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='苏三');
这条sql确实能够满足要求,但是总觉得有些麻烦。那么,有没有更简单的做法呢?
答:可以使用insert into ... ignore语法。
例如:
INSERT ignore INTO `brand`(`id`, `code`, `name`, `edit_date`)
VALUES (123, '108', '苏三', now(3));
这样改造之后,如果brand表中没有name为苏三的数据,则可以直接插入成功。
但如果brand表中已经存在name为苏三的数据了,则该sql语句也能正常执行,并不会报错。因为它会忽略异常,返回的执行结果影响行数为0,它不会重复插入数据。
8.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条件,必须是表的主键或者唯一索引,不然行锁可能会失效,有可能变成表锁。
9.mysqldump
有时候我们需要导出MYSQL表中的数据。
这种情况就可以使用mysqldump工具,该工具会将数据查出来,转换成insert语句,写入到某个文件中,相当于数据备份。
我们获取到该文件,然后执行相应的insert语句,就能创建相关的表,并且写入数据了,这就相当于数据还原。
mysqldump命令的语法为:mysqldump -h主机名 -P端口 -u用户名 -p密码 参数1,参数2.... > 文件名称.sql
备份远程数据库中的数据库:
mysqldump -h 192.22.25.226 -u root -p123456 dbname > backup.sql
以上就是西安鸥鹏教育小编为大家呈现的各种命令用法,希望可以帮到大家,有些字段还有多种用法,如果你有不清楚的,或者有不理解的,可以联系我们老师为大家一一解答哦,
•IT编程教育培训中心简析mysql数据库字段隐藏用法,你都知道吗2023-02-20