SQL case...end总结

Case具有两种格式----简单Case****函数Case搜索函数

一. 简单Case函数

类似switch…case

CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他'
END

二. Case搜索函数

类似 if…else

CASE 
WHEN sex = '1' THEN '男' 
WHEN sex = '2' THEN '女' 
ELSE '其他' 
END

三.实际应用

3.1 已知数据按照另外一种方式进行分组,分析

国家人口
中国2000
日本500
美国2000
法国800

上表,按各大洲进行统计,如何解决?

1.生成一个带有洲Code的View是一个解决方法,但是这样很难动态的改变统计的方式。
2.采用case…end

SELECT  SUM(population), 
CASE country  WHEN '中国' THEN '亚洲' 
         	  WHEN '日本' THEN '亚洲' 
  			  WHEN '美国' THEN '北美洲' 
			  ELSE '其他' END 
FROM   xxxxx
GROUP BY
CASE country 
WHEN '中国' THEN '亚洲' 
WHEN '日本' THEN '亚洲' 
WHEN '美国' THEN '北美洲' 
ELSE '其他' END; 

3.2 用一个SQL语句完成不同条件的分组。

国家性别人数
中国150
日本112
美国1234
中国2150
日本2120
美国2235

上表,统计各个国家的性比人数,怎么实现?
1.用UNION也可以实现用一条语句进行查询。
但是那样增加消耗(两个Select部分),而且SQL语句会比较长;
2.用Case函数来完成

SELECT country, 
SUM( CASE 
WHEN sex = '1' THEN  population
 ELSE 0 END),  --男性人口 
SUM( CASE 
WHEN sex = '2' THEN  population 
ELSE 0 END)   --女性人口
FROM  xxx   GROUP BY country;

3.3 在Check中使用Case函数。

CHECK 约束用于限制列中的值的范围。

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

例如:
公司A,这个公司有个规定,女职员的工资必须高于1000块。
采用check…case可以在需要的时候添加男职员的要求。

CONSTRAINT check_salary 
CHECK ( CASE 
		WHEN sex = '2'  THEN CASE 
		                     WHEN salary > 1000 THEN 1 
		                     ELSE 0  END 
		ELSE 1  END = 1 )

3.4 根据条件有选择的UPDATE

例如
有如下更新条件
工资5000以上的职员,工资减少10%
工资在2000到4600之间的职员,工资增加15%

如何解决?
1.采用2次update,有问题,因为工资区间较近,所以最好同时进行
2.采用case…end

UPDATE xxx
SET salary =
CASE WHEN salary >= 5000                   THEN salary * 0.9 
     WHEN salary >= 2000 AND salary < 4600  THEN salary * 1.15 
ELSE salary END;

注意:

最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll。在Case函数中Else部分的默认值是NULL。

3.5 两个表数据是否一致的检查

在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。

3.6 在Case函数中使用合计函数

学号(std_id)课程(class_id)课程名称(class_name)主修(main_class_flg)
1001通原y
2002最优化y
3003电磁场n
4004DSPy
SELECT std_id, MAX(class_id) AS main_class  
FROM Studentclass  
GROUP BY std_id  HAVING COUNT(*) = 1;

SELECT std_id, class_id AS main_class  
FROM Studentclass 
WHERE main_class_flg = 'Y' 

使用case整合后

SELECT  std_id, 
CASE
WHEN COUNT(*) = 1   THEN MAX(class_id) 
ELSE  MAX(CASE WHEN main_class_flg = 'Y'  THEN class_id  
               ELSE END  ) 
END AS main_class 
FROM Studentclass  GROUP BY std_id; 

3.7 小结

一是在显示查询结果时可以灵活的组织格式;
二是有效避免了多次对同一个表或几个表的访问。

摘自
http://blog.sina.com.cn/s/blog_4c538f6c01012mzt.html

### 关于 `sqlservr.exe` 进程及其与 SQL Server 的关系 `sqlservr.exe` 是 Microsoft SQL Server 数据库管理系统的核心执行文件,负责管理数据库引擎的所有活动[^1]。此进程用于启动和停止 SQL Server 实例,并处理所有的数据库请求和服务功能。 当安装多个 SQL Server 实例时,每个实例都有独立的 `sqlservr.exe` 文件位置。例如,默认实例通常位于 `C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\binn` 路径下;而其他命名实例则可能存在于不同的子目录中,比如 `C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\binn`。 需要注意的是,使用一个实例中的 `sqlservr.exe` 来尝试启动另一个不同版本或补丁级别的 SQL Server 实例可能会导致错误的行为或者不稳定的情况发生。因此建议总是通过正确的路径来调用相应的可执行程序以确保兼容性和稳定性。 此外,`sqlservr.exe` 可能会因为缓存机制而导致较高的内存占用情况。这是因为为了提升查询效率,SQL Server 会在物理 RAM 中存储常用的数据页副本以及编译后的计划对象等资源。如果观察到该进程占用过多内存影响系统性能,可以通过调整配置参数限制其最大可用内存量来进行优化[^2]。 ```sql -- 设置最大服务器内存大小(单位:MB) ALTER SERVER CONFIGURATION SET MEMORY_LIMIT_MB = 2048; ``` 对于那些特别耗费 CPU 时间的 T-SQL 查询语句也可以采取措施加以改进,以此减少整体负载并改善响应时间[^4]: ```sql SELECT TOP 50 qs.total_worker_time / qs.execution_count AS [Avg CPU Time], SUBSTRING( qt.text, qs.statement_start_offset / 2, CASE WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2 ) AS query_text, qt.dbid, DB_NAME(qt.dbid) AS dbname, qt.objectid FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt ORDER BY [Avg CPU Time] DESC; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值