mysql-橫表與縱表互轉
阿新 • • 發佈:2020-08-10
一、認識橫表與縱表:
橫表就是普通的建表方式,如一個表結構為: 主鍵、欄位1、欄位2、欄位3。。。
如果變成縱表後,則表結構為: 主鍵、欄位程式碼、欄位值,欄位程式碼則為欄位1、欄位2、欄位3。
縱表對從資料庫到記憶體的對映效率是有影響的,但細一點說也要一分為二:
縱表的初始對映要慢一些; 縱表的變更的對映可能要快一些,如果只是改變了單個欄位時,畢竟橫表字段比縱表要多很多。
1、建立縱表結構 Table_A:
create table Table_A
(
姓名 varchar(20),
課程 varchar(20),
成績 int
);
2、插入縱表Table_A測試資料:
insert into Table_A(姓名,課程,成績) values('張三','語文',60);
insert into Table_A(姓名,課程,成績) values('張三','數學',70);
insert into Table_A(姓名,課程,成績) values('張三','英語',80);
insert into Table_A(姓名,課程,成績) values('李四','語文',90);
insert into Table_A(姓名,課程,成績) values('李四','數學',100);
3、建立橫表結構 Table_B:
create table Table_B ( 姓名 varchar(20), 語文 int, 數學 int, 英語 int );
4、插入橫表Table_B測試資料:
insert into Table_B(姓名,語文,數學,英語) values('張三',60,70,80);
insert into Table_B(姓名,語文,數學,英語) values('李四',90,100,0);
二、縱表變橫表
縱表結構 Table_A --> 橫表結構 Table_B
方法:聚合函式[max或sum]配合case語句
INSERT INTO table_b select 姓名, sum(case 課程 when '語文' then 成績 else 0 end) as 語文, sum(case 課程 when '數學' then 成績 else 0 end) as 數學, sum(case 課程 when '英語' then 成績 else 0 end) as 英語 from Table_A group by 姓名 ;
三、橫表變縱表
橫表結構 Table_B --> 縱表結構 Table_A
方法:union all
INSERT INTO table_A
select 姓名, '語文' as 課程, 語文 as 成績 from Table_B
union all
select 姓名, '數學' as 課程, 數學 as 成績 from Table_B
union all
select 姓名, '英語' as 課程, 英語 as 成績 from Table_B
order by 姓名,課程 desc
;