MySQL 您所在的位置:网站首页 case用法mysql MySQL

MySQL

#MySQL| 来源: 网络整理| 查看: 265

概述:sql语句中的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_textfrom user2.Case搜索函数写法(注意sex的位置【推荐】)

select *,(CASE WHEN sex='1' THEN '男' WHEN sex='0' THEN '女' ELSE '保密' END) as sex_textfrom user

总结:简单Case函数写法只适合相等条件判断,不能用于大于、小于及不等于的判断,        Case搜索函数写法适合复杂条件判断:可用于大于、小于及不等于的判断。------------------------------------------------------------------------------------------

实验1.2:将用户性别用文字直观显示:0女;1男;2保密;并按性别显示排序

select *,(CASE WHEN sex='1' THEN '男' WHEN sex='0' THEN '女' ELSE '保密' END) as sex_textfrom userorder by sex_text DESC

总结:用临时生成的字段是可以排序的,MySQL查询流程:先对表数据查询,查出数据后再排序显示。------------------------------------------------------------------------------------------

实验1.3:将用户年龄用文字直观显示(涉及数值范围判断,只能使用“Case搜索函数”写法),如下:

select *,(CASE WHEN age>=60 THEN '老年' WHEN age=30 THEN '中年' WHEN age=18 THEN '青年' ELSE '未成年' END) as age_textfrom 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=30 THEN '中年' WHEN age=18 THEN '青年' ELSE '未成年' END) as age_textfrom user

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

实验1.5:将区域分组,统计华北、华南分别的注册人数select count(*),(CASE province WHEN '北京' THEN '华北' WHEN '天津' THEN '华北' WHEN '河北' THEN '华北' WHEN '广东' THEN '华南' WHEN '湖南' THEN '华南' END) as areafrom usergroup 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 numfrom dj_zt awhere a.qylx_dm = '03'

 

B:不用CASE语句select count(*)from dj_zt awhere 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 num2from dj_zt awhere a.qylx_dm = '03'

B:不用CASE语句(写了两条语句,扫描表两遍,效率明显低下)select count(*)from dj_zt awhere a.qylx_dm = '03' and a.zt='07'

select count(*)from dj_zt awhere 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_textfrom user

总结:IF不像CASE那样可以多条件判断,IF只能判断“真”、“假”;mysql> SELECT IF(1>2,2,3);-> 3 mysql> SELECT IF(1 '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.10,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_ztwhere id in (5,6,12)

实验3.3:如果字段bs为空就返回'ZZX'select *,IFNULL(bs,'ZZX')from dj_ztwhere 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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有