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 数 ...
随机推荐
- GoWeb之gin框架
Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 一.快速上手 安装 go mod init go get -u ...
- Go语言系列之性能调优
在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况. Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling 的库,这篇文章 ...
- Eureka原理与架构
一.原理图 Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址 提供者:启动后向Eureka注册自己信息(地址,提供什么服务) 消费者:向Eureka订阅服务,Eureka会将对应服 ...
- nuxt中iview按需加载配置
在plugins/iview.js中修改 初始代码如下 import Vue from 'vue' import iView from 'iview' import locale from 'ivie ...
- Unity3D开发入门教程(三)——添加启动脚本
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以 Unity 3D + VS Code + C# + tolua 为例. 一.启动脚本 第一篇 "搭建开发环境",在 "配 ...
- HashMap的实现原理(看这篇就够了)
一线资深java工程师明确了需要精通集合容器,尤其是今天我谈到的HashMap. HashMap在Java集合的重要性不亚于Volatile在并发编程的重要性(可见性与有序性). 我会重点讲解以下9点 ...
- Javascript面向对象——创建对象、构造函数的原型
Javascript面向对象--创建对象.构造函数的原型 其实:JavaScript中的创建类,就是创建一个构造函数,在创建对象时用到new这个关键字, 一.创建对象 1.函数创建对象 functio ...
- Winfrom统一单例窗口
//调用方式 var frm = new MyForm().Instance(); public static class ExFrm { static Dictionary<string, F ...
- 【刷题-LeetCode】238. Product of Array Except Self
Product of Array Except Self Given an array nums of n integers where n > 1, return an array outpu ...
- 与Elasticsearch交互的客户端
1.访问ES的方式 访问es的方式有两种,一种是http方式,还有一种是java客户端方式. 其中Java客户端又分为:1.1.Node client: 节点客户端实际上是一个集群中的节点(但不保存数 ...