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

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

行列转换 • Mysql版

  • 前言
  • 一、MySQL行列转换
    • 1.数据准备操作
    • 2.行转列
      • 1.1为何进行行转列?
      • 1.2 行转列有两个意思:1.表内的行转列 2.跨表的行转列
    • 3.行转列的思路:行变少,列变多
      • 3.1 如何进行行转列:增加字段,进行聚合(行变少)
    • 4.行转列的实操
      • 4.1 通用的行转列(Mysql和Oracle都能用)
        • 4.1.1想在结果中加入学生名字
          • 4.1.1.1加入名字的方法1:
          • 4.1.1.1 加入名字的方法2:
      • 4.2 私有方法的行转列(Mysql用)
        • 4.2.1 添加名字的两种方法
    • 3.列转行
      • 3.1列转行思路:行变多 用union
      • 3.2 列转行实操
        • 3.2.1 数据准备
        • 3.2.2 实操
  • 小结

前言

在前一篇内容中,学习了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中的行列转换,如果大家对于文章的内容、排版等各个方面有什么好的想法,都可以进行沟通交流,也希望我的博客中的内容能为大家在学习的道路上提供一点点助力,我们一起学习,一起进步

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LayUI入门,以及介绍

一.LayUI基本情况 1.LayUI介绍 Layui(流行于 layui.com)是一款轻量级的前端UI框架,专注于提供简洁、易用、灵活的界面组件和交互体验。它基于HTML5和CSS3技术,采用模块化开发的思想,提供了丰富的UI组件、常用的工具函数…

一套完全开源,支持多租户,界面配置单点的后端框架JVS

JVS的多租户体系统 在IT系统中,“租户”(tenant)通常用于指代一种多租户架构(multi-tenancy),它是一种软件架构模式,允许多个用户或组织共享相同的应用程序或系统实例,但彼此之间的…

短视频抖音账号矩阵系统源码---功能架构示例1

一、短视频账号矩阵系统源码开发服务器集群化处理开发成本更低(前提) 什么是集群化处理视频内存内耗?集群化处理视频内存内耗是指通过建立集群系统,将视频处理任务分配给多个计算节点进行并行处理,以减少单个计算节点…

PHP 音乐欣赏网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP音乐欣赏网站 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88041034https://download.…

目标检测+车道线识别+追踪+测距(代码+部署运行)

目标检测车道线识别追踪测距 本文主要讲述项目集成:从车道线识别、测距、到追踪,集各种流行模型于一体! 不讲原理,直接上干货! 把下文环境配置学会,受益终生! 各大项目皆适用! …

什么是CI/CD?让你的项目变得更加敏捷!

在今天这个快速变化的时代,开发者们需要与时俱进,不断提升自己的工作效率。在这篇文章里,将一起探讨如何使用CI/CD和Github Action让你的项目更加高效,快速响应市场变化。 一、什么是CI? CI(持续集成&…

前端基础(三十六):读取本地音视频设备并进行播放

效果 navigator.mediaDevices.enumerateDevices 请求媒体输入和输出设备的列表,例如麦克风,摄像机,耳机设备等 navigator.mediaDevices.getUserMedia 会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream&#xff0c…

有关于我在用uniapp开发的问题

1、uniapp做微信小程序,内嵌H5进行支付 其本质是这样的,在微信小程序种,用web-view嵌入H5页面,然后通过web-view的url对H5进行传参,H5传参后可以做一些处理,然后再把参数传给小程序进行支付 //uniapp小程…

云开发校园微社区-二手交易兼职交友微信小程序

云开发校园微社区微信小程序开源源码,这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码,可以给你提供快捷方便的校园生活,有很多有趣实用的板块和功能,如:闲置交易、表白交友、疑问互答、任务兼职…

使用腾讯云轻量应用服务器搭建网站教程

腾讯云轻量应用服务器怎么搭建网站?太简单了,轻量服务器选择宝塔Linux镜像,然后在宝塔面板上添加站点,以WordPress建站为例,腾讯云服务器网来详细说下腾讯云轻量应用服务器搭建网站全流程,包括轻量服务器配…

【企业微信多选的星期数据生成如“周一、周三至周六“】

目标效果如下图 实现这个过程首先是要找到逻辑,这个看似简单的操作却属实让我想了很久。 首先要了解需求 根据拿到的数据得到生成符合要求的字符串。中间有连续的星期大于三天的,开始和结束星期中间要有"至"。 分析逻辑 一、判断开始日期和…

Linux常用命令——emacs命令

在线Linux命令查询工具 emacs 功能强大的全屏文本编辑器 补充说明 emacs命令是由GNU组织的创始人Richard Stallman开发的一个功能强大的全屏文本编辑器,它支持多种编程语言,具有很多优良的特性。有众多的系统管理员和软件开发者使用emacs。 语法 e…

在线考试系统

在线考试系统 简介 该系统由C#开发语言开发,数据库是sql server2016,前端用到的前端技术有Bootstrap,js,css等前端技术,同时用到的.Net Core MVC的技术框架。另外本系统也支持mysql,暂未调试。 该系统是…

Exceptional C++读书笔记——泛型程序设计与C++标准库

更新中——上次更新&#xff08;2023.07.13-23:07&#xff09; 迭代器&#xff08;iterator&#xff09; #include <iostream> #include <vector> #include <iterator> #include <algorithm>int main() { std::vector<int> e; std::copy(…

10_SPI_Flash 连续写实验

10_SPI_Flash 连续写实验 1. 实验目标2. 连续写方法3. 操作时序4. 流程框图4.1 顶层模块4.2 连续写模块 5. 波形图6. RTL6.1 flash_seq_wr_ctrl6.2 spi_flash_seq_wr 7. Testbench 1. 实验目标 使用页写指令&#xff0c;将串口发送过来的连续不定量数据写入 Flash。本实验中&a…

Redis【实战篇】---- 秒杀优化

Redis【实战篇】---- 秒杀优化 1. 秒杀优化-异步秒杀思路2. 秒杀优化-Redis完成秒杀资格判断3. 秒杀优化-基于阻塞队列完成秒杀优化 1. 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c…

如何在没有软件的情况下将 PDF 转换为 PPT(100% 免费)

演示文稿由文字、图片、音频、动画等元素组成&#xff0c;通常用于会议、课堂或演讲中&#xff0c;展示演讲者想要表达的主要内容。如果您遇到重要文档以 PDF 格式存储&#xff0c;但现在需要转换为 PPT 格式的情况&#xff0c;请不要担心。我们本指南的目标是帮助用户将 PDF 转…

Qt + QR-Code-generator 生成二维码

0.前言 之前使用 libgrencode 生成二维码&#xff0c;LGPL 协议实在不方便&#xff0c;所以需要找一个 github 星星多的&#xff0c;代码简单最好 header-only&#xff0c;协议最好是 MIT 或者兼容协议而不是 GPL 或者 LPGL。 QR-Code-generator 正好符合这个要求&#xff0c…

【自定义类型】(结构体、枚举、联合)

结构体内存对齐&#xff1a; 计算结构体的大小 结构体成员不是按照顺序在内存中连续存放的而是有一定的对齐规则的 结构体内存对齐的规则&#xff1a; 1、结构体的第一个成员永远放在相比于结构体变量起始位置的偏移量为0的位置。 2、从第二个成员开始&#xff0c;往后的每…

Gateway服务集成Nacos2021.0.4错误解决

问题 gateway服务集成nacos&#xff0c;启动后报错&#xff1a; Caused by: com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information:; 版本&#xff1a; jdk:1.8 spring-b…