mysql橫表和縱表以及互轉實例

一.縱表

      

  相關建表語句:java

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);


二.縱錶轉橫表

      縱錶轉橫表後結果:sql

相關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:函數


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 '橫表';


三.橫表

     此時,把簡單的橫表數據結果,調整爲以下截圖所示:
大數據

相關sql代碼:spa

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;


四.橫錶轉縱表

橫錶轉縱表結果:      設計

相關sql代碼:code

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


規則:orm

case 變量表達式              --對某個‘變量表達式’進行判斷
when 值                      --當‘變量表達式’是某個‘值’時
then 返回值表達式            --返回‘返回值表達式’值
[when...
then...
.....]                       --能夠進行屢次判斷
[else 其餘狀況返回值表達式]  --不符合全部when後面的就是其餘狀況了
end                          --結束


五.橫表與縱表執行效率比

橫表:後臺數據庫管理員操做簡單,直觀,清晰可見,一目瞭然。但若要給橫表中添加一個或者多個字段,就須重建表結構。ci

縱表:對於橫表的弊端,縱表中只須要添加一條記錄,就能夠添加一個字段,所消耗的代價遠比橫表小。可是縱表的對於數據描述不是很清晰,並且會形成數據庫數量不少。在查詢的時候用到group等函數會大大下降執行效率。縱表的初始映射要慢一些,縱表的變動的映射可能要快一些,若是隻是改變了單個字段時,畢竟橫表字段比縱表要多不少。


六.轉換的場景

1.在平時的開發過程當中,可能會遇到字段的添加或者更好的維護和管理大數據量的表,就 會涉及到縱表和橫表之間的轉換。

2.把不容易改動表結構的設計成橫表,把容易常常改動不肯定的表結構設計成縱表。

相關文章
相關標籤/搜索