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     |
+--------+--------+--------+--------+--------+
相关文章
相关标签/搜索