一、横表和纵表
横表:通常指我们平时在数据库中建立的表,是一种普通的建表方式。
(主键、字段1、字段2......)如:时间、客户ID,基本通话费、漫游通话费,国内长途费、国际长途费....。
纵表:一般不多见,在表结构不确定的时候,如需增加字段的情况下的一种建表方式。
二、执行效率
横表:后台数据库管理员操作简单,直观,清晰可见,一目了然。但若要给横表中添加一个或者多个字段,就须重建表结构。
纵表:对于横表的弊端,纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小。但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多。在查询的时候用到group等函数会大大降低执行效率。纵表的初始映射要慢一些,纵表的变更的映射可能要快一些,如果只是改变了单个字段时,毕竟横表字段比纵表要多很多。
三、转换
1.在平时的开发过程中,可能会遇到字段的添加或者更好的维护和管理大数据量的表,就
会涉及到纵表和横表之间的转换。
2.把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。
举例:
注:DECODE函数是Oracle
PL/SQL的功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。
sign函数:在数学和计算机运算中,其功能是取某个数的符号(正或负):
当x≥0,sign(x)=1; 当x<0, sign(x)=-1;
纵表转横表
纵表结构: TEST_Z2H
FNAME
FTYPE
FVALUE
员工
zaocan
10
员工
zhongcan
20
员工
wancan
5
转换后的表结构:
FNAME
ZAOCAN_VALUE
ZHONGCAN_VALUE
WANCAN_VALUE
员工
10
20
5
纵表转横表SQL示例:
SELECT FNAME,
SUM(DECODE(FTYPE,'zaocan',FVALUE,0))
AS ZAOCAN_VALUE,
SUM(DECODE(FTYPE,'zhongcan',FVALUE,0))
AS ZHONGCAN_VALUE,
SUM(DECODE(FTYPE,'wancan',FVALUE,0))
AS WANCAN_VALUE
FROM TEST_Z2H
GROUP BY FNAME;
横表转纵表
横表结构: TEST_H2Z
ID
姓名
语文
数学
英语
1
张三
80
90
70
2
李四
90
85
95
3
王五
88
75
90
转换后的表结构:
ID
姓名
科目
成绩
1
张三
语文
80
2
张三
数学
90
3
张三
英语
70
4
李四
语文
90
5
李四
数学
80
6
李四
英语
99
7
王五
语文
85
8
王五
数学
96
9
王五
英语
88
横表转纵表SQL示例:
SELECT 姓名,'语文'
AS
科目,语文
AS
成绩
FROM
TEST_H2Z
UNION
ALL
SELECT 姓名,'数学'
AS
科目,数学
AS
成绩
FROM
TEST_H2Z
UNION
ALL
SELECT 姓名,'英语'
AS
科目,英语
AS
成绩
FROM
TEST_H2Z
ORDER BY 姓名,科目 DESC;