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来实现.用传统的方法,比较好理解.层次清 ...
随机推荐
- http跳转htts的htaccess文件设置
RewriteEngine OnRewriteCond %{SERVER_PORT} 80RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]Options ...
- Linux服务器tomcat启动很慢
Linux服务器tomcat启动很慢 步骤: 一:找到 java 位置 whereis java 输出内容(部分):/usr/lib/java ...... 二:进入到 lib 目录 cd /usr ...
- logback使用注意点1
logback中配置了springProfile(策略),因此在properties中只需要配置如下即可logging.config=./config/logback.xml //logback配置文 ...
- 容器—stack
c++ stl栈stack介绍 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构. c++ stl栈stack的头文件 ...
- linux之间免密操作
为了方便分布式集群操作,主机master需要免密操作两个节点slave1和slave2(slave1和slave2在对应机器已经修改hosts文件) 操作步骤: 首先测试连接slave1操作: [ro ...
- 聊天机器人開發好消息!!DIALOGFLOW與微信的天作之合!!
虽然DIALOGFLOW暂未能够与微信(WECHAT)或企业微信(ENTERPRISE WECHAT)进行任何技制上的连接INTERGRATION),确实限制了我们这些聊天机器人开发者的创作空间,因为 ...
- 队列->队列的表示和实现
文字描述 队列是和栈相反,队列是一种先进先出(first in first out,缩写FIFO)的线性表,它只允许在表的一端进行插入,而在另一端进行删除.和生活中的排队相似,最早进入队列的元素最早离 ...
- centos禁ping
Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的:A.内核参数,B.防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法Ping. 具体的配置方法如 ...
- 学号 20175201张驰 《Java程序设计》第7周学习总结
学号 20175201张驰 <Java程序设计>第7周学习总结 教材学习内容总结 第八章 String类能有效地处理字符序列信息,它的常用方法有: public int length()可 ...
- [LeetCode] 115. Distinct Subsequences_ Hard tag: Dynamic Programming
Given a string S and a string T, count the number of distinct subsequences of S which equals T. A su ...