当前位置: 首页 > news >正文

MySql行转列、列转行

现mysql中有一张表php_user表,表结构为: 

表中数据有: 

现在想查询出来不同学生的语数外成绩在一行显示,那么需要用到行转列的用法,

一、行转列

1、使用case...when....then 进行行转列
MAX(case when 条件 then 列内容 else 不匹配时显示内容 end) 列名。具体sql如下:

2、使用IF() 进行行转列:

3、利用SUM(IF()) 生成列,直接生成结果不再利用子查询

二、列转行

 建表语句:

CREATE TABLE tb_score1(
    id INT(11) NOT NULL auto_increment,
    userid VARCHAR(20) NOT NULL COMMENT '用户id',
    cn_score DOUBLE COMMENT '语文成绩',
    math_score DOUBLE COMMENT '数学成绩',
    en_score DOUBLE COMMENT '英语成绩',
    po_score DOUBLE COMMENT '政治成绩',
    PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET = utf8;

 插入数据:

INSERT INTO tb_score1(userid,cn_score,math_score,en_score,po_score) VALUES ('001',90,92,80,0);
INSERT INTO tb_score1(userid,cn_score,math_score,en_score,po_score) VALUES ('002',88,90,75.5,0);
INSERT INTO tb_score1(userid,cn_score,math_score,en_score,po_score) VALUES ('003',70,85,90,82);

 查询数据表中的内容(即转换前的结果)

SELECT * FROM tb_score1

转换后:

本质是将userid的每个科目分数分散成一条记录显示出来。

直接上SQL:

SELECT userid,'语文' AS course,cn_score AS score FROM tb_score1
UNION ALL
SELECT userid,'数学' AS course,math_score AS score FROM tb_score1
UNION ALL
SELECT userid,'英语' AS course,en_score AS score FROM tb_score1
UNION ALL
SELECT userid,'政治' AS course,po_score AS score FROM tb_score1
ORDER BY userid

这里将每个userid对应的多个科目的成绩查出来,通过UNION ALL将结果集加起来,达到上图的效果。

附:UNION与UNION ALL的区别(摘):

   1.对重复结果的处理:UNION会去掉重复记录,UNION ALL不会;

   2.对排序的处理:UNION会排序,UNION ALL只是简单地将两个结果集合并;

   3.效率方面的区别:因为UNION 会做去重和排序处理,因此效率比UNION ALL慢很多;

 

转载于:https://www.cnblogs.com/zhaosq/p/10033260.html

相关文章:

  • @ModelAttribute注解使用
  • docker容器内的网络抓包
  • 【linux】linux重启tomcat + 实时查看tomcat启动日志
  • JavaScript基础——基本概念
  • 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Innodb之全局共享内存
  • sql 开窗函数
  • 我的友情链接
  • 实现菜单下拉伸展折叠效果demo
  • Android中的树状(tree)列表
  • 基于MVC思想实现一个简单的贪吃蛇小游戏
  • Device Tree Usage 【转】
  • 从容器到云原生 – 极致弹性
  • 【NetApp】FPolicy的使用流程图
  • 【Amaple教程】5. 插件
  • Cookie 在前端中的实践
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ECS应用管理最佳实践
  • JavaScript设计模式系列一:工厂模式
  • leetcode46 Permutation 排列组合
  • Magento 1.x 中文订单打印乱码
  • Node项目之评分系统(二)- 数据库设计
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 构造函数(constructor)与原型链(prototype)关系
  • 和 || 运算
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #if 1...#endif
  • #if和#ifdef区别
  • #单片机(TB6600驱动42步进电机)
  • (1) caustics\
  • (2.2w字)前端单元测试之Jest详解篇
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)http协议
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @Autowired 与@Resource的区别
  • [ 转载 ] SharePoint 资料
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [Android 13]Input系列--获取触摸窗口
  • [android] 手机卫士黑名单功能(ListView优化)
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [CSS]CSS 的背景