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


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

 

MySQL--數據表操作:

  會用到的查詢操作.

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. 行轉列和列轉行

  a) 列轉行

創建-->學生-科目分數表
(這種建表方式需要提前把所有的科目列都設計好,如果往后需要添加科目的話需要改動表結構)
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) 行轉列

創建一個--學生分數科目表
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     |
+--------+--------+--------+--------+--------+

 


免責聲明!

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



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