返回顶部
首页 > 资讯 > 数据库 >MySQL中超级有用的14个小知识总结
  • 582
分享到

MySQL中超级有用的14个小知识总结

mysql小知识点mysql基本知识点mysql知识点总结 2022-12-21 10:12:09 582人浏览 独家记忆
摘要

目录1.group_concat2.char_length3.locate4.replace5.now6.insert into ... select7.insert into ... ignore8.sele

我最近用mysql数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。

1.group_concat

在我们平常的工作中,使用group by进行分组的场景,是非常多的。

比如想统计出用户表中,名称不同的用户的具体名称有哪些?

具体sql如下:

SELECT name FROM `user` GROUP BY name;

但如果想把name相同的code拼接在一起,放到另外一列中该怎么办呢?

答:使用group_concat函数。

例如:

SELECT name,group_concat(code) FROM `user` GROUP BY name;

执行结果:

MySQL中超级有用的14个小知识总结

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

2.char_length

有时候我们需要获取字符的长度,然后根据字符的长度进行排序

MYSQL给我们提供了一些有用的函数,比如:char_length

通过该函数就能获取字符长度。

获取字符长度并且排序的sql如下:

SELECT user_id,user_name FROM `sys_user` WHERE user_name LIKE '%JM%'
ORDER BY CHAR_LENGTH(user_name) ASC LIMIT 5;

执行效果如图所示:

MySQL中超级有用的14个小知识总结

 name字段使用关键字模糊查询之后,再使用char_length函数获取name字段的字符长度,然后按长度升序。

3.locate

有时候我们在查找某个关键字,比如:JM,需要明确知道它在某个字符串中的位置时,该怎么办呢?

答:使用locate函数。

使用locate函数改造之后sql如下:

SELECT user_id,user_name FROM `sys_user` WHERE user_name LIKE '%JM%'
ORDER BY CHAR_LENGTH(user_name) ASC, LOCATE('JM',user_name) LIMIT 2,2;

执行结果:

MySQL中超级有用的14个小知识总结

先按长度排序,小的排在前面。如果长度相同,则按关键字从左到右进行排序,越靠左的越排在前面。

除此之外,我们还可以使用:instrposition函数,它们的功能跟locate函数类似,在这里我就不一一介绍了。

4.replace

我们经常会有替换字符串中部分内容的需求,比如:将字符串中的字符A替换成B。

这种情况就能使用replace函数。

例如:

UPDATE sys_user set user_name=REPLACE(user_name,'A','B') WHERE user_id=1;

这样就能轻松实现字符替换功能。

也能用该函数去掉前后空格:

UPDATE sys_user set user_name=REPLACE(user_name,' ','') WHERE user_name LIKE ' %';
UPDATE sys_user set user_name=REPLACE(user_name,' ','') WHERE user_name LIKE '% ';

使用该函数还能替换JSON格式的数据内容,真的非常有用。

5.now

时间是个好东西,用它可以快速缩小数据范围,我们经常有获取当前时间的需求。

在MYSQL中获取当前时间,可以使用now()函数,例如:

SELECT now() FROM sys_user LIMIT 1;

返回结果为下面这样的:

MySQL中超级有用的14个小知识总结

它会包含年月日时分秒。

如果你还想返回毫秒,可以使用now(3),例如:

SELECT now(3) FROM sys_user LIMIT 1;

返回结果为下面这样的:

MySQL中超级有用的14个小知识总结

使用起来非常方便好记。

6.insert into ... select

在工作中很多时候需要插入数据。

传统的插入数据的sql是这样的:

INSERT INTO `sys_user`(`user_id`, `dept_id`, `user_name`, `create_time`) 
VALUES (6, '103', 'JM', now());

它主要是用于插入少量并且已经确定的数据。但如果有大批量的数据需要插入,特别是是需要插入的数据来源于,另外一张表或者多张表的结果集中。

这种情况下,使用传统的插入数据的方式,就有点束手无策了。

这时候就能使用MYSQL提供的:insert into ... select语法。

例如:

INSERT INTO `sys_user`(`user_id`, `dept_id`, `user_name`, `create_time`) 
SELECT null,dept_id,user_name,now(3) FROM `sys_user_backup` WHERE dept_id in ('103','105');

