MySQL中这14个有用的小知识,快学起来吧

news2024/11/23 3:52:08

前言

        我最近用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;

执行结果:

使用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;

执行效果如图所示:

 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;

执行结果:

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

除此之外,我们还可以使用: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;

返回结果为下面这样的:

它会包含年月日时分秒

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

SELECT now(3) FROM sys_user LIMIT 1;

返回结果为下面这样的:

使用起来非常方便好记。

 

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的数据了。

执行之后直接报错了:

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

 

当然很多人通过在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`;

结果如图所示:

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

 

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

答:使用show index命令。

比如:

SHOW INDEX FROM sys_dept;

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

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

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

例如:

show create table `order`;

执行结果如图所示:

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

非常直接明了。

11.create table ... select

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

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

  1. 创建一张临时表

  2. 将数据插入临时表

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

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_20221219
SELECT * FROM `sys_user`;

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

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

12.explain

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

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

例如:

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

结果:

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

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

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

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

13.show processlist

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

这时候该怎么办呢?

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

如图所示:

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

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在产品开发中讨论概念设计?

每当你看到一辆在路上行驶的汽车、书桌上的笔记本电脑、工业包装生产线、医院设备、家用仪器和其他形式的概念设计创意产品会感到难以置信,这就是我们在产品开发中讨论概念设计的原因。 概念设计是一个尚未解决或到目前为止尚未令人满意的问题。这是一个深思熟虑的解…

研究区域制图 | 在 ArcGIS Pro中创建地图布局

研究区域制图 | 在 ArcGIS Pro中创建地图布局 数据准备 首先需要两个图层,一个是市区图层,一个是省行政区划图层,我这里以吉林省以及吉林省长春市为例 新建布局 选择横向A5即可 添加参考线 不知道你们知不知道这个功能,反正小…

kotlin协程笔记:Dispatchers

Kotlin 的 launch 会调用 startCoroutineCancellable(),接着又会调用 createCoroutineUnintercepted(),最终会调用编译器帮我们生成 SuspendLambda 实现类当中的 create() 方法。 public fun CoroutineScope.launch(context: CoroutineContext EmptyC…

【JVM】本地方法栈与堆与方法区

文章目录1. 本地方法栈2. 堆3. 方法区1. 本地方法栈 本地方法栈和虚拟机栈有点类似,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。 但是不同之处在于本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM…

[附源码]Nodejs计算机毕业设计教师职称评定系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

免费提供POSMV的GNSS数据解算服务,验潮仪丢失的一种补救

前两天有个网友问干活的区域附近是否有长期验潮站,因为他的临时验潮仪丢失了,随后问了一下搞水文的同事,他推了一个网址: http://publictide.nmdis.org.cn/tide?SiteGroup3&TideType0,中文名叫:潮汐潮…

C型利钠肽 ,101135-67-5

Bz-VGR-pNA, chromogenic substrate for trypsin and for bacterial trypsin-like proteases.Bz-VGR-pNA,胰蛋白酶和细菌胰蛋白酶样蛋白酶的显色底物。 编号: 127015中文名称: C型利钠肽 (TYR0)-C-PEPTIDE (DOG)英文名: (Tyr0)-C-Peptide (dog)CAS号: 101135-67-5单…

机房动环监控系统3大价值,第一个太惊艳了

在中小学、大学院校中,机房已经是不可缺少的部分,但由于管理缺陷、设备复杂等缘故,学校机房得不到安全保障。 因此,要实现学校机房监控系统,来对机房的运行情况实时监测,以此提高风险预防及设备运行环境质量…

C++利用模板实现消息订阅和分发

解耦是编写程序所遵循的基本原则之一,多态是提高程序灵活性的重要方法。C语言支持重载,模板,虚函数等特性,为编写高性能可扩展的程序提供了利器。编写大型项目时,免不了需要各个模块之间相互调用,从而产生了…

【LeetCode题目详解】(四)20.有效的括号、225.用队列实现栈

目录 一、力扣第20题:有效的括号 1.解题思路 2.写出代码 3.完整代码 二、力扣第225题:用队列实现栈 1.思路分析 2.代码实现 3.完整代码 总结 一、力扣第20题:有效的括号 题目链接:20. 有效的括号 - 力扣(Leetc…

计算机毕设Python+Vue学生寝室管理系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

哈夫曼树的构造及应用

哈夫曼树的构造及应用 文章目录哈夫曼树的构造及应用带权路径长度哈夫曼树定义哈夫曼树的性质:构造哈夫曼树构造哈夫曼树存储及生成算法算法框架代码实操:应用: 哈夫曼编码带权路径长度 设二叉树具有n个带权值的叶子节点,那么从根节点到各个叶子节点的路径长度与相应…

【图像分割】模糊聚类算法FCM图像分割【含Matlab源码 084期】

⛄一、模糊聚类算法FCM简介 1 前言 图像分割是图像进行后续分析处理的基础,它将图像分成不同特征部分并获得所需目标,广泛应用于诸多领域.彩色多目标图像具有更为丰富的图像信息,目标色彩较多,且同一色彩的目标有时具…

统计学习方法 | 感知机

感知机是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取1和-1二值 感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型 一.模型介绍和学习策略 1.模…

牛客题霸sql入门篇之多表查询

牛客题霸sql入门篇之多表查询 1 子查询 1.1 浙江大学用户题目回答情况 1.1.1 题目内容 a 内容1 b 内容2 1.1.2 示例代码 SELECT device_id,question_id,result FROM question_practice_detail WHERE device_id(SELECT device_id FROM user_profile WHERE university浙江大…

[附源码]计算机毕业设计Python的个人理财系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

pyqt 搭建深度学习训练界面(二)

炼丹软件 github链接: 有需要联系我 requirements: 测试在ubuntu18.04和Windows均可运行 ubuntu18.04 OS: Ubuntu 18.04.6 LTS Python version: 3.7 (64-bit runtime) Is CUDA available: True CUDA runtime version: 11.1.74 GPU models and configuration: GPU 0: NVI…

基于云的文档管理软件/文档管理系统(DMS)

基于云的文档管理软件 由于违反法规而导致的安全漏洞、数据丢失、版本管理等难题和诉讼已经变得非常普遍,以至于这一切都感觉像是“正常”的现象。使用文档管理系统,可以让您避免这些麻烦。安全标准的执行、信息的合规性和维护都在控制之中,只…

【人脸识别】SVM和PCA人脸识别【含GUI Matlab源码 369期】

⛄一、简介 1 PCA-SVM原理 1.1 主成分分析PCA 本文处理的所有原始图片都是112x 92大小的pgm格式图片, 每幅图片包含10304个像素点, 每一行代表一个样本,维数就是10304维。维数过大使得数据处理工作十分复杂,同时,图片…

axios传参的语法

请求方式 POST 向服务器新增数据 GET 从服务器获取数据 DELETE 删除服务器上的数据 PUT 更新服务器上的数据(侧重于完整更新:例如更新用户的完整信息) PATCH 更新服务器上的数据(侧重于部分更新:例如只更新用户的手机号 ) get axios({url: 请求地址,m…