MySQL提供了case、if、ifnull等流程控制函数。现对这些函数的功能及用法进行介绍。创建数据表emp并输入数据:
create table dept(
dept_id int primary key auto_increment comment '部门编号',
dept_name char(20) comment '部门名称'
);
insert into dept(dept_name) values('销售部'),('财务部'),('生产部'),('人事部');
create table emp(
emp_id int primary key auto_increment comment '员工号',
emp_name char(20) not null default '' comment '员工姓名',
gender tinyint not null default 1 comment '性别', --1表示'男',0表示'女'
birth datetime not null default '1990-1-1' comment '出生日期',
salary decimal(10,2) not null default 0 comment '工资',
dept_id int comment '部门编号'
);
insert into emp(emp_name,gender,birth,salary,dept_id)
values('张晓红',0,'1980-1-23',5800,1),('张静静',0,'1987-10-3',5400,1),('王云飞',1,'1992-11-15',5600,1),
('王鹏飞',1,'1987-10-1',6800,1),('王大鹏',1,'1989-2-11',5900,1),('王萌萌',0,'1986-12-30',5000,2),
('王大光',1,'1988-11-8',6200,2),('王小明',1,'1998-1-3',4800,2),('王娜娜',0,'1994-3-5',5200,2),
('刘云飞',1,'1992-8-13',6800,3),('张陆军',1,'1991-9-6',6200,3);
if函数的语法如下:
if(逻辑表达式,结果表达式1,结果表达式2);
说明:如果【逻辑表达式】成立,返回【结果表达式1】,如果不成立则返回【结果表达式2】。
举例:
mysql> select if(100%2=0,'偶数','奇数');
+-------------------------------+
| if(100%2=0,'偶数','奇数') |
+-------------------------------+
| 偶数 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select if(15%2=0,'偶数','奇数');
+------------------------------+
| if(15%2=0,'偶数','奇数') |
+------------------------------+
| 奇数 |
+------------------------------+
1 row in set (0.00 sec)
mysql> select emp_id,emp_name,if(gender=1,'男','女') as gender,dept_name
from emp inner join dept on emp.dept_id=dept.dept_id
where dept_name='销售部';
+--------+-----------+--------+-----------+
| emp_id | emp_name | gender | dept_name |
+--------+-----------+--------+-----------+
| 1 | 张晓红 | 女 | 销售部 |
| 2 | 张静静 | 女 | 销售部 |
| 3 | 王云飞 | 男 | 销售部 |
| 4 | 王鹏飞 | 男 | 销售部 |
| 5 | 王大鹏 | 男 | 销售部 |
+--------+-----------+--------+-----------+
5 rows in set (0.00 sec)
ifnull函数的语法如下:
ifnull(表达式1,表达式2);
说明:首先判断【表达式1】的值是否为空,如果不为空,就返回【表达式1】的值,否则返回【表达式2】的值。
举例:
mysql> select dept_name,count(*) as emp_count,sum(salary) as total_salary
from emp inner join dept on emp.dept_id=dept.dept_id
group by dept_name with rollup;
+-----------+-----------+--------------+
| dept_name | emp_count | total_salary |
+-----------+-----------+--------------+
| 生产部 | 2 | 13000.00 |
| 财务部 | 4 | 21200.00 |
| 销售部 | 5 | 29500.00 |
| NULL | 11 | 63700.00 |
+-----------+-----------+--------------+
4 rows in set (0.00 sec)
mysql> select ifnull(dept_name,'total') as dept_name,
count(*) as emp_count,sum(salary) as total_salary
from emp inner join dept on emp.dept_id=dept.dept_id
group by dept_name with rollup;
+-----------+-----------+--------------+
| dept_name | emp_count | total_salary |
+-----------+-----------+--------------+
| 生产部 | 2 | 13000.00 |
| 财务部 | 4 | 21200.00 |
| 销售部 | 5 | 29500.00 |
| total | 11 | 63700.00 |
+-----------+-----------+--------------+
4 rows in set, 1 warning (0.00 sec)
mysql> select ifnull(dept_name,'total') as '部门',
sum(if(gender=1,1,0)) as '男',sum(if(gender=0,1,0)) as '女',
count(gender) as '总人数'
from emp inner join dept on emp.dept_id=dept.dept_id
group by dept_name with rollup;
+-----------+------+------+-----------+
| 部门 | 男 | 女 | 总人数 |
+-----------+------+------+-----------+
| 生产部 | 2 | 0 | 2 |
| 财务部 | 2 | 2 | 4 |
| 销售部 | 3 | 2 | 5 |
| total | 7 | 4 | 11 |
+-----------+------+------+-----------+
4 rows in set (0.00 sec)
mysql> select ifnull(dept_name,'total') as '部门',
sum(if(gender=1,salary,0)) as '男',sum(if(gender=0,salary,0)) as '女',
sum(salary) as '工资总额'
from emp inner join dept on emp.dept_id=dept.dept_id
group by dept_name with rollup;
+-----------+----------+----------+--------------+
| 部门 | 男 | 女 | 工资总额 |
+-----------+----------+----------+--------------+
| 生产部 | 13000.00 | 0.00 | 13000.00 |
| 财务部 | 11000.00 | 10200.00 | 21200.00 |
| 销售部 | 18300.00 | 11200.00 | 29500.00 |
| total | 42300.00 | 21400.00 | 63700.00 |
+-----------+----------+----------+--------------+
4 rows in set (0.00 sec)
case函数的语法如下:
格式一: case 表达式 when [value1] then 表达式1 [when [value2] then 表达式2 ...] [else 表达式n] end
格式二: case when [逻辑表达式1] then 表达式1 [when [逻辑表达式2] then 表达式2 ...] [else 表达式n] end
说明:
1、对于第一种格式:如果【value1】的值和【表达式】的值相等,就返回【表达式1】的值,如果【value2】的值和【表达式】的值相等,就返回【表达式2】的值,以此类推,如果所有的【value】都不等于【表达式】的值,就返回【else】后面的【表达式n】的值,如果没有【else】就返回NULL值。
2、对于第二种格式:如果【逻辑表达式1】成立则返回【表达式1】的值,如果【逻辑表达式2】成立就返回【表达式2】的值,以此类推,如果所有的【逻辑表达式】都不成立,就返回【else】后面的【表达式n】的值,如果没有【else】就返回NULL值。
3、第二种格式更为灵活一些。
mysql> set @score=3;
Query OK, 0 rows affected (0.00 sec)
mysql> select case @score
when 5 then '优秀'
when 4 then '良好'
when 3 then '及格'
else '不及格' end as '测试成绩';
+--------------+
| 测试成绩 |
+--------------+
| 及格 |
+--------------+
1 row in set (0.00 sec)
mysql> set @score=62;
Query OK, 0 rows affected (0.00 sec)
mysql> select case when @score>=90 and @score<=100 then '优秀'
when @score>=80 then '良好'
when @score>=60 then '及格'
else '不及格' end as '测试成绩';
+--------------+
| 测试成绩 |
+--------------+
| 及格 |
+--------------+
1 row in set (0.00 sec)
mysql> select ifnull(dept_name,'total') as '部门',
sum(case when gender=1 then salary else 0 end) as '男',
sum(case when gender=0 then salary else 0 end) as '女',
sum(salary) as '工资总额'
from emp inner join dept on emp.dept_id=dept.dept_id
group by dept_name with rollup;
+-----------+----------+----------+--------------+
| 部门 | 男 | 女 | 工资总额 |
+-----------+----------+----------+--------------+
| 生产部 | 13000.00 | 0.00 | 13000.00 |
| 财务部 | 11000.00 | 10200.00 | 21200.00 |
| 销售部 | 18300.00 | 11200.00 | 29500.00 |
| total | 42300.00 | 21400.00 | 63700.00 |
+-----------+----------+----------+--------------+
4 rows in set (0.00 sec)