五:流程控制函数
#1.if函数 : IF ...ELSE 的效果 判断 相当于三元运算符
SELECT IF (10>6,'大','小');
SELECT last_name ,commission_pct,IF(commission_pct is null ,'哈哈哈 没奖金','哈哈哈哈 有奖金') resut FROM employees;
# case函数的使用一: switch case 的效果
/*
java 中
switch(变量或表达式){
CASE 常量1:语句1;break;
...
DEFAULT
}
mysql中
判断等值判断
case 要判断的字段或表达式
when 常量1 then 要显示的值或语句1;
when 常量2 then 要显示的值或语句2;
...
else 要显示的值n或语句n
END
*
*/
/**
案例 查询员工的工资,要求
部门号=30 ,显示的工资为1.1倍
部门号=40 ,显示的工资为1.2倍
部门号=50 ,显示的工资为1.3倍
其他部门,显示的工资为原工资
*/
# 是值的话就不需要放分号了
SELECT
salary,department_id,
CASE
department_id
WHEN 30 THEN
salary * 1.1
WHEN 40 THEN
salary * 1.2
WHEN 50 THEN
salary * 1.3 ELSE salary
END AS sdou
FROM
employees;
# 3.case 函数的使用2 类似于 多重if
/**
java中 if(条件1){
语句1
}ELSE IF(条件2){
语句2
}ELSE{
}
mysql中
case
WHEN 条件1 then 要显示的值1或语句1
WHEN 条件2 then 要显示的值2或语句2
...
ELSE 要显示的值n或语句n
END
*/
#案例 :查询员工的工资情况
#如果工资>20000, 显示A级别
#如果工资>15000, 显示B级别
#如果工资>10000, 显示C级别
#则显示D级别
SELECT salary ,department_id ,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE
'D'
END as sa
FROM employees;
分组函数
# 分组函数 用于统计 聚合函数 组函数 传入多个值返回一个值
# 分类 sum 求和, avg 平均值, max 最大值, min 最小值, count 计算个数
# 特点:
#1,sum avg 用于处理数值型
# max, min ,count 可以处理任何类型
#2,是否忽略null值
# 以上分组函数都会忽略null值
#3,和DISTINCT搭配达到去重效果
#4,COUNT() 具体介绍 一般使用count(*)统计行数
#5,和分组函数一同查询的字段要求是group by 后的字段
#1,SUM 求和工资
SELECT SUM(salary) salary_sum FROM employees;
#2.平均值
SELECT AVG(salary) salary_avg FROM employees;
#3.max 最大值
SELECT MAX(salary) salary_max FROM employees;
# 4.min 最小值
SELECT MIN(salary) salary_min FROM employees;
# 5.count 统计个数
SELECT COUNT(salary) salary_count FROM employees;
# 组合使用
SELECT SUM(salary) 总工资, AVG(salary) 平均值, MAX(salary) 最高工资, MIN(salary) 最小工资, COUNT(salary) 条 FROM employees;
# 和DISTINCT搭配达到去重效果
# 去掉重复计算
SELECT SUM(DISTINCT salary) ,SUM(salary) salary FROM employees;
SELECT COUNT(DISTINCT salary ),COUNT(salary) sa FROM employees;
# COUNT()具体介绍
# 忽略null值
SELECT COUNT(commission_pct) FROM employees;
#count(*)统计具体的行数
SELECT COUNT(*) line FROM employees;
# COUNT(1) 相当于加了一列1 统计1的个数
SELECT COUNT(1) line FROM employees;
#效率
# MYISAM 存储引擎下,COUNT(*)的效率高
#INNODB 存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)效率高 字段需要去判断是否为null;
# 和分组函数一同查询的字段有限制
SELECT
( SELECT SUM( salary ) FROM employees ) AS sum,
employee_id
FROM
employees
GROUP BY
employee_id;
#查询各job_id 的员工工资的最大值 最小值 平均值 总合 并按job_id升序
SELECT
MAX( salary ) max,
MIN( salary ) min,
AVG( salary ) avg,
SUM( salary ) sum,
COUNT( job_id ),
job_id
FROM
employees
GROUP BY
job_id
ORDER BY
job_id
# 查询员工最高工资和最低工资的差距
SELECT MAX(salary)-MIN(salary) as DIFFERENCE ,MAX(salary) max, MIN(salary) min FROM employees;
#查询各个管理者手下员工的最低工资 其中最低工资不能低于6000 没有管理者的员工不计算在内
SELECT MIN(salary) min, manager_id FROM employees WHERE salary > 6000 and manager_id is not null GROUP BY manager_id
# 查询所有部门的编号 员工数量 和工资平均值 并按平均工资降序
SELECT department_id,COUNT(*) num , AVG(salary) avg FROM employees GROUP BY department_id ORDER BY avg desc;
#选择具有各个job_id的员工人数
SELECT job_id,COUNT(*) num FROM employees GROUP BY job_id;
# 查询公司员工工资的最大值 最小值 平均值 总和
SELECT MAX(salary) max ,MIN(salary) min ,AVG(salary) avg ,SUM(salary) sum FROM employees;
# 查询员工表中的最大入职时间和最小入职时间的相差天数 (DIFFRENCE)
SELECT MAX(hiredate) -MIN(hiredate) as days , MAX(hiredate) max , MIN(hiredate) min FROM employees;
# 查询部门编号为90的员工个数
SELECT COUNT(*) num FROM employees WHERE department_id =90;