mysql-橫表與縱表互轉


一、認識橫表與縱表:

橫表就是普通的建表方式,如一個表結構為: 主鍵、字段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
;

以上。

來自:https://blog.csdn.net/LZQDYY/article/details/79513763


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM