mysql语法之case when then与列转行
mysql语法中case when then与列转行的使用场景非常丰富。
case语句类似java中条件分支语句的作用,可以类比java中的switch语句或者if语句来学习。
其语法如下:
case语句的语法:
转换单个字段时:
case 字段
when 字段值 then 返回值
when 字段值 then 返回值
when 字段值 then 返回值
。。。。。。
else 默认值 end 别名;
当有多个字段需要转换时:
case
when 字段名1=字段值11 and 字段名2=字段值2 and 。。。 then 返回值
when 字段名1=字段值12 and 字段名2=字段值3 and 。。。 then 返回值
when 字段名1=字段值13 and 字段名2=字段值4 and 。。。 then 返回值
when 字段名1=字段值14 and 字段名2=字段值5 and 。。。 then 返回值
。。。。。。
else 默认值 end 别名;
而列转行则能够帮我们把数据库某些列转换为行的形式展示给我们。
例如:
将上述结果进行列转行可以得到如下结果:
列转行语法:
sum(case when then else end) as 或者 max(case when then else end) as
创建一个数据库stu,建立学生表,班级表,课程表,成绩表
班级表包含班级id、班级名称
创建班级表:
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes` (
`cid` int(11) NOT NULL,
`cname` varchar(10) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
向班级表插入一个班级
INSERT INTO `classes` VALUES ('111', '一班');
课程表包含课程id、课程名称
创建课程表:
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
`scid` int(11) NOT NULL,
`scname` varchar(10) DEFAULT NULL,
PRIMARY KEY (`scid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
向课程表插入三门课程
INSERT INTO `sc` VALUES ('11', '语文');
INSERT INTO `sc` VALUES ('22', '数学');
INSERT INTO `sc` VALUES ('33', '英语');
成绩表包含成绩id、分数、分数所属学生id、分数所属课程id
创建成绩表:
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`coid` int(11) NOT NULL,
`score` int(8) DEFAULT NULL,
`sid` int(11) DEFAULT NULL,
`scid` int(11) DEFAULT NULL,
PRIMARY KEY (`coid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
向成绩表插入6条记录:
INSERT INTO `score` VALUES ('1111', '90', '1', '11');
INSERT INTO `score` VALUES ('2222', '99', '1', '22');
INSERT INTO `score` VALUES ('3333', '89', '2', '11');
INSERT INTO `score` VALUES ('4444', '88', '2', '33');
INSERT INTO `score` VALUES ('5555', '75', '3', '22');
INSERT INTO `score` VALUES ('6666', '59', '3', '33');
学生表包含学生id、学生姓名、所属班级id
创建学生表:
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL,
`sname` varchar(10) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
向学生表插入三个学生:
INSERT INTO `student` VALUES ('1', '张三', '111');
INSERT INTO `student` VALUES ('2', '李四', '111');
INSERT INTO `student` VALUES ('3', '王五', '111');
查询每个学生的姓名、所属班级、所学课程、课程得分
SELECT
s.sname,
cl.cname,
sc.scname,
co.score
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid;
在上一个结果集的基础上,将同一个学生的所有所学课程与所有分数分别以逗号形式连接成字符串:
SELECT
s.sname,
cl.cname,
GROUP_CONCAT(co.score) 分数,
GROUP_CONCAT(sc.scname) 课程
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;
列转行实例:
①
SELECT
s.sname,
cl.cname,
IFNULL(
Max(
CASE sc.scname
WHEN '语文' THEN
co.score
END
),
'未选'
) AS '语文',
IFNULL(
Max(
CASE sc.scname
WHEN '数学' THEN
co.score
END
),
'未选'
) AS '数学',
IFNULL(
Max(
CASE sc.scname
WHEN '英语' THEN
co.score
END
),
'未选'
) AS '英语'
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;
②
SELECT
s.sname,
cl.cname,
max(
IF (
sc.scname = '语文',
co.score ,- 1
)
) AS '语文',
max(
IF (
sc.scname = '数学',
co.score ,- 1
)
) AS '数学',
max(
IF (
sc.scname = '英语',
co.score ,- 1
)
) AS '英语'
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;
mysql语法之case when then与列转行的更多相关文章
- JS 小工具 MYSQL WHERE IN条件 去掉换行符(列转行)
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- 学习mysql语法--基础篇(二)
前 言 mysql mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分: [SQL语句的组成] DML ...
- MYSQL开发技巧之行转列和列转行
行转列--两种方法第一种方法:行转列我们通常是使用交叉连接和子查询的方式做到,比如下面的例子,查询每个name的对应id的和mysql> select * from user; +----+-- ...
- mysql数据库中列转行
今天突然想到了数据库中的行专列与列转行,还不熟悉,在上网看了一下然后就自己写了个例子. 数据库表示这样滴! //全部查询出来SELECT (case type when 'MySql数据库' then ...
- MYSQL 语法大全自己总结的
mysql语法大全 --------数据链接---------------------数据库服务启动net start mysql --关闭服务net stop mysql --登录 -u,-p后面不 ...
- 学习mysql语法--基础篇(一)
前 言 mysql mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分: 一.创建用户,创建数据库,给 ...
- mysql 列转行,合并字段
数据表: 列转行:利用max(case when then) max---聚合函数 取最大值 (case course when '语文' then score else 0 end) ---判断 ...
- Oracle和Mysql语法异同整理笔记
目录 (1) 模糊匹配 (2) 删除数据 (3) 时间函数 (4) 关键字问题 (5) 递归查询 (6) 排序问题 (7) 空值返回0 (8) 取最大值 (9) 列转换函数 (10) 类型转行函数 @ ...
- mysql行转列,列转行
行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...
随机推荐
- Java课程寒假之开发记账本软件(Android版)之一
一.选择编译软件 最终选择了目前较为流行的Android Studio,网上的评价都比较偏向于好评. 安装的过程还算比较正常,没有什么太大的波折,解压安装虽然直接,但对于我这种每次装编译软件都有形形色 ...
- makefile编写
概述 什么是makefile?或许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序猿,makefil ...
- request之额外路径
谈到额外路径 ,首先要明白映射路径,映射路径是servlet处理的路径,在web.xml中配置.比如配置一个/emp的映射路径,意味着客户端可以通过http:+项目路径+/emp访问服务器的项目,而所 ...
- Apache Arrow
https://www.kdnuggets.com/2017/02/apache-arrow-parquet-columnar-data.html https://arrow.apache.org/ ...
- Angular2 ng2-smart-table
ng2-smart-table 入门 安装 你要做的就是运行以下命令: npm install --save ng2-smart-table 此命令将创建在你的`package.json`文件和安装包 ...
- Mysql5.8解压版安装问题:TCP/IP, --shared-memory, or --named-pipe should be configured on NT OS
问题描述: cmd显示如下: .err文件显示: [ERROR] [MY-010131] [Server] TCP/IP, --shared-memory, or --named-pipe shoul ...
- RoR - Restful Actions
Index: 用于检索所有条目 # index.json.jbuilder json.array!(@post) do |post| json.extract! post, :id, :title, ...
- 插入排序(JAVA实现)
算法思想: 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕 下图演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入. 代码实现: ...
- jeecg自定义按钮使用exp属性不起作用
为什么要写这篇文章? 之前写过一篇类似的文章 jeecg笔记之自定义显示按钮exp属性,但是有些小伙伴留言参考后不起作用,当时我的 jeecg 版本为3.7.5,最终以版本不同,暂时搁浅了.今天,重新 ...
- 数据库设计入门及ERMaster的安装和使用
数据库的设计步骤 1.标识表 (根据需求创建表) 2.标识表的字段 3.标识表与表之间的关系 注意事项: 三大范式: 1.确保标识的字段的原子性,字段的概念分的不能再分 2.确保字段与表有依赖的关系 ...