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 数 ...
随机推荐
- iNeuOS工业互联网操作系统,增加设备驱动的自定义参数模板,适配行业个性化设备的应用场景
目 录 1. 概述... 2 2. 平台演示... 2 3. 应用过程... 2 1. 概述 增加设备驱动的自定义参数模板,适配行业个性化设备的应用场景. ...
- python 使用@property 操作属性时,报“RecursionError:maximun recursion depth exceeded”
使用@property获取和修改属性,出现报错"RecursionError:maximun recursion depth exceeded",超过了最大的递归深度 原因: 方法 ...
- Pytest_Hook函数pytest_addoption(parser):定义自己的命令行参数(14-1)
考虑场景: 我们的自动化用例需要支持在不同测试环境运行,有时候在dev环境运行,有时候在test环境运行: 有时候需要根据某个参数不同的参数值,执行不同的业务逻辑: 上面的场景我们都可以通过" ...
- CentOS7 防火墙firewalld 和 CentOS6 防火墙iptables 开放zabbix-agent端口的方法
我们在生产环境中,一般都是把防火墙打开的,不像测试环境,可以直接关闭掉.最近安装zabbix ,由于公司服务器既有centos 7又有centos 6,遇到了一些防火墙的问题,现在正好把centos防 ...
- Spark-local本地环境搭建
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6815385772254822919/ 承接上一个文档<Spark源码编译> 解压spark编译好的压缩 ...
- python多环境管理一(venv与virtualenv)
一.背景 我们经常会遇见这样的场景: 1.各个项目使用的python版本不相同 由于Python的解释器版本众多,各版本之间差异非常大.特别是python2和python3,互不兼容. 有些项目可能用 ...
- 匿名函数托管 func-spring-boot-starter
匿名函数托管 func-spring-boot-starter 项目地址 func-spring-boot-starter开源项目地址: https://gitee.com/yiur/func-spr ...
- Java对象内存模型
2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 在 JVM ...
- k8s-pv-pvc
1. 简介 持久卷(PersistentVolume,PV)是集群中的一块存储,可以由管理员事先供应,或者 使用存储类(Storage Class)来动态供应. 持久卷是集群资源,就像节点也是集群资源 ...
- [MRCTF2020]Ezaudit
[MRCTF2020]Ezaudit 知识点 1.源码泄露 2.伪随机数 3.sql注入? 题解 打开题目是个漂亮的前端,扫一下发现www.zip文件泄露,下载审计 <?php header(' ...