MySQL--數據表操做--行轉列和列轉行

原創:轉載需註明原創地址 https://www.cnblogs.com/fanerwei222/p/11782549.html

 

MySQL--數據表操做:html

  會用到的查詢操做.spa

1. Limit的用法:設計

查詢從下標5開始日後的10條數據(下標默認爲0開始) SELECT
    * 
FROM stu_user LIMIT 5, 10; 查詢從下標5開始日後的全部數據(下標默認爲0開始) SELECT
    * 
FROM stu_user LIMIT 5,- 1; 查詢前5條數據 SELECT
    * 
FROM stu_user LIMIT 5;

2. 行轉列和列轉行code

  a) 列轉行htm

建立-->學生-科目分數表
(這種建表方式須要提早把全部的科目列都設計好,若是日後須要添加科目的話須要改動表結構) CREATE TABLE stu_score ( stu_id INT NOT NULL, sname VARCHAR ( 20 ) NOT NULL, chscore CHAR ( 3 ) DEFAULT '0', mathscore CHAR ( 3 ) DEFAULT '0', enscore CHAR ( 3 ) DEFAULT '0' ); 表結構 +-----------+-------------+------+-----+---------+-------+
| Field        | Type        | Null   | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| stu_id            | int(11)     | NO    |       | NULL    |       |
| sname     | varchar(20) | NO  |       | NULL    |       |
| chscore    | char(3)     | YES   |       | 0         |       |
| mathscore | char(3)     | YES  |       | 0         |       |
| enscore    | char(3)     | YES   |       | 0         |       |
+-----------+-------------+------+-----+---------+-------+
 插入數據 INSERT INTO stu_score VALUES ( 1, '張三', '77', '88', '66' ); INSERT INTO stu_score VALUES ( 2, '李四', '23', '45', '13' ); INSERT INTO stu_score VALUES ( 3, '王五', '94', '63', '45' ); 數據列表 +----+--------+---------+-----------+---------+
| id | sname  | chscore | mathscore | enscore |
+----+--------+---------+-----------+---------+
|  1 | 張三   | 77      | 88        | 66      |
|  2 | 李四   | 23      | 45        | 13      |
|  3 | 王五   | 94      | 63        | 45      |
+----+--------+---------+-----------+---------+
 列轉行(科目分數列轉換爲固定的科目值行數據和分數彙總列) 本質就是用UNION合併分批查詢的數據, 有多少科目列須要轉則分批多少次查詢 SELECT stu_id, sname, '語文' AS course, chscore AS score FROM stu_score UNION
SELECT stu_id, sname, '數學' AS course, mathscore AS score FROM stu_score UNION
SELECT stu_id, sname, '英語' AS course, enscore AS score FROM stu_score ORDER BY stu_id; 列轉行後的數據 +--------+--------+--------+-------+
| stu_id | sname  | course | score |
+--------+--------+--------+-------+
|      1 | 張三   | 語文   | 77    |
|      1 | 張三   | 數學   | 88    |
|      1 | 張三   | 英語   | 66    |
|      2 | 李四   | 語文   | 23    |
|      2 | 李四   | 數學   | 45    |
|      2 | 李四   | 英語   | 13    |
|      3 | 王五   | 英語   | 45    |
|      3 | 王五   | 語文   | 94    |
|      3 | 王五   | 數學   | 63    |
+--------+--------+--------+-------+

 

  b) 行轉列blog

建立一個--學生分數科目表
CREATE TABLE stu_score_pro ( stu_id INT NOT NULL, sname VARCHAR ( 20 ) NOT NULL, course VARCHAR ( 20 ) NOT NULL, score CHAR ( 3 ) NOT NULL ); 表結構 +--------+-------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| stu_id  | int(11)      | YES  |     | NULL    |       |
| sname | varchar(20) | NO |     | NULL    |       |
| course | varchar(20) | NO  |     | NULL    |       |
| score   | char(3)      | NO  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
 插入數據 INSERT INTO stu_score_pro VALUES ( 1, '張三', '語文', '77' ); INSERT INTO stu_score_pro VALUES ( 1, '張三', '數學', '88' ); INSERT INTO stu_score_pro VALUES ( 1, '張三', '英語', '66' ); INSERT INTO stu_score_pro VALUES ( 2, '李四', '語文', '23' ); INSERT INTO stu_score_pro VALUES ( 2, '李四', '數學', '45' ); INSERT INTO stu_score_pro VALUES ( 2, '李四', '英語', '13' ); INSERT INTO stu_score_pro VALUES ( 3, '王五', '語文', '94' ); INSERT INTO stu_score_pro VALUES ( 3, '王五', '數學', '63' ); INSERT INTO stu_score_pro VALUES ( 3, '王五', '英語', '45' ); 數據列表 +--------+--------+--------+-------+
| stu_id | sname  | course | score |
+--------+--------+--------+-------+
|      1 | 張三   | 語文   | 77    |
|      1 | 張三   | 數學   | 88    |
|      1 | 張三   | 英語   | 66    |
|      2 | 李四   | 語文   | 23    |
|      2 | 李四   | 數學   | 45    |
|      2 | 李四   | 英語   | 13    |
|      3 | 王五   | 語文   | 94    |
|      3 | 王五   | 數學   | 63    |
|      3 | 王五   | 英語   | 45    |
+--------+--------+--------+-------+
 行轉列(正常的行數據根據列中有相同的值轉成對應的列) SELECT stu_id, sname, max( CASE WHEN course = '語文' THEN score END ) AS 語文, max( CASE WHEN course = '數學' THEN score END ) AS 數學, max( CASE WHEN course = '英語' THEN score END ) AS 英語 FROM stu_score_pro GROUP BY stu_id, sname; 行轉列後的數據 +--------+--------+--------+--------+--------+
| stu_id | sname  | 語文   | 數學   | 英語   |
+--------+--------+--------+--------+--------+
|      1 | 張三   | 77     | 88     | 66     |
|      2 | 李四   | 23     | 45     | 13     |
|      3 | 王五   | 94     | 63     | 45     |
+--------+--------+--------+--------+--------+
相關文章
相關標籤/搜索