这样就能将用户备份表中的部分数据,非常轻松插入到用户表中。

7.insert into ... ignore

不知道你有没有遇到过这样的场景:在插入1000个用户之前,需要先根据user_name,判断一下是否存在。如果存在,则不插入数据。如果不存在,才需要插入数据。

如果直接这样插入数据:

INSERT INTO `sys_user`(`id`, `dept_id`, `user_name`, `create_time`) 
VALUES (6, '103', 'JM', now());

肯定不行,因为sys_user表的user_name字段创建了唯一索引,同时该表中已经有一条user_name等于JM的数据了。

执行之后直接报错了:

MySQL中超级有用的14个小知识总结

这就需要在插入之前加一下判断。

当然很多人通过在sql语句后面拼接not exists语句,也能达到防止出现重复数据的目的,比如:

INSERT INTO `sys_user`(`user_id`, `dept_id`, `user_name`, `create_time`) 
SELECT null,dept_id,user_name,now(3) FROM sys_user_backup
WHERE not exists (SELECT * FROM `sys_user` WHERE user_name = 'JM')

这条sql确实能够满足要求,但是总觉得有些麻烦。那么,有没有更简单的做法呢?

答:可以使用insert into ... ignore语法。

例如:

INSERT ignore INTO `sys_user`(`user_id`, `dept_id`, `user_name`, `create_time`) 
VALUES (123, '105', 'JM', now(3));

这样改造之后,如果sys_user表中没有user_name为JM的数据,则可以直接插入成功。

但如果sys_user表中已经存在user_name为JM的数据了,则该sql语句也能正常执行,并不会报错。因为它会忽略异常,返回的执行结果影响行数为0,它不会重复插入数据。

8.select ... for update

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

在我们的实际业务场景中,有些情况并发量不太高,为了保证数据的正确性,使用悲观锁也可以。

比如:用户扣减积分,用户的操作并不集中。但也要考虑系统自动赠送积分的并发情况,所以有必要加悲观锁限制一下,防止出现积分加错的情况发生。

这时候就可以使用MYSQL中的select ... for update语法了。

例如:

BEGIN;
SELECT * FROM `sys_user` where user_id=1 
FOR UPDATE;
 
//业务逻辑处理
 
UPDATE `sys_user` SET score = score -1 WHERE user_id=1;
COMMIT;

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

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

9.on duplicate key update

通常情况下,我们在插入数据之前,一般会先查询一下,该数据是否存在。如果不存在,则插入数据。如果已存在,则不插入数据,而直接返回结果。

在没啥并发量的场景中,这种做法是没有什么问题的。但如果插入数据的请求,有一定的并发量,这种做法就可能会产生重复的数据。

当然防止重复数据的做法很多,比如:加唯一索引、加分布式锁等。

但这些方案,都没法做到让第二次请求也更新数据,它们一般会判断已经存在就直接返回了。

这种情况可以使用on duplicate key update语法。

该语法会在插入数据之前判断,如果主键或唯一索引不存在,则插入数据。如果主键或唯一索引存在,则执行更新操作。

具体需要更新的字段可以指定,例如:

INSERT  INTO `sys_user`(`user_id`, `dept_id`, `user_name`, `create_time`) 
VALUES (null, '103', 'JM', now())
OM DUPLICATE KEY UPDATE user_name='JM',create_time=now();

这样一条语句就能轻松搞定需求,既不会产生重复数据,也能更新最新的数据。

但需要注意的是,在高并发的场景下使用on duplicate key update语法,可能会存在死锁的问题,所以要根据实际情况酌情使用。

10.show create table

有时候,我们想快速查看某张表的字段情况,通常会使用desc命令,比如:

DESC `sys_dept`;

结果如图所示:

MySQL中超级有用的14个小知识总结

确实能够看到sys_dept表中的字段名称、字段类型、字段长度、是否允许为空,是否主键、默认值等信息。

但看不到该表的索引信息,如果想看创建了哪些索引,该怎么办呢?

答:使用show index命令。

比如:

SHOW INDEX FROM sys_dept;

也能查出该表所有的索引:

MySQL中超级有用的14个小知识总结

 但查看字段和索引数据呈现方式,总觉得有点怪怪的,有没有一种更直观的方式?

答:这就需要使用show create table命令了。

