MySQL三两奇巧

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL作为国内中小企业最流行的关系型数据库,在业务中经常会被用到。如果要说有什么奇巧,真的不是一两篇文章能够概述的在这里挑选了一些在实际开发中可能会经常用到的一些技巧,简单地来说说。

MySQL作为国内中小企业最流行的关系型数据库,在业务中经常会被用到。如果要说有什么奇巧,真的不是一两篇文章能够概述的

在这里挑选了一些在实际开发中可能会经常用到的一些技巧,简单地来说说。


01列拼接问题


在实际项目中,经常需要将某一列的内容拼接并返回,特别是一些归集的报表导出的业务中。这里创建1张类似如下的数据表,并插入相关的数据:

create table user (
   id int primary key auto_increment,
   username varchar(20),
   age int
);
insert into user (username,age) values ('张三',20),("李四",25),("王五",26),("李四",20);

现在我们想将user表中用户筛选出来进行拼接并返回。此时,我们可以借助MySQL的group_concat函数进行拼接,可以写出1条类似如下的语句:

  1. mysql>select group_concat(username) user from user;

查询结果为:

user
张三,李四,王五,李四

该语句查询出每行的用户名称,之后将其进行拼接。然而,由于数据表中用户李四存在2条记录,因此导致最终结果出现了重复的记录。而实际开发需求中更多的是,要求对最终的结果进行去重,此时就用到了1个比较有意思的技巧。

我们稍作修改,在group_concat函数的筛选的列之前添加1个distinct关键字,此时可以得到:

  1. mysql>select group_concat(distinct username) user from user;

结果如下所示:

user
张三,李四,王五

可以发现列值去重了,得到我们期望的结果。


02绘制简单直方图


一般业务中,常常会遇到的1个需求就是对用户进行分组,比如查询某个用户最近几个月的消费情况。这里进行简化处理,假设只查询user表中用户出现的次数,此时可以借助group by语句来操作:

select username,count(id) num from user group by username order by num desc user

其结果类似如下:

username num
李四 2
张三 1
王五 1

其中用户李四出现了2次,而其他的用户只出现了1次。有些时候,为了能方便的查看出差别,一般会采用图形化的方式进行处理。此时,可以借助MySQL中repeat函数对某个字符串重复多次的方式,进行简单的ASCII图形化展示。

此时可以写出1个类似如下的SQL语句:


mysql> select b.username,repeat("*",b.num) star from (select username,count(id) num from user group by username order by num desc) b

结果如下所示:

username star
李四 **
张三 *
王五 *

这里涉及到1个子查询的知识点,就不展开说明了。简单的说,我们可以让我们的数据来自另1个select子语句,但是需要给该子语句1个别名,否则MySQL会抛出异常。

我们将得到的统计次数传递给repeat函数,从而让其根据结果进行渲染,从而得到1个简单的柱状图。如果数据量更多的话,效果会更加明显。


03简化表关联


在关系型数据库中,常常会通过2个及多个表之间的关联来完成复杂的业务需求。对于之前的逻辑,我们新增1个类似如下的关联表:

create table information (
   id integer,
   post varchar(20)
);
insert into information (id,post) values (1,'大学教授'),(2,"IT架构师"),(3,"CEO"),(4,"操盘手");

通过用户的id进行2个表之间数据的关联。现在,我们想查询每个用户的信息,包括其名字、年龄及职位。于是有如下的SQL语句:

mysql> select a.id,a.username,a.age,b.post from user a join information b on a.id = b.id

此时可以得到如下的结果:

id username age post
1 张三 20 大学教授
2 李四 25 IT架构师
3 王五 26 CEO
4 李四 20 操盘手

4 rows in set

在MySQL中在关联查询时如果2个表中的关联字段是相同的话,可以通过using子句进行简化,我们可以将上述的SQL修改为:


mysql> select a.id,a.username,a.age,b.post from user a join information b using (id);

其结果为:

id username age post
1 张三 20 大学教授
2 李四 25 IT架构师
3 王五 26 CEO
4 李四 20 操盘手

通过using子句我们简化了SQL中 on a.id=b.id这段的语句。

当然,实际开发中还有其他一些技巧,有时间再分享。

本文作者:本人笔名玉面玲珑颜如玉,1个多年滚打于Web开发的研发工程师。熟悉PHP、Java、C++等编程语言,以编程作为乐趣。

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 算法 安全
公共医疗数据库汇总:无需实验,高效论文撰写利器
在医学研究领域,获取高质量的数据和文献资源是进行科学论文撰写的关键。随着信息技术的发展,以及公共医疗数据库的不断壮大和完善,研究人员可以轻松地获取大量的医学数据和文献信息,从而提高论文撰写的效率和质量。本文将为您介绍一系列全面的公共医疗数据库,这些数据库不仅为您提供了丰富的医学资源,还无需进行实验,成为高效论文撰写的利器。
2037 1
|
存储 Web App开发 运维
部署MinIO存储服务的四种方式(二)
上一篇文章介绍了使用 Golang 语言上传本地文件到 MinIO 存储服务的实现方式。今天我们就来介绍一下如何部署 MinIO 存储服务,毕竟,我们上传文件的前提,是已经存在了对应的存储服务才行。
1028 0
|
分布式计算 分布式数据库 Hbase
当HBase遇上MapReduce头歌答案
当HBase遇上MapReduce头歌答案
642 0
|
弹性计算 调度 混合部署
ACK Istio ingress gateway 生产调优
istio ingress gateway 生产配置调优
2860 0
ACK Istio ingress gateway 生产调优
|
机器学习/深度学习 数据采集 数据处理
岭回归与LASSO回归:解析两大经典线性回归方法(上)
岭回归与LASSO回归:解析两大经典线性回归方法
|
数据安全/隐私保护
企业邮箱申请注册流程(图文教程)
企业邮箱申请注册流程(图文教程)阿里云企业邮箱购买流程,企业邮箱分为免费版、标准版、集团版和尊享版,阿里云百科分享企业邮箱版本区别,企业邮箱收费标准价格表,以及阿里企业邮箱详细购买流程
|
机器学习/深度学习 存储 自然语言处理
张家俊:ChatGPT八个技术问题的猜想
张家俊:ChatGPT八个技术问题的猜想
|
前端开发 数据可视化 Java
从零学习Swagger3.0
从零学习Swagger3.0
188 0
|
Linux
Linux查看安装了哪些软件
Linux查看安装了哪些软件
|
IDE 程序员 API
095_《Delphi5高级编程丛书之一:IDE与面向对象编程》
《Delphi5高级编程丛书之一:IDE与面向对象编程》 Delphi 教程 系列书籍 (095) 《Delphi5高级编程丛书之一:IDE与面向对象编程》 网友(邦)整理 EMail: shuaihj@163.
1270 0

热门文章

最新文章