::: block-1
踏实的编程基础,是你走向大佬的途径。 ——安前码后
:::
前言
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掉,确保数据库不会出现严肃的问题。
写在最后
又到告终束的时候,还是唠嗑一下,新技术有很多,现实用到的也就那些,但是踏实的基础就是你成为大佬的资本。与其看很多新技术,不如沉下心来,天天给自己一点思索的空间。不用怀疑,时间会证实你是对的。
如果能感受到用心整理,帮助给个三连,欢迎一连关注"安前码后"公众号,一个专注分享使用干货的号。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |