完全搞懂数据库行列转换查询
一. 前言
不知道小伙伴们发现没有,但凡面试后端开发,数据库的查询都是必问的!更有甚者,面试官会直接让我们在答题纸上手写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子句的使用。小伙伴们可以对照代码多练习加深理解,下次再遇见类似的问题应该就不成问题啦!
相关推荐HOT
更多>>怎么将string字符串转换成byte[]数组?
例如,使用默认字符集转换可以如下所示: 也可以指定字符集: 这将使用UTF-8字符集将字符串转换成字节数组。详情>>
2023-04-25 17:14:58如何禁用浏览器的前进和后退功能
URL) 本质就是在进入页面或者路由跳转的时候在历史记录中保存一条没有意义的记录,这样用户在点击前后后退按钮的时候就没有效果。详情>>
2023-04-19 10:36:58react传值是什么意思?
react是组件化的框架,组件实例间作用域是互相隔离的,所以组件间的通信就变成了开发过程中常常要解决的问题,根据场景可以分为: 父子组...详情>>
2023-04-18 17:23:22使用IE浏览器遇见过哪些兼容问题?
在IE6中,块元素设置float并且有水平方向的margin时,margin显示出来会比设置的值大,会导致最后一块元素被顶到下面去; 解决办法:在CSS文...详情>>
2023-04-12 09:21:12