例如:

show create table `order`;

执行结果如图所示:

MySQL中超级有用的14个小知识总结

 其中Table表示表名Create Table就是我们需要看的建表信息,将数据展开:我们能够看到非常完整的建表语句,表名、字段名、字段类型、字段长度、字符集、主键、索引、执行引擎等都能看到。

非常直接明了。

11.create table ... select

有时候,我们需要快速备份表。

通常情况下,可以分两步走:

  • 创建一张临时表
  • 将数据插入临时表

创建临时表可以使用命令:

CREATE TABLE user_20221219 LIKE `sys_user`;

创建成功之后,就会生成一张名称叫:user_20221219,表结构跟sys_user一模一样的新表,只是该表的数据为空而已。

接下来使用命令:

INSERT INTO user_20221219 SELECT * FROM `sys_user`;

执行之后就会将order表的数据插入到user_20221219表中,也就是实现数据备份的功能。

但有没有命令,一个命令就能实现上面这两步的功能呢?

答:用create table ... select命令。

例如:

CREATE TABLE user_20221219SELECT * FROM `sys_user`;

执行完之后,就会将user_20221219表创建好,并且将sys_user表中的数据自动插入到新创建的user_20221219中。

一个命令就能轻松搞定表备份。

12.explain

很多时候,我们优化一条sql语句的性能,需要查看索引执行情况。

答:可以使用explain命令,查看mysql的执行计划,它会显示索引的使用情况。

例如:

EXPLAIN SELECT * FROM `sys_user` WHERE dept_id=103;

结果:

MySQL中超级有用的14个小知识总结

 通过这几列可以判断索引使用情况,执行计划包含列的含义如下图所示:

MySQL中超级有用的14个小知识总结

说实话,sql语句没有走索引,排除没有建索引之外,最大的可能性是索引失效了。

下面说说索引失效的常见原因:

MySQL中超级有用的14个小知识总结

如果不是上面的这些原因,则需要再进一步排查一下其他原因。

13.show processlist

有些时候我们线上sql或者数据库出现了问题。比如出现了数据库连接过多问题,或者发现有一条sql语句的执行时间特别长。

这时候该怎么办呢?

答:我们可以使用show processlist命令查看当前线程执行情况。

如图所示:

MySQL中超级有用的14个小知识总结

从执行结果中,我们可以查看当前的连接状态,帮助识别出有问题的查询语句。

  • id 线程id
  • User 执行sql的账号
  • Host 执行sql的数据库的ip和端号
  • db 数据库名称
  • Command 执行命令,包括:Daemon、Query、Sleep等。
  • Time 执行sql所消耗的时间
  • State 执行状态
  • info 执行信息,里面可能包含sql信息。

如果发现了异常的sql语句,可以直接kill掉,确保数据库不会出现严重的问题。

14.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

总结

到此这篇关于MySQL中超级有用的14个小知识总结的文章就介绍到这了,更多相关MySQL小知识内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中超级有用的14个小知识总结

