完全搞懂数据库行列转换查询
一. 前言
不知道小伙伴们发现没有,但凡面试后端开发,数据库的查询都是必问的!更有甚者,面试官会直接让我们在答题纸上手写SQL代码。其中数据库表的行列转换查询,就是很常考察的一道题目!接下来就来给大家解析一下数据库行列转换查询的实现过程,希望能够帮到你。
二. 行转列需求展示
我们先来看看MySQL实现行转列查询的一个需求。
索尔老师先给大家展示一下效果图,按行查询的结果如下图所示:
行转列后查询的结果如下图所示:
三. 代码实现
接下来索尔就直接给大家展示这个需求的代码实现吧。
CREATE TABLE `test1` (
`id` int NOT NULL,
`name` varchar(8) DEFAULT NULL,
`course` varchar(6) DEFAULT NULL,
`score` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test1`(id,name,course,score) VALUES
('1', '张三', '语文', '87'),
('2', '张三', '数学', '97'),
('3', '张三', '英语', '87'),
('4', '李四', '语文', '99'),
('5', '李四', '数学', '96'),
('6', '李四', '英语', '89'),
('7', '王五', '语文', '90'),
('8', '王五', '数学', '92'),
('9', '王五', '英语', '94');
select name,
max(case course when '语文' then score else 0 end)语文,
max(case course when '数学' then score else 0 end)数学,
max(case course when '英语' then score else 0 end)英语
from test1 group by name;
此处用到max函数,这主要是为了将无数据的字段设置为0,防止出现字段值为NULL造成出错异常。
四. 列转行需求
我们再来看看MySQL实现列转行查询的一个需求。
现创建表test2,在未转换前查询结果如下:
列转行的sql语句:
select user_name,'语文' COURSE,CN_SCORE as SCORE from test2
union select user_name,'数学' COURSE,MATH_SCORE as SCORE from test2
union select user_name,'英语' COURSE,EN_SCORE as SCORE from test2 order by user_name,COURSE;
列转行查询的结果如下图所示:
五. 小结
最后给大家总结一下,无论是行转列或者是列转行,关键就是sql子句的使用。小伙伴们可以对照代码多练习加深理解,下次再遇见类似的问题应该就不成问题啦!
猜你喜欢LIKE
相关推荐HOT
更多>>算法评测标准---空间复杂度是什么?
算法评测标准---空间复杂度是什么?空间复杂度是什么?一. 空间复杂度的概念,复杂度(Space Complexity),是对一个算法在运行过程中临时占用存...详情>>
2023-03-23 20:15:04怎么用css画三角形?
怎么用css画三角形?border这里的像素值 和 border-left这里的像素值可以是不一样的,也可以是一样的,根据三角形的形状来进行具体设置值即可,要...详情>>
2023-03-23 15:27:16Maven集成 tomcat插件及使用教程
在实际的项目开发中,特别是分布式项目,往往有N多个子项目需要同时启动测试。这样多个项目引用tomcat插件,配置不同的端口,就可以同时启动N个...详情>>
2023-02-23 14:44:00扫盲CSS中常见的单位
Px是pixel的简写, 被称之为像素单位, px可以在计算机屏幕上,能达到预期的效果,在打印机和其它的高分辨率设备上,它又能取得所希望的效果, 一...详情>>
2023-02-16 13:47:00热门推荐
java变量的作用域是什么?
沸什么是Java循环?
热switch语句的case和default有顺序吗?
热SpringBoot中使用redis 新手入门
新vue的watch和computed的区别以及特点是什么?
算法评测标准---空间复杂度是什么?
Spring整合Junit框架是什么?
break和continue必须要在循环中使用吗?
怎么用css画三角形?
手把手教你搭建Oauth2授权服务!
为什么不能用break?
什么是foreach循环?它有哪些优点和局限性?
react生命周期?16版本删除了什么钩子函数?为什么删除?
经典面试题:static加载机制你知道吗?