【SQL应知应会】行列转换(二)• MySQL版

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【SQL应知应会】行列转换(二)• MySQL版

前言

在前一篇内容中,学习了MySQL的行列转换中的行转列,其中只讲述了在MySQL与Oracle中通欧诺个的行转列,并且进行了对应的扩展了——如果想在结果中加入学生姓名的方法,上一篇讲了其中一种方法,就是使用关联子查询。


今天这篇内容,将继续进行讲述MySQL的行列转换的后续内容,其中包括添加学生姓名的第二种方法(使用了join进行关联表),以及本文章主攻的核心内容——行列转换中的列转行。


同样的,为了大家可以更方便的一起跟着文章进行代码的操作学习,在文章中的每一块的知识点都提供了对应的数据准备,即大家可以直接复制代码在自己的电脑上进行建表,然后根据文章中的内容一起进行实操,因为我个人认为计算机方面的知识点的学习,实操相对于光进行文字的学习会更有效果,并且更容易发现自己的短板和思路中存在的问题。


那么,快拿出你的电脑,跟着文章一起学习起来吧


一、MySQL行列转换

1.数据准备操作

👉:传送门💖数据准备操作💖


2.行转列

1.1为何进行行转列?

👉:传送门💖1.1为何进行行转列?💖


1.2 行转列有两个意思:1.表内的行转列 2.跨表的行转列

👉:传送门💖1.2 行转列的两个意思💖


3.行转列的思路:行变少,列变多

3.1 如何进行行转列:增加字段,进行聚合(行变少)

👉:传送门💖3.1如何进行行转列💖


4.行转列的实操

4.1 通用的行转列(Mysql和Oracle都能用)

👉:传送门💖4.1通用的行转列(Mysql和Oracle都能用)💖


4.1.1想在结果中加入学生名字

👉:传送门💖4.1.1在结果中加入学生名字)💖


4.1.1.1加入名字的方法1:

4.1.1.1 加入名字的方法2:

select distinct t1.user_name ,t0.*    -- 如果不加distinct,因为t1表每个ID对应多个名字,所以最终结过就是,名字重复几次,结果就有几行重复
from
(
  select 
      user_id '学生ID',
      max(case when course = '语文' then score end) '语文',
      max(case when course = '数学' then score end) '数学',
      max(case when course = '英语' then score end) '英语'
  from 
      table_grade
  group by 
      user_id
) t0left join table_grade t1
on t0.学生ID  = t1.user_id;     -- 此处的t0.学生ID,因为前面设置了别名,所以此处也应该使用别名,不然就会发生错误:Unknown column 't0.user_id' in 'on clause'

4.2 私有方法的行转列(Mysql用)

select user_id '学生ID',
   max(if(course = '语文',score,null)) '语文',
   max(if(course = '数学',score,null)) '数学',
   max(if(course = '英语',score,null)) '英语'
from table_grade
group by user_id


4.2.1 添加名字的两种方法

select user_id '学生ID',
    (select max(user_name) from table_grade where table_grade.user_id =t.user_id ) user_name,
    max(if(course = '语文',score,null)) '语文',
    max(if(course = '数学',score,null)) '数学',
    max(if(course = '英语',score,null)) '英语'
from table_grade t
group by user_id


select distinct t1.user_name,t0.*
from 
(  select user_id '学生ID',
      max(if(course = '语文',score,null)) '语文',
      max(case when course = '数学' then score end) '数学',
      max(if(course = '英语',score,null)) '英语'
  from table_grade  
  group by user_id ) t0
left join table_grade t1
on t0.学生ID = t1.user_id;


3.列转行

a b c             
1            1   a
2                     1   b
3                     1   c
                      2   a
            2  b
            2  c 
            3  a
            3  b
            3  c


列转行如上图所示,左边变成右边


右图又称为纵表,这种纵表在大数据中适合用工具hbase进行列式存储,里面存的就是键值对,右图的左列是键、右列是值

纵表适合存储,横表适合分析

底层明细数据,适合列式存储

3.1列转行思路:行变多 用union

select(查询)能表达的关系是并差交笛卡尔积

集合运算是 并差交笛卡尔积

关系运算是 投影连接除

大数据一次处理一个集合(set),不是一个记录(record)

3.2 列转行实操

3.2.1 数据准备

建个横表

create table table_grade_wide as(
    select user_id '学生ID',
      max(if(course = '语文',score,null)) '语文',
      max(if(course = '数学',score,null)) '数学',
      max(if(course = '英语',score,null)) '英语'
    from table_grade
    group by user_id )
alter table table_grade_wide change user_id id  int;

3.2.2 实操

select * from(
  select 学生ID,'语文' course,语文 score from table_grade_wide -- 只需要在第一个select字段中修改别名就好了,因为union的时候,前后的所有的select的列的类型和个数是一致的
  union   --
  select 学生ID,'数学',数学 from table_grade_wide
  union 
  select 学生ID,'英语',英语 from table_grade_wide ) a
where score is not null     -- 因为有的同学只考了其中几门课
order by 1;   -- 按照最后结果的第一列进行排序


小结

好了,MySQL的行列转换到这里就要告一段落了,希望大家通过上一篇文章——行列转换(一)• MySQL版以及本篇文章的学习,应该对MySQL的行列转换有了了解,学习是永无止境的,接下来,我们会按照这样的方式为大家讲述Oracle中的行列转换,如果大家对于文章的内容、排版等各个方面有什么好的想法,都可以进行沟通交流,也希望我的博客中的内容能为大家在学习的道路上提供一点点助力,我们一起学习,一起进步


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
SQL Oracle 关系型数据库
SQL(MySQL)
SQL语言是指结构化查询语言,是一门ANSI的标准计算机语言,用来访问和操作数据库。 数据库包括SQL server,MySQL和Oracle。(语法大致相同) 创建数据库指令:CRATE DATABASE websecurity; 查看数据库:show datebase; 切换数据库:USE websecurity; 删除数据库:DROP DATABASE websecurity;
|
2月前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
48 1
|
1月前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
38 0
|
1月前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
|
2月前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
47 0
|
2月前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
22 0
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
118 13
|
5月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
5月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
63 6