2022-5-17`
一周掌握 SQL 进阶知识
SQL进阶
CASE sex
WHEN “1” THEN “男”
WHEN "2" THEN "女"
ELSE “其他” END
CASE WHEN sex=“1” THEN “男”
WHEN sex=“2” THEN "女"
ELSE "其他" END
#注意:
--将县编号转为地区编号
SELECT CASE pref_name
WHEN "德岛" THEN "四国"
WHEN "香川" THEN "四国"
WHEN "爱媛" THEN "四国"
WHEN "福冈" THEN "九州"
WHEN "长崎" THEN "九州"
ELSE "其他" END AS district,SUM(population)
FROM PopTbl
GROUP BY district
--按性别、县名进行汇总人数
SELECT pref_name,sum(case when sex="1" then population else 0 end) as cnt_m,
sum(case when sex="2" then population else 0 end) as cnt_f
FROM PopTbl2
GROUP BY pred_name
–SUM、COUNT、AVG等聚合函数都可以用于将行结构的数据转换为列结构的数据
--eg女性员工的工资必须在200元以下
--蕴含式(嵌套case表达式)P推Q
CONSTRAINT check_salary CHECK(CASE WHEN sex="2" THEN
case when salary<=200 then 1 else 0 end
ELSE 1 END=1)
--逻辑与 P且Q
CONSTRAINT check_salary CHECK(sex="2" AND salary<=200)
区别:使用逻辑与约束力度更强,男性不能在该公司上班
--eg员工调薪(case 可以同时进行更新,互不影响)
UPDATE Salaries
SET salary=CASE WHEN salary>=300 THEN salary*0.9
WHEN salary>=250 and salary<280 THEN salary*1.2
ELSE salary END
--❌示范,当对300进行降薪至270后,会继续执行条件2,工资又更新为324
UPDATE Salaries
SET salary=salary*0.9
WHERE salary>=300
UPDATE Salaries
SET salary=salary*1.2
WHERE salary >=250 and salary<280
--主键值调换 将a、b主键互换
UPDATE Sometable
SET p_key=CASE WHEN p_key="a" THEN "b"
WHEN p_key="b" THEN "a"
ELSE p_key END
WHERE p_key IN("a","b")
--不用case语句则需要借助中间值d
--1.把a转换为中间值d
UPDATE Sometable
SET p_key="d"
WHERE p_key="a"
--2.把b转换为a
UPDATE Sometable
SET p_key="a"
WHERE p_key="b"
--3.把d换为b
UPDATE Sometable
SET p_key="b"
WHERE p_key="d"
case 表达式中可以使用between、like和<>等谓词组合,以及in和exists谓词
--表的匹配,用in
SELECT course_name,
CASE WHEN course_id IN (SELECT course_id from OpenCourses WHERE month=200706)
THEN "o" ELSE "x" END AS "6月",
CASE WHEN course_id in(select course_id from OpenCourses WHERE month=200707)
THEN "o" else "x" END AS "7月",
CASE WHEN course_id in(select course_id from OpenCourses WHERE month=200708)
THEN "o" else "x" END AS "8月"
FROM CourseMaster
--用exists (性能更好)
SELECT CM.course_name,
case when exists(select course_id from OpenCourses OC where month=200706 and OC.course_id=CM.course_id)
then "o" else "x" end as "6月",
case when exists(select course_id from OpenCourses OC where month=200707 and OC.course_id=CM.course_id)
then "o" else "x" end as "7月",
case when exists(select course_id from OpenCourses OC where month=200708 and OC.course_id=CM.course_id)
then "o" else "x" end as "8月"
FROM CourseMaster as CM
(case在select表达句中使用时, 既可以写在聚合函数内部也可以写在聚合函数外部)
select std_id,
case when count(*)=1 then MAX(club_id) else max(case when main_club_flg="Y" then club_id else null)
end as main_club
from StudentClub
GROUP BY std_id
1-1多列数据的最大值
--两列最大值
select key, case when x>=y then x else y end as greatest
from Greatests
--三列最大值
select key, case when x>=y and x>=z then x
when y>=x and y>=z then y
when z>=x and z>=y then z
else null end as greatest
from Greatests
1-2 转换行列
select (case when sex=1 then "女" else "男" end ) as "性别",
sum(population) as "全国",
sum(case when pref_name="德岛" then population else 0 end) as"德岛",
sum(case when pref_name="香川" then population else 0 end) as "德岛",
from poptbl2
group by (case when sex=1 then "女" else "男" end)
1-3
按照B-A-D-C指定的顺序进行排列
order by (case key when "B" then 1
when "A" then 2
when "D" then 3
when "C" then 4
else null end)
5-18