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来实现.用传统的方法,比较好理解.层次清 ...
随机推荐
- android发送短信验证码并自动获取验证码填充文本框
android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ...
- 学习虚拟机时Vbox提示硬件加速不可用时应该怎么办?
也不知大家在安装或使用虚拟机时有没有出现过这样的现象?Vbox提示硬件加速不可用? 在学习Java和安装虚拟机时,自己的电脑上出现Vbox提示Vt-x硬件加速不可用,但后也知道了方法怎么弄! 方法及步 ...
- PHP的运算符
1.算术运算符 2.赋值运算符 基本的赋值运算符是“=”. (1)引用赋值 PHP 支持引用赋值,使用“$var = &$othervar;”语法.引用赋值意味着两个变量指向了同一个数据,没有 ...
- VS2017 未找到编译器可执行文件 csc.exe
vs2017 网站报错 原因Web.config是中下面这段:注释就可以了 <!--<system.codedom> <compilers> <compiler l ...
- Linux ,Ubuntu 分区建议大小
分区 分区类型 文件系统 大小 /boot 逻辑分区 Ext4 300M swap 逻辑分区 交换空间 13G / 主分区 Ext4 30G /home 逻辑分区 Ext4 42G /usr 逻辑分区 ...
- Autofac之生命周期和事件
Autofac为注册的类型对象提供了一套生命周期事件,覆盖了一个类型从注册到最后“释放”的一套事件.有了这些事件,我们可以相对方便的在类型对象的各个阶段进行AOP操作. builder.Registe ...
- mysql主从服务搭建
一.安装mysql 检测当前centos是否安装了mysql:yum list installed | grep mysql yum list installed | grep mariadb ...
- spring 相关注解详情(二)
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法 /* 数据源的属性类 */ public class DataSourcePro ...
- 百度地图API实时画出动态运行轨迹(一条行驶轨迹),车头实时指向行驶方向,设置角度偏移
参考网址:https://blog.csdn.net/skywqnan/article/details/79036262 改变车的方向:http://www.cnblogs.com/peixuanzh ...
- Asp.net 使用线程池实例
实际开发经常会使用线程,如果每次使用都是创建线程.启动线程,然后销毁线程,从性能上来讲,非常占用系统开销,当线程达到一定量的时候会影响程序的运行和处理效率. 使用线程池:好处:线程池是一种多线程处理形 ...