select case when if 的一些用法

概述:
sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的状况下分别执行不一样的操做。mysql

首先,让咱们看一下CASE的语法。在通常的SELECT中,其语法格式以下:sql

 CASE   <单值表达式>
        WHEN <表达式值> THEN <SQL语句或者返回值>
        WHEN <表达式值> THEN <SQL语句或者返回值>
        ...
        WHEN <表达式值> THEN <SQL语句或者返回值>
        ELSE <SQL语句或者返回值>
 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测试


# 向表中插入测试数据spa

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','北京')3d

数据表以下图:blog

------------------------------------------------------------------------------------------排序

实验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(CASE a.zt WHEN '07' THEN a.bs END) + count(CASE a.zt 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' and a.zt in ('07', '11')



结果:A、B两组耗费的代价同样的,相比较B的写法简洁,平局。

------------------------------------------------------------------------------------------

实验2.2: 分别查询dj_zt表状态为'07'和'11'且qylx_dm = '03'的全部记录数。

A:用CASE语句
select count(CASE a.zt WHEN '07' THEN a.bs END) as num1,count(CASE a.zt 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' and a.zt='07'



select count(*)
from dj_zt a
where a.qylx_dm = '03' and a.zt='11'



结果:B组代价明显高出A组不少,执行的效率比较低。


总结:CASE 和 IF的区别:
·在高级语言中,CASE的能够用IF来替代,可是在SQL中不行。
·CASE是SQL标准定义的,IF是数据库系统的扩展。
·CASE能够用于SQL语句和SQL存储过程、触发器,IF只能用于存储过程和触发器。
·在SQL过程和触发器中,用IF替代CASE代价都至关的高,至关的麻烦,难以实现。

经过上面几组实例能够看出,应用CASE语句可让SQL变得简洁高效,从而大大提升了执行效率。并且,CASE的使用通常不会引发性能(相比没有用CASE的语句)低下,反而增长了操做的灵活性


◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


★ 第三部分 IF语句的用法

▶ IF(expr1,expr2,expr3)

规则:若是 expr1 是TRUE,则返回expr2, 不然返回expr3。

IF() 的返回值为数字值或字符串值,具体状况视其所在语境而定。

实验3.1:以下:

select *,IF(sex='1','男','非男') as sex_text
from user



总结:IF不像CASE那样能够多条件判断,IF只能判断“真”、“假”;

mysql> SELECT IF(1>2,2,3);
-> 3
 
mysql> SELECT IF(1<2,'yes ','no');
-> 'yes'

mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
-> 'no'
 
若是expr2 或expr3中只有一个明确是 NULL,则IF() 函数的结果类型 为非NULL表达式的结果类型。
expr1 做为一个整数值进行计算,就是说,假如你正在验证浮点值或字符串值, 那么应该使用比较运算进行检验。

mysql> SELECT IF(0.1,1,0);
-> 0

mysql> SELECT IF(0.1<>0,1,0);
-> 1
 
在所示的第一个例子中,IF(0.1)的返回值为0,缘由是 0.1 被转化为整数值,从而引发一个对 IF(0)的检验。这或许不是你想要的状况。在第二个例子中,比较检验了原始浮点值,目的是为了了解是否其为非零值。比较结果使用整数。

------------------------------------------------------------------------------------------

▶ IFNULL(expr1,expr2)

规则:假如 expr1 不为 NULL,就返回 expr1,不然返回 expr2。
         IFNULL()的返回值是数字或是字符串,具体状况取决于其所使用的语境。

实验3.2:若是字段bs为空就返回字段zt的值

select *,IFNULL(bs,zt)
from dj_zt
where id in (5,6,12)




实验3.3:若是字段bs为空就返回'ZZX'
select *,IFNULL(bs,'ZZX')
from dj_zt
where id in (5,6,12)



mysql> SELECT IFNULL(1,0);
-> 1
 
mysql> SELECT IFNULL(NULL,10);
-> 10
 
mysql> SELECT IFNULL(1/0,10);
-> 10

mysql> SELECT IFNULL(1/0,'yes');
-> 'yes'

IFNULL(expr1,expr2)的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、 REAL或 INTEGER。假设一个基于表达式的表的状况, 或MySQL必须在内存储器中储存一个临时表中IFNULL()的返回值:
 
------------------------------------------------------------------------------------------

▶ NULLIF(expr1,expr2)

规则:若是 expr1 = expr2 成立,那么返回值为NULL,不然返回值为 expr1。
        这和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。

实验3.4:若是字段zt 与 字段qylx_dm有相等的值,就返回空,不然返回zt

select *,NULLIF(zt,qylx_dm)
from dj_zt


mysql> SELECT NULLIF(1,1);
-> NULL

mysql> SELECT NULLIF(1,2);
-> 1

注意,若是参数不相等,则 MySQL 两次求得的值为 expr1

相关文章
相关标签/搜索