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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【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中的行列转换,如果大家对于文章的内容、排版等各个方面有什么好的想法,都可以进行沟通交流,也希望我的博客中的内容能为大家在学习的道路上提供一点点助力,我们一起学习,一起进步


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
13天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
13天前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
1月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
1月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
190 11
|
19天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
关系型数据库 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)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
446 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
280 9
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
186 6
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
1043 1

推荐镜像

更多