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

news2024/11/18 11:20:57

请添加图片描述

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

本文收录于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.coloradmin.cn/o/706919.html

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

相关文章

SATA 和 ESATA 数据线针脚定义

esata定义 eSATA provides a variant of SATA for external connectivity. It uses a more robust connector, longer shielded cables, and stricter electrical standards. The protocol and logical signaling are identical to internal SATA. eSATA was standardized in 2…

【企业架构框架】SOGAF 通用实体框架 (CoE)

Salesforce 运营、治理和架构框架 (SOGAF) 将 MIT-CISR 企业架构框架应用于 Salesforce 实施和程序。 介绍 为共同实体(即卓越中心)制定一个明确的定义是很棘手的。转换程序中的通用实体 (CoE) 有多种名称: “卓越中心”、“C4E”、“专业中心…

MYSQL-UNION

语法: UNION 操作符用来合并两个 SELECT 语句的结果 SELECT statement UNION [DISTINCT | ALL] SELECT statement UNION 中的 SELECT 语句中的列数、列顺序必须相同 UNION是双目操作符,需要两个SELECT语句作为操作数,UNION后面可以接DISTINCT或者ALL 如果不写DISTINCT或者…

【已解决】Nacos 2.0.2启动异常以及正常启动后账号密码错误问题解决

1.正常解压压缩文件后,在bin目录下直接双击startup.cmd启动Nacos(或bin目录下命令行输入startup.cmd,新版本需要输入startup,cmd -m standalone),发现启动报错。 报错信息我们可以看到大量的sql错误,其中不乏缺少表,jdbc连接异常…

session和token

一、使用HttpSession接口的setAttribute()方法将cookie保存到客户端的浏览器中 二、单点登录逻辑 1、客户端服务有一个过滤器,先判断有没有重定向回来的token值(过去session用,没有也没关系) 2、客户端过滤器再判断session中有没…

使用nodejs操作postgresql

环境准备 1 navicat premium 2 postgresql 14 装完上述软件后,远程连接上之后如下: 自己建立一个用户表users,然后随机生成一些数据即可 步骤 这里我将项目放到了gticode里,可以下载下来使用 https://gitcode.net/wangbiao9292/nodejs-p…

基于物联网、区块链技术的质量管控防伪溯源系统源码

一物一码防伪溯源系统能准确获取产品生产经营各个环节的真实信息,利用物联网、云计算 、区块链、人工智能、5G等先进技术,结合特有的码码关联和RSA加密验证技术,建立区块链的“身份证”,针对产品生长到销售各环节的质量安全数据进…

二、1什么是面向对象编程?

你好,我是程序员雪球,接下来与你一起学习什么是面向对象编程。 面向对象编程是一种编程风格。它以类或对象作为组织代码的基本单元,并将封装,抽象,继承,多态四个特性,作为代码设计的实现基石。 …

Spring Boot 中的 @RabbitListenerContainerFactory 注解

Spring Boot 中的 RabbitListenerContainerFactory 注解 1. 什么是 RabbitListenerContainerFactory 在 Spring Boot 中,我们可以使用 RabbitListener 注解来监听 RabbitMQ 中的消息。RabbitListener 注解会自动创建一个监听器容器,用于接收和处理消息…

Leetcode-每日一题【876.链表的中间结点】

题目 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为 3…

云贝餐饮连锁独立版 v2.6.1+公众号+小程序端+抖音端端+全插件免授权安装使用教程

云贝餐饮连锁版这系统应该持续做好多年了比较完善,以前的版本都需要授权一直没使用,整体测试下感觉从体验上还有逻辑设计上都非常不错,首页、会员中心支持DIY装修,配送支持多种平台对接,基本上餐饮行业需要的功能都能满…

Plant, Cell Environment:DAP-seq技术在ZmEREB57调控OPDA合成提高玉米耐盐性研究中的应用

茉莉酸类化合物(JAs)是植物中普遍存在的一类植物激素,在非生物胁迫响应中发挥重要作用。12-氧-植物二烯酸(OPDA)可通过α-亚麻酸(ALA)代谢途径合成JA,是一种重要的JA前体分子。APETA…

DNSPod十问朱智:为什么商场越来越像美食中心?

本期嘉宾 朱智 赢商tech副总裁 朱智,赢商tech副总裁兼首席产品官。线下大数据服务的领军人物,福布斯中国“30under30”人物,拥有10余年线下商业大数据服务经验,致力于商业地产数智化升级领域,服务了包括新城集团、新…

【Linux系统编程】Linux权限理解 及 权限管理

文章目录 前言1. Linux权限的概念2. Linux权限管理2.1 文件类型2.2 Linux用户分类及切换用户分类普通用户—>rootroot—>普通用户普通用户之间的切换单条指令的提权 2.3 用户角色划分/文件访问者的分类(人)2.4 文件类型和访问权限(事物…

windows环境部署nacos注意事项

1.nacos与 eureka部署方式有所不同,nacos需要到GitHub去下载,下载地址:https://github.com/alibaba/nacos,下载好后将文件放至项目中 2.需要将nacos用到的数据文件导入到数据库中 3.需要修改nacos的配置文件 注意:修改…

wampServer安装Redis 扩展

第一步:查看php版本信息 使用 phpinfo() 函数查看 PHP 的版本信息(用于选择扩展包) 版本信息:PHP版本为 8.0.26,编译器版本 Visual C 2019,CPU架构 x64 。 第二步:根据第一步信息的版本选择扩…

jpg图片马使用条件竞争的方法实现二次渲染绕过

文章目录 一、制作图片马二、上传图片马三、上传攻击四、访问攻击五、启动攻击 一、制作图片马 首先使用cmd制作jpg图片马 二、上传图片马 然后打开bp拦截上传该图片马 三、上传攻击 对拦截的结果发送到攻击模块 清除所有变量,payloads做如下设置 四、访问…

VBA之正则表达式(42)-- 快速提取名称

实例需求:A列为待处理数据,现需要从中提取商品名、通用名、胰岛素笔相关信息,保存到B列至D列,需要注意如下几点: 胰岛素笔(E列)数据只存在于每组产品的第一行记录中,例如第2行数据中…

redis配置和优化

关系数据库与非关系型数据库 关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于关系型数据库的…

[MySQL]1292 - Incorrect date value: ‘0000-00-00‘ for column ‘xxx‘ at row 1

第一步、修改mysql配置文件 sql_mode去掉NO_ZERO_DATE 注意:如果mysql配置文件内容没有sql_mode,需要手动加上 mysql配置文件示例: 第二步、重启MySQL