【SQL进阶教程】自用笔记之case表达式

学习时间:

2022-5-17`
一周掌握 SQL 进阶知识

学习内容:

SQL进阶

一.case表达式

  • 简单CASE表达式
CASE sex
	WHEN1THEN “男”
	WHEN "2" THEN "女"
ELSE “其他” END
  • 搜索CASE表达式
CASE WHEN sex=1THEN “男”
	 WHEN sex=2THEN "女"
ELSE "其他" END

#注意:

  • 统一各分支返回的数据类型
  • 不要忘了写END
  • 养成写ELSE子句的习惯(不写else,执行结果为NULL)

1.1将已有编号方式转换为新的方式并统计

--将县编号转为地区编号
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

1.2用一条SQL语句进行不同条件的统计

--按性别、县名进行汇总人数
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等聚合函数都可以用于将行结构的数据转换为列结构的数据

1.3用check约束定义多个列的条件关系

--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)

区别:使用逻辑与约束力度更强,男性不能在该公司上班

1.4在update语句里进行条件分支(同时进行)

--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"

1.5表之间的数据匹配

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

1.6 在case表达式中使用聚合函数

(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

你可能感兴趣的:(SQL进阶,sql,sqlserver,数据库)