建表 插入数据
CREATE TABLE course ( id INT ( 20 ), sid INT ( 20 ), course VARCHAR ( 255 ), score INT ( 20 ) );
INSERT INTO `course` VALUES (1, 1, '语文', 43);
INSERT INTO `course` VALUES (2, 1, '数学', 55);
INSERT INTO `course` VALUES (3, 2, '语文', 77);
INSERT INTO `course` VALUES (4, 2, '数学', 88);
INSERT INTO `course` VALUES (5, 3, '语文', 98);
INSERT INTO `course` VALUES (6, 3, '数学', 65);
一、case when then else end的用法
(1)基本用法
case
when 条件1 then 条件成立的内容
when 条件2 then 条件成立执行的内容
else 其他条件
end
(2)在update更新中使用
UPDATE TABLE
SET 字段 1 =
CASE
WHEN 条件 1 THEN 值 1
WHEN 条件 2 THEN 值 2 ELSE 值 3
END
WHERE
(3)在select查询中使用
select 字段1, 字段2,
case 字段3
when 值1 then 新值
when 值2 then 新值
end as 重新命名字段3的名字
from table
(4)在where条件中使用
select 字段1,字段2,字段3
from table
where
case
when 条件1 then where后的条件
when 条件2 then where后的条件
else where后想加的条件
end
-- 举例说明:语文成绩找到及格的,数学成绩找出来不及格的,相当于找到偏科偏语文的学生的学生
select *
from course
where
case
when course = '语文' then score>60
when course = '数学' then course<60
end
(5)在GROUP BY分组中使用
select 字段1,字段2,字段3
from table
where 条件
group by
case
when 条件1 then 字段x
when 条件2 then 字段y
end
说明:满足条件1以字段x分组,满足条件2以字段y分组。
(6)在Order By排序中使用
select 字段1,字段2,字段3
from table
where 条件
order by
case
when 条件1 then 字段x
when 条件2 then 字段y
end
说明:满足条件1以字段x排序,满足条件2以字段y排序。
-- 所有数学课程成绩 大于 语文课程成绩的学生的学号
-- 第1步、使用case when来进行行列转换
select sid 学号,
case
WHEN course='语文' then score else 0
end as 语文分数,
case
WHEN course='数学' then score else 0
end as 数学分数
from course
-- 第2步 根据学号进行合并,将同一个学生的数学和语文成绩放在一行显示
-- " case WHEN course='语文' then score else 0 end "是完整的case when语句
SELECT
sid 学号,
MAX( CASE WHEN course = '语文' THEN score ELSE 0 END ) 语文分数,
MAX( CASE WHEN course = '数学' THEN score ELSE 0 END ) 数学分数
FROM
course
GROUP BY
sid
-- 第3步 从行列转换的表中取出题目中要求的数据
SELECT a.* from
(
SELECT
sid 学号,
MAX( CASE WHEN course = '语文' THEN score ELSE 0 END ) 语文分数,
MAX( CASE WHEN course = '数学' THEN score ELSE 0 END ) 数学分数
FROM
course
GROUP BY
sid
) as a
WHERE a.语文分数<a.数学分数