Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!
| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 公司动态 >

IT编程教育培训中心简析mysql数据库字段隐藏用法,你都知道吗

发布日期:2023-02-20 09:33:11点击次数:

分享到:
     IT编程教育培训中心简析mysql数据库必备的这些技能,你都知道吗?作为开源数据库,mysql的应用是越来越广泛了,那么mysql数据库的这些隐藏字段用法你都知道吗,大家一块来看看吧!希望可以给大家一些参考!

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格式的数据内容,真的非常有用。

IT编程教育培训中心简析mysql数据库字段隐藏用法

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
     以上就是西安鸥鹏教育小编为大家呈现的各种命令用法,
希望可以帮到大家,有些字段还有多种用法,如果你有不清楚的,或者有不理解的,可以联系我们老师为大家一一解答哦,