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来实现.用传统的方法,比较好理解.层次清 ...
随机推荐
- [LeetCode] Soup Servings 供应汤
There are two types of soup: type A and type B. Initially we have N ml of each type of soup. There a ...
- ICL2019E
https://www.codechef.com/ICL2019/problems/ICL1906 两个整数,[0,1e5]操作1是让两个数同时减1(只有都大于0的时候才可以用)操作2可以让一个数乘 ...
- Selenium 3----WebDriver常用方法
在学会定位元素的基础上,进行元素的操作. WebDriver常用方法: clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. submit( ...
- BEM的命名规则
给自己提个醒,别乱命名了
- VS2015中使用报表控件(ReportViewer)的方法
没有报表,一般默认安装之后会出现这种情况,在安装的时候选择自定义安装,把Microsoft Office 开发人员工具.Microsoft SQL Server Data Tools勾选上,安装之后就 ...
- Django集成Bootstrap美化后台
1.pip install bootstrap-admin 2.编辑项目下的settings.py,增加下面行,放在最前面 3.编辑项目下的settings.py,增加下面行
- 干货|爱奇艺CDN巡检系统技术解析
小结: 1. 中心处理系统 /1/将定制后的巡检任务拆分,通过配置与任务分发系统.CMDB*( configuration management database)将派发到边缘拨测系统/2/处理边缘拨 ...
- 【C++】约瑟夫环(数组+链表)
基于数组: #include<iostream> #include<cstring> #include<cstdlib> using namespace std; ...
- 查看历史会话等待事件对应的session信息
此处以enq: TX - row lock contention等待时间为例. 查看snap_id对应时间 select to_char(s.startup_time,'dd Mon "at ...
- TestNG Suite 运行出现中文乱码如何解决
场景: 用TestNG框架运行测试类,控制台视图输出出现中文乱码. 解决方案: 1.eclipse属性>workspace>other>utf-8 2.修改eclipse.ini 文 ...