本文链接: https://lsjlt.com/news/175406.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL中超级有用的14个小知识总结
    目录1.group_concat2.char_length3.locate4.replace5.now6.insert into ... select7.insert into ... ignore8.sele...
    99+
    2022-12-21
    mysql小知识点 mysql基本知识点 mysql知识点总结
  • mysql中表的知识点总结
    这篇文章主要介绍“mysql中表的知识点总结”,在日常操作中,相信很多人在mysql中表的知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中表的知识点总结”...
    99+
    2024-04-02
  • MySQL索引知识的一些小妙招总结
    一、索引基本知识 1.1 索引的优点 大大减少了服务器需要扫描的数据量,加快数据库的检索速度 帮助服务器避免排序和临时表 将随机io变成顺序io 1.2 索引的用处 速查找...
    99+
    2022-05-23
    mysql 索引 mysql索引结构 mysql索引技巧
  • Java中的引用知识点总结
    本篇内容介绍了“Java中的引用知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!强引用:默认情况下,对象采用的均为强引用(这个对象的...
    99+
    2023-06-05
  • 总结工作中经常用到的mysql基础知识
    本文主要给大家介绍工作中经常用到的mysql基础知识,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下工作中经常用到的mysql基础知识吧。一张表,里面...
    99+
    2024-04-02
  • mysql中关于覆盖索引的知识点总结
    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引'。 覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据,有以下优点: 索引项通常比记录要小,所以MySQL访问更少的数据...
    99+
    2022-05-17
    mysql 覆盖索引
  • C++中引用的相关知识点小结
    目录引用的概念引用特性常引用使用场景引用和指针的区别总结引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块...
    99+
    2024-04-02
  • MySQL常用的函数,可总结回顾下知识点
    在使用MySQL的时候,灵活运用函数可以提高开发效率,方便解决一些棘手的问题。本文讲解的MySQL常用函数包括常用的字符串函数、数值函数、日期和时间函数、聚合函数等。 CHARSET(str) //返回字符串字符集 CONCA...
    99+
    2016-12-04
    MySQL常用的函数,可总结回顾下知识点
  • Spring中@Autowired和@Qualifier注解的3个知识点小结
    目录@Autowired和@Qualifier注解的3个知识点1.@Autowired自动注入2.如果想直接使用byName的注入方式3.如果没有指定Spring创建的bean的名称...
    99+
    2024-04-02
  • Vue中使用计算属性的知识点总结
    计算属性 有些时候,我们在模板中放入了过多的逻辑,从而导致模板过重,且难以维护。例如: <div id="app"> {{ message.split('')....
    99+
    2024-04-02
  • 八个超级好用的Python自动化脚本(小结)
    目录1、自动化阅读网页新闻2、自动化数据探索3、自动发送多封邮件4、将 PDF 转换为音频文件5、从列表中播放随机音乐6、智能天气信息7、长网址变短网址8、清理下载文件夹每天你都可能...
    99+
    2024-04-02
  • MYSQL完全备份、主从复制、级联复制、半同步的知识点总结
    本篇内容介绍了“MYSQL完全备份、主从复制、级联复制、半同步的知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2024-04-02
  • 总结分享有用的三个前端小妙招!
    本篇文章给大家带来了关于前端的相关知识,其中主要跟大家聊聊本人在前端工作中总结的三个小妙招,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。整理下本人在工作中撸代码遇到的一些刚看时一脸懵逼,实则很简单就能解决的小妙招,希望对大家有所帮助哟...
    99+
    2023-05-14
    前端 Vue.js
  • 小程序开发中实用的小知识有哪些
    这篇文章跟大家分析一下“小程序开发中实用的小知识有哪些”。内容详细易懂,对“小程序开发中实用的小知识有哪些”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“小程序开发中实用的小知识有...
    99+
    2023-06-29
  • MySQL中实用的知识点有哪些
    这篇文章主要介绍了MySQL中实用的知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中实用的知识点有哪些文章都会有所收获,下面我们一起来看看吧。1.grou...
    99+
    2023-01-29
    mysql
  • Laravel中10个有用的用法小结
    本文给大家介绍了Laravel 中一些常用的用法 1. 在 find 方法中指定属性 User::find(1, ['name', 'email']); User::findOr...
    99+
    2024-04-02
  • Spring中11个最常用的扩展点总结,你知道几个
    目录前言1. 类型转换器2. 获取容器Bean2.1 BeanFactoryAware2.2 ApplicationContextAware2.3 ApplicationListen...
    99+
    2022-12-20
    spring的扩展点 spring扩展点实际应用 spring扩展点顺序
  • Mysql中有关Datetime和Timestamp的使用总结
    目录一、MySQL中如何表示当前时间?二、关于TIMESTAMP和DATETIME的比较TIMESTAMP和DATETIME的相同点:TIMESTAMP和DATETIME的不同点:三...
    99+
    2024-04-02
  • 前端面试学习中几个常见有用的知识点
    svg和canvas 的区别? svg 输出的图形都有独立的dom 是一个矢量图形 放大缩小不会 canvas 输出的是一整块 是一个画布 放大 缩小会失真 src 和 href 的...
    99+
    2022-12-29
    前端面试知识 前端学习知识点
  • Java中Map接口使用以及有关集合的面试知识点汇总
    目录Map接口存储特点常用实现类创建方法常用方法遍历方法不同实现类的使用集合面试知识点补充结语Map接口 存储特点 以键(key)值(value)对的形式存储键无序、无下标、元素不可...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作