mysqlifelse性能_mysqlcaseif条件查询及性能分析概述:
中的case语句与⾼级语⾔中的switch语句,是标准sql的语法,适⽤于⼀个条件判断有多种值的情况下分别执⾏不同的操作。
⾸先,让我们看⼀下CASE的语法。在⼀般的SELECT中,其语法格式如下:
CASE
WHEN THEN
WHEN THEN
...
WHEN THEN
ELSE
END
★ 第⼀部分
# 创建⼀个⽤户表
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL auto_increment,
`sex` tinyint(1) default 1 COMMENT '性别:0⼥;1男;2保密',
`age` int(3) default 1 COMMENT '年龄',
`province` char(254) default NULL COMMENT '所在省份',
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
# 向表中插⼊测试数据
INSERT INTO user(sex,age,province) VALUES
('1','22','北京'),
('0','25','⼴东'),
('0','56','天津'),
('1','14','北京'),
('0','36','⼴东'),
('1','68','湖南'),
('1','45','北京'),
('1','17','河北'),
('2','33','天津'),
('1','27','湖南'),
('1','29','北京'),
('2','70','⼴东'),
('0','24','北京')
数据表如下图:
------------------------------------------------------------------------------------------
实验1.1:将⽤户性别⽤⽂字直观显⽰
1.简单Case函数写法(注意sex的位置)
select *,(CASE sex WHEN '1' THEN '男' WHEN '0' THEN '⼥' ELSE '保密' END) as sex_text
from user
2.Case搜索函数写法(注意sex的位置【推荐】)
select *,(CASE WHEN sex='1' THEN '男' WHEN sex='0' THEN '⼥' ELSE '保密' END) as sex_text from user
总结:简单Case函数写法只适合相等条件判断,不能⽤于⼤于、⼩于及不等于的判断,
Case搜索函数写法适合复杂条件判断:可⽤于⼤于、⼩于及不等于的判断。
------------------------------------------------------------------------------------------
实验1.2:将⽤户性别⽤⽂字直观显⽰:0⼥;1男;2保密;并按性别显⽰排序
select *,(CASE WHEN sex='1' THEN '男' WHEN sex='0' THEN '⼥' ELSE '保密' END) as sex_text from user
order by sex_text DESC
总结:⽤临时⽣成的字段是可以排序的,MySQL查询流程:先对表数据查询,查出数据后再排序显⽰。
------------------------------------------------------------------------------------------
实验1.3:将⽤户年龄⽤⽂字直观显⽰(涉及数值范围判断,只能使⽤“Case搜索函数”写法),如下:
select *,(CASE WHEN age>=60 THEN '⽼年' WHEN age<60 AND age>=30 THEN '中年' WHEN age<30 AND age>=18 THEN '青年' ELSE '未成年' END) as age_text
from user
------------------------------------------------------------------------------------------
实验1.4:综合上⾯两实验
select *,
(CASE WHEN sex='1' THEN '男' WHEN sex='0' THEN '⼥' ELSE '保密' END) as sex_text,
(CASE WHEN age>=60 THEN '⽼年' WHEN age<60 AND age>=30 THEN '中年' WHEN age<30 AND age>=18 THEN '青年' ELSE '未成年' END) as age_text
from user
------------------------------------------------------------------------------------------
实验1.5:将区域分组,统计华北、华南分别的注册⼈数
select count(*),(CASE province WHEN '北京' THEN '华北' WHEN '天津' THEN '华北' WHEN '河北' THEN '华北' WHEN '⼴东' THEN
'华南' WHEN '湖南' THEN '华南' END) as area
from user
group by area
总结:同样道理,临时⽣成的字段 area 是可以在查询结束后,⽤来做排序或分组的。
==========================================================================================
★ 第⼆部分
# 创建数据表
CREATE TABLE `dj_zt` (
`id` int(10) unsigned NOT NULL auto_increment,
`zt` char(254) default NULL,
`bs` char(254) default NULL,
`qylx_dm` char(254) default NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
# 插⼊测试数据
INSERT INTO dj_zt(zt, bs, qylx_dm) VALUES
('01','a','01'),
('02','b','02'),
('03','c','03'),
('11','d','03'),
('03',null,'04'),
('07','f','03'),
('12','g','02'),
('07','h','03'),
('11','i','03'),
('07','j','03'),
('11','k','04')
实验2.1:查询dj_zt表状态值(zt)为'07'或'11',当条件为 qylx_dm = '03' 的所有记录数。
A:⽤CASE语句
select count( WHEN '07' THEN a.bs END) + count( WHEN '11' THEN a.bs END) as num
from dj_zt a
where a.qylx_dm = '03'
B:不⽤CASE语句
select count(*)
from dj_zt a
where a.qylx_dm = '03' in ('07', '11')
结果:A、B两组耗费的代价⼀样的,相⽐较B的写法简洁,平局。switch case判断字符串
------------------------------------------------------------------------------------------
实验2.2: 分别查询dj_zt表状态为'07'和'11'且qylx_dm = '03'的所有记录数。
A:⽤CASE语句
select count( WHEN '07' THEN a.bs END) as num1,count( WHEN '11' THEN a.bs END) as num2 from dj_zt a
where a.qylx_dm = '03'
B:不⽤CASE语句(写了两条语句,扫描表两遍,效率明显低下)
select count(*)
from dj_zt a
where a.qylx_dm = '03' ='07'