--測試數據准備
-- 建表
create table student(
stu_id varchar2(4),
stu_name varchar2(100), --姓名
sex varchar2(1), --性別 1 男 2 女 0 未知
credit integer default 0
);
-- 插入數據
insert into student (stu_id, stu_name, sex, credit) values ('0001', '大王', '2', '83');
insert into student (stu_id, stu_name, sex, credit) values ('0002', '劉一', '1', '85');
insert into student (stu_id, stu_name, sex, credit) values ('0003', '陳二', '2', '86');
insert into student (stu_id, stu_name, sex, credit) values ('0004', '張三', '0', '77');
insert into student (stu_id, stu_name, sex, credit) values ('0005', '李四', '1', '74');
insert into student (stu_id, stu_name, sex, credit) values ('0006', '王五', '0', '73');
insert into student (stu_id, stu_name, sex, credit) values ('0007', '趙六', '1', '65');
insert into student (stu_id, stu_name, sex, credit) values ('0008', '孫七', '2', '69');
insert into student (stu_id, stu_name, sex, credit) values ('0009', '周八', '2', '79');
insert into student (stu_id, stu_name, sex, credit) values ('0010', '吳九', '1', '55');
insert into student (stu_id, stu_name, sex, credit) values ('0011', '鄭十', '1', '76');
--為了測試數據,沒有控制主鍵唯一性
insert into student (stu_id, stu_name, sex, credit) values ('0001', '大王', '2', '83');
insert into student (stu_id, stu_name, sex, credit) values ('0002', '劉一', '1', '85');
insert into student (stu_id, stu_name, sex, credit) values ('0002', '劉一', '', '85');
commit;
--case when 使用表達式確定返回值
--一、casewhen語法---------------------------------
--1.簡單Case函數
select case sex
when '1' then '男'
when '2' then '女'
else '其他'
end as sex
from student;
--2.Case搜索函數
select case
when sex = '1' then '男'
when sex = '2' then '女'
else '其他'
end as sex
from student;
--3.表達式函數和搜索函數比較-----------------------------
--搜索函數可以識別到空值
select case
when sex is null then '男'
when sex = '2' then '女'
else '其他'
end as sex
from student where stu_name = '劉一';
--表達式函數無法識別到空值
select case sex
when null then '男'
when '2' then '女'
else '其他'
end as sex
from student where stu_name = '劉一';
--3.表達式函數和搜索函數比較-----------------------------
--一、casewhen語法---------------------------------
--二、Case函數執行順序,只返回第一個符合條件的值,剩下的Case部分將會被自動忽略
--①有排序關系的,可以按照升序關系排序
select stu_id, credit,
case
when credit < 80 then '良好'
when credit < 100 then '優秀'
end
from student;
--② 使用降序排序永遠也不可能得到想要的結果,也可以說這種寫法是錯誤的
select stu_id,credit,
case
when credit < 100 then '優秀'
when credit < 80 then '良好'
end
from student;
--③ ①寫法等價於③,②是一個錯誤的例子
select stu_id,credit,
case
when credit < 100 and credit >= 80 then '優秀'
when credit < 80 then '良好'
end
from student;
--二、Case函數執行順序,只返回第一個符合條件的值,剩下的Case部分將會被自動忽略
--三、case函數功能測試--------------------------------------------------------
--1.放在select中統計某一大類下面的另一個分類下的數據---------------
select credit,
count(case when sex = 1 then 1 else null end) 男生數,
count(case when sex = 2 THEN 1 else null end) 女生數
from student
group by credit;
--1.放在select中統計某一大類下面的另一個分類下的數據---------------
--2.放在where中對某一類信息作出限制------------
select *
from student
where (case
when sex = 1 then '性別明確'
when sex = 2 THEN '性別明確'
else '性別不明確'
end) = '性別不明確';
--2.放在where中對某一類信息作出限制------------
--3.放在group by后面對某一類信息進行分類-------------------------
select case
when credit < 80 then '良好'
when credit < 100 then '優秀'
end distinction,
count(*)
from student
group by case
when credit < 80 then '良好'
when credit < 100 then '優秀'
end;
--3.放在group by后面對某一類信息進行分類-------------------------
--三、case函數功能測試--------------------------------------------------------