1、认识横表纵表
如上图,t1为纵表,一行记录一个属性值(key—value),若有多个属性值则用多行来记录
t2为横表,一行记录了所有的属性值
横表设计简单,易操作,可以直观的看到一行记录的所有值,但如果现在要把这个表加一个字段,那么就必须重建表结构
而纵表只需加一条记录就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,查询也麻烦
所以:应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。
2、相互转换
2.1 纵表转横表
参考:
select
*
from (
select
,
max(case a.course when 'language' then a.score else '' end) as '语文',
max(case a.course when 'math' then a.score else '' end) as '数学',
max(case a.course when 'english' then a.score else '' end) as '英语'
from t1 a
group by
) x;
结果为:
2.2 横表转纵表
union all:用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中,多个 SELECT 语句会删除重复的数据。
select
name,
'language' as course,
language as score
from
t2
union all
select
name,
'math' as course,
math as score
from
t2
union all
select
name,
'english' as course,
english as score
from
t2;
结果为: