mysql横表和纵表以及互转实例

一.纵表

   170640_UWGt_1394041.png   

  相关建表语句:

CREATE TABLE `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `username` varchar(50) DEFAULT NULL COMMENT '姓名',
  `course` varchar(50) DEFAULT NULL COMMENT '科目',
  `grade` double DEFAULT NULL COMMENT '分数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='纵表'

INSERT INTO `table1` (username,course,grade) VALUES('张三','语文',90);
INSERT INTO `table1` (username,course,grade) VALUES('李四','英语',88);
INSERT INTO `table1` (username,course,grade) VALUES('王五','数学',60);
INSERT INTO `table1` (username,course,grade) VALUES('张三','英语',120);


二.纵表转横表

      纵表转横表后结果:

171238_l3HY_1394041.png

相关sql语句:

SELECT username,
SUM(CASE course WHEN '语文' THEN grade ELSE 0 END) AS 'chinese',
SUM(CASE course WHEN '数学' THEN grade ELSE 0 END) AS 'marth',
SUM(CASE course WHEN '英语' THEN grade ELSE 0 END) AS 'english'           
FROM Table1 
GROUP BY username

把转换后的结果创建为一个新表,相关sql:

172527_CecF_1394041.png

CREATE TABLE table2
SELECT id id,username,
SUM(CASE course WHEN '语文' THEN grade ELSE 0 END) AS 'chinese',
SUM(CASE course WHEN '数学' THEN grade ELSE 0 END) AS 'marth',
SUM(CASE course WHEN '英语' THEN grade ELSE 0 END) AS 'english'           
FROM Table1 
GROUP BY username;
ALTER TABLE table2 COMMENT '横表';


三.横表

     此时,把简单的横表数据结果,调整为如下截图所示:

173807_DrtT_1394041.png

相关sql代码:

UPDATE `table2` SET chinese = 80,marth = 90,english=70 WHERE id = 1;
UPDATE `table2` SET chinese = 90,marth = 85,english=95 WHERE id = 2;
UPDATE `table2` SET chinese = 88,marth = 75,english=90 WHERE id = 3;


四.横表转纵表

横表转纵表结果:      

175916_T79b_1394041.png

相关sql代码:

SELECT username,'chinese' AS course,chinese AS grade FROM table2 
UNION ALL
SELECT username,'marth' AS course,marth AS grade FROM table2 
UNION ALL
SELECT username,'english' AS course,english AS grade FROM table2
ORDER BY username,course DESC


规则:

case 变量表达式              --对某个‘变量表达式’进行判断
when 值                      --当‘变量表达式’是某个‘值’时
then 返回值表达式            --返回‘返回值表达式’值
[when...
then...
.....]                       --可以进行多次判断
[else 其他情况返回值表达式]  --不符合所有when后面的就是其他情况了
end                          --结束


五.横表与纵表执行效率比

横表:后台数据库管理员操作简单,直观,清晰可见,一目了然。但若要给横表中添加一个或者多个字段,就须重建表结构。

纵表:对于横表的弊端,纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小。但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多。在查询的时候用到group等函数会大大降低执行效率。纵表的初始映射要慢一些,纵表的变更的映射可能要快一些,如果只是改变了单个字段时,毕竟横表字段比纵表要多很多。


六.转换的场景

1.在平时的开发过程中,可能会遇到字段的添加或者更好的维护和管理大数据量的表,就 会涉及到纵表和横表之间的转换。

2.把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。

转载于:https://my.oschina.net/xsh1208/blog/653801

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值