MySQLcasewhenthen⽤法
Case具有两种格式。简单Case函数和Case搜索函数。
–简单Case函数
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
eg:
CASE sex WHEN ‘1’ THEN ‘男’ WHEN ‘2’ THEN ‘⼥’ ELSE ‘其他’ END
搜索Case函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END
eg:
CASE WHEN sex = ‘1’ THEN ‘男’ WHEN sex = ‘2’ THEN ‘⼥’ ELSE ‘其他’ END
这两种语法有什么区别呢?
简单函数
搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函数可以写判断,并且搜索函数只会返回第⼀个符合条件的值,其他case被忽略
when 表达式中可以使⽤ and 连接条件
聚合函数 sum 配合 case when 的简单函数实现多表 left join 的⾏转列
聚合函数 sum 配合 case when 的简单函数实现多表 left join 的⾏转列
注:曾经有个爱学习的路⼈问我,“那个sum()只是为了好看⼀点吗?”,left join会以左表为主,连接右表时,得到所有匹配的数据,再group by时只会保留⼀⾏数据,因此case when时要借助sum函数,保
留其他列的和。如果你还是不明⽩的话,那就亲⼿实践⼀下,只保留left join看⼀下结果,再group by,看⼀下结果。例如下⾯的案例:学⽣表/课程表/成绩表 ,三个表left join查询每个学⽣所有科⽬的成绩,使每个学⽣及其各科成绩⼀⾏展⽰。
SELECT
st.stu_id ‘学号’,
st.stu_name ‘姓名’,
sum(
urse_name
WHEN ‘⼤学语⽂’ THEN
sc.scores
ELSE
END
) ‘⼤学语⽂’,
sum(
urse_name
WHEN ‘新视野英语’ THEN
sc.scores
ELSE
END
) ‘新视野英语’,
sum(
urse_name
WHEN ‘离散数学’ THEN
sc.scores
ELSE
END
) ‘离散数学’,
sum(
urse_name
WHEN ‘概率论与数理统计’ THEN
sc.scores
ELSE
END
) ‘概率论与数理统计’,
sum(
urse_name
WHEN ‘线性代数’ THEN
sc.scores
ELSE
END
) ‘线性代数’,
sum(
urse_name
WHEN ‘⾼等数学’ THEN
sc.scores
ELSE
END
) ‘⾼等数学’
) ‘⾼等数学’
FROM
edu_student st
LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id
LEFT JOIN edu_courses co urse_no = sc.course_no
GROUP BY
st.stu_id
ORDER BY
NULL;
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 50515253545556575859
⾏转列测试数据
– 创建表 学⽣表
CREATE TABLE edu_student (
stu_id VARCHAR (16) NOT NULL COMMENT ‘学号’,
stu_name VARCHAR (20) NOT NULL COMMENT ‘学⽣姓名’,
PRIMARY KEY (stu_id)
) COMMENT = ‘学⽣表’ ENGINE = INNODB;
– 课程表
CREATE TABLE edu_courses (
course_no VARCHAR (20) NOT NULL COMMENT ‘课程编号’,
course_name VARCHAR (100) NOT NULL COMMENT ‘课程名称’,
PRIMARY KEY (course_no)
) COMMENT = ‘课程表’ ENGINE = INNODB;
– 成绩表
CREATE TABLE edu_score (
stu_id VARCHAR (16) NOT NULL COMMENT ‘学号’,
course_no VARCHAR (20) NOT NULL COMMENT ‘课程编号’,
scores FLOAT NULL DEFAULT NULL COMMENT ‘得分’,
PRIMARY KEY (stu_id, course_no)
) COMMENT = ‘成绩表’ ENGINE = INNODB;
– 插⼊数据
– 学⽣表数据
INSERT INTO edu_student (stu_id, stu_name)
VALUES
(‘1001’, ‘盲僧’),
(‘1002’, ‘赵信’),
(‘1003’, ‘皇⼦’),
(‘1004’, ‘寒冰’),
(‘1005’, ‘蛮王’),
(‘1006’, ‘狐狸’);
– 课程表数据groupby是什么函数
INSERT INTO edu_courses (course_no, course_name)
VALUES
(‘C001’, ‘⼤学语⽂’),
(‘C002’, ‘新视野英语’),
(‘C003’, ‘离散数学’),
(
‘C004’,
‘概率论与数理统计’
),
(‘C005’, ‘线性代数’),
(‘C006’, ‘⾼等数学’);
– 成绩表数据
INSERT INTO edu_score (stu_id, course_no, scores)
VALUES
(‘1001’, ‘C001’, 67), (‘1002’, ‘C001’, 68), (‘1003’, ‘C001’, 69), (‘1004’, ‘C001’, 70), (‘1005’, ‘C001’, 71),
(‘1006’, ‘C001’, 72), (‘1001’, ‘C002’, 87), (‘1002’, ‘C002’, 88), (‘1003’, ‘C002’, 89), (‘1004’, ‘C002’, 90),
(‘1005’, ‘C002’, 91), (‘1006’, ‘C002’, 92), (‘1001’, ‘C003’, 83), (‘1002’, ‘C003’, 84), (‘1003’, ‘C003’, 85),
(‘1004’, ‘C003’, 86), (‘1005’, ‘C003’, 87), (‘1006’, ‘C003’, 88), (‘1001’, ‘C004’, 88), (‘1002’, ‘C004’, 89),
(‘1003’, ‘C004’, 90), (‘1004’, ‘C004’, 91), (‘1005’, ‘C004’, 92), (‘1006’, ‘C004’, 93), (‘1001’, ‘C005’, 77),
(‘1002’, ‘C005’, 78), (‘1003’, ‘C005’, 79);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论