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 |
+--------+--------+--------+--------+--------+
MySQL--数据表操作--行转列和列转行的更多相关文章
- MySQL 数据表操作
MySQL 数据表操作 创建MySQL数据表需要以下信息: -表名: -表字段名: -定义每个表字段: 一.创建数据表 1)mysql> create table table_name (c ...
- mysql 数据表操作 目录
mysql 数据表操作 存储引擎介绍 mysql 使用存储引擎 mysql 数据表的增删改查 mysql 数据类型 mysql 约束条件
- mysql数据表操作&库操作
首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...
- mysql 数据表操作 存储引擎介绍
一 什么是存储引擎? 存储引擎就是表的类型. mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...
- MYSQL数据表操作语句
1.查看某数据库中的表 SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern'] SHOW TABLES列举了给定数据库中的非TEMPORARY表.也可以使 ...
- MySQL数据表操作
创建数据表 打开数据库 USE 数据库名称 mysql> USE D1; Database changed 使用 USE D1:表示打开数据库D1,我们可以通过SELECT DATABASE() ...
- 03、MySQL—数据表操作
1.创建数据表 基本语法:create table 表名(字段名 字段类型 [字段属性], 字段名 字段类型 [字段属性],…) [表选项] 范例:创建数据表 以上错误说明:表必须放到对应的数据库下: ...
- MySQL数据表操作(DDL)
一.创建数据表 语法:create table 表名称(字段 字段类型 [字段属性],字段 字段类型 [字段属性],...) [表选项]; 表选项:数据表的属性,一般包括engine.charset. ...
- 设置mysql数据表列自动递增以及数据行插入操作
创建mysql数据表,设置id列递增.主键create table running_log ( id int primary key auto_increment, routename varchar ...
- Mysql之数据表操作
数据表操作: 查看当前数据库中所有的表: show tables; 查看当前使用数据库: select database(); 使用数据表: use 表名; 创建数据表: create table 数 ...
随机推荐
- 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果
查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...
- 编写Java程序,使用 dom4j 创建一个 XML 文档,文档名为“city.xml”。注意该文档的格式和数据
查看本章节 查看作业目录 需求说明: 使用 dom4j 创建一个 XML 文档,文档名为"city.xml".该文档的格式和数据如图所示 实现思路: 创建Java项目,添加dom4 ...
- Nginx-正反向代理及负载均衡
目录 正/反向代理 代理的方式 Nginx代理服务支持的协议 代理实战 部署web01 部署Lb01 Nginx代理常用参数 添加发往后端服务器的请求头信息 代理到后端的TCP连接.响应.返回等超时时 ...
- spring boot 启动读取的配置文件优先级
1.优先级从高到低 1. file:/config/ 2. file:/ 3. classpath:/config/ 4. classpath:/ 所有位置的application.properti ...
- vue中动画的使用
不要在router-view的外层使用动画!不要在router-view的外层使用动画!不要在router-view的外层使用动画! 重要的事情说三遍,在app.vue中自以为奇思妙想(实际是脑残)在 ...
- Ubuntu16安装Nvidia驱动(GTX1060显卡)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- C#winform控件序列化,反序列化
using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System. ...
- cv::copyMakeBorder()中用0值对齐矩阵,方便后续加速傅里叶变换
int M = cv::getOptimalDFTSize(mul_result.rows); // 获得最佳DFT尺寸,为2的次方 int N = cv::getOptimalDFTSize(mul ...
- C#8.0 可空引用类型
介绍 我们的项目代码运行时最频繁的错误之一就是 System.NullReferenceException 异常,c#8.0增加的可为空引用类型就是用来帮助开发者降低甚至消除NULL异常.我们需要注意 ...
- python中的rpc库
基于xml的rpc调用 rpcserver.py from xmlrpc.server import SimpleXMLRPCServer # python中类的命名方式遵循驼峰命名法 # 1. 没有 ...