MySQL这几个函数用法,你必须把握

十念  论坛元老 | 2025-3-10 02:21:59 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1611|帖子 1611|积分 4833

::: block-1
   踏实的编程基础,是你走向大佬的途径。 ——安前码后
:::
  前言

MySQL数据库,信赖在日常的工作中,你肯定跟他打过交道,说实话,数据库基础真的非常重要。万变不离CRUD,你和高手的区别,就是对于性能这一块有没有条件反射般的头脑了,先说一句,好好把握原理,哪怕是点滴积累。以下记录了一下工作中常见并且非常重要的几个用法。
1、replace

作用:字符替换

比如:将字符串中的字符X替换成Y。
  1. update user set name=REPLACE(name,'X','X')
  2. where id=10;
复制代码
2、locate

作用:查找某个关键字

比如:李四,需要明确知道它在某个字符串中的位置时,可以使用locate函数
  1. select * from user where name like '%李四%'
  2. order by char_length(name) asc, locate('李四',name) asc limit 5,5;
复制代码
先按长度排序,小的排在前面。如果长度相同,则按关键字从左到右进行排序,越靠左的越排在前面。

3、group_concat

作用:使用group by进行分组

比如想统计出用户表中,名称不同的用户的具体名称是哪些
具体sql如下:
常见头脑
  1. select name from `user` group by name;
复制代码
如果想把name相同的code拼接在一起,放到另外一列中需要怎么做?
  1. select name,group_concat(code) from `user`
  2. group by name;
复制代码
执行效果如下:

可以看到,使用group_concat函数,可以轻松的把分组后,name相同的数据拼接到一起,组成一个字符串,用逗号分隔。

4、char_length

作用:获取字符串的长度

比如:获取字符长度并且排序的sql如下
  1. select * from brand where name like '%张三%'
  2. order by char_length(name) asc limit 10;
复制代码
4、now

作用:获取当前的系统时间

  1. select now() from brand limit 1;
复制代码

如果你还想返回毫秒,可以使用now(3),例如:
  1. select now(3) from brand limit 1;
复制代码

方便吧

6、insert into … select

对于数据量比较小的插入操作,一般用 insert into tableName values(…)的情势即可处置惩罚,但是对于数据量大的,大概想把一个表数据直接插入到另外一个表结构一模一样的表中,那么用insert into … select绝对是优选之一,像下面这样:
  1. INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
  2. select null,code,name,now(3) from `order` where code in ('111','222');
复制代码
这样就能将order表中的部分数据,非常轻松插入到brand表中。

7、select … for update

MYSQL数据库自带了悲观锁,它是一种排它锁,根据锁的粒度从大到小分为:表锁、间隙锁和行锁。
在我们的现实业务场景中,有些情况并发量不太高,为了保证数据的精确性,使用悲观锁也可以。
比如:用户扣减积分,用户的操作并不集中。但也要思量系统自动赠送积分的并发情况,所以有须要加悲观锁限定一下,防止出现积分加错的情况发生。
这时候就可以使用MYSQL中的select … for update语法了。
  1. begin;
  2. select * from `user` where id=1
  3. for update;
  4. //业务逻辑处理
  5. update `user` set score=score-1 where id=1;
  6. commit;
复制代码
这样在一个变乱中使用for update锁住一行记录,其他变乱就不能在该变乱提交之前,去更新那一行的数据。
需要注意的是for update前的id条件,必须是表的主键大概唯一索引,否则行锁大概会失效,有大概变成表锁。
温馨提醒:这个在高并发情况下,慎用,这里只是遍及一下这个写法。要根据情况使用。

8、insert into … ignore

作用:对于已经存在的数据,插入的时候忽略,否则轻易产生重复数据
举个例子:在插入1000个品牌之前,需要先根据name,判定一下是否存在。如果存在,则不插入数据。如果不存在,才需要插入数据。如果直接这样插入数据:
  1. INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
  2. VALUES (123, '108', '赵六', now(3));
复制代码
肯定不可,由于brand表的name字段创建了唯一索引,同时该表中已经有一条name等于赵六的数据了。执行之后会直接报错了:
这就需要在插入之前加一下判定。
一般人会通过在sql语句背面拼接not exists语句,也能到达防止出现重复数据的目标,比如:
  1. INSERT INTO `brand`(`id`, `code`, `name`, `edit_date`)
  2. select null,'108', '赵六',now(3)
  3. from dual where  not exists (select * from `brand` where name='赵六');
复制代码
可以是可以,但是有没有发现写法冗余了一点,咱是为了慢慢成为别生齿中的大佬的,那就换个写法吧。
  1. INSERT ignore INTO `brand`(`id`, `code`, `name`, `edit_date`)
  2. 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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表