mySQL笔记(四):常见函数

#进阶4:常见函数
/*
函数:至关于java中的学过的”方法“,为了解决某个问题,编写一系列的命令集合封装在一块儿。对外仅仅暴露方法名,供外部调用。
一、自定义方法函数
二、调用方法(函数)
       叫什么:函数名
       干什么:函数功能
       
常见函数:
一、字符函数
二、数学函数
三、日期函数
四、流程控制函数
*/

#1、字符函数
一、CONCAT拼接字符
SELECT CONCAT('hello,',`first_name`,`last_name`) 备注 FROM `employees`;
二、LENGTH 获取字节长度
SELECT LENGTH('hello,国祥');
-- utf8一个汉字占3个字节
三、CHAR_LENGTH 获取字符长度
SELECT CHAR_LENGTH('hello,国祥');
四、SUBSTRING 截取子串
/*
注意:起始索引从1开始
substr(str,起始索引,截取的字符长度);
substr(str,起始索引);

*/
SELECT SUBSTR('张三丰爱上了国祥',2,3);
SELECT SUBSTR('张三丰爱上了国祥',7);
五、INSTR获取字符第一次出现的索引
SELECT INSTR('hfuawef湖大武汉富武汉武汉','武汉');
六、TRIM去先后指定的字符,默认去空格
SELECT TRIM('   端 正    商务及前景   ') AS a;
SELECT TRIM('x'FROM'xxxxxxxx端xxxxx正xxxxxxx') AS a;
七、LPAD/RPAD 左填充/右填充
/*
填充至制定列宽
*/
SELECT LPAD('蝴蝶湾',10,'a');
八、UPPER/LOWER 变大写/变小写

#案例:查询员工表中的姓名,要求格式:姓首字符大写,其余小写,名全部字符大写,且姓与名之间用_隔开,最后起别名“OUTPUT”
SELECT CONCAT(UPPER(SUBSTR(`first_name`,1,1)),
LOWER(SUBSTR(`first_name`,2)),
'_',UPPER(`last_name`))
AS 'OUTPUT'
FROM `employees`;

九、STRCMP 比较两个字符大小
SELECT STRCMP('abc','aca');

十、LEFT/RIGHT 截取子串,从左截取/从右截取
SELECT LEFT('dwuqhf',2);

#2、数学函数
一、ABS 绝对值
SELECT ABS(-2);
二、CEIL 向上取整
SELECT CEIL(1.09);
三、FLOOR 向下取整
四、ROUND 四舍五入
SELECT ROUND(1.87742,2);
五、TRUNCATE 截断
SELECT TRUNCATE(1.928391,2);-- 截到小数点后几位
六、MOD 取余
SELECT MOD(-10,-3);

#3、日期函数
一、NOW
SELECT  NOW();
二、CURDATE 只获取日期
SELECT  CURDATE();
三、CURTIME
SELECT CURTIME();
四、DATEDIFF 获取连个日期之差
SELECT DATEDIFF('1995-12-02','2020-02-18');
五、DATE_FORMAT
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H小时%i分钟%s秒');
六、STR_TO_DATE 按指定格式解析字符串为日期类型
SELECT STR_TO_DATE('3/15 1998','%m/%d %Y');
SELECT * FROM `employees`
WHERE `hiredate` < STR_TO_DATE('3/15 1998','%m/%d %Y');

#4、流程控制函数
一、IF函数
SELECT IF(100>9,'好','很差');
SELECT IF(`commission_pct` IS NOT NULL,`commission_pct`*12*`salary`,0) 奖金
FROM `employees`;
二、CASE函数
状况1:相似于swich语句,能够实现等值判断
CASE 表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
....
ELSE 结果n
END
案例:
部门编号是30,那么工资显示2倍,
部门编号为50,那么工资显示3倍,
部门编号为60,那么工资显示4倍
不然不变
显示部门编号、新工资、旧工资

SELECT `department_id`,`salary`,
CASE `department_id`
WHEN 30 THEN `salary`*2
WHEN 50 THEN `salary`*3
WHEN 60 THEN `salary`*4
ELSE `salary`
END AS 新工资
FROM `employees`;

状况2:相似于多重IF语句,实现区间判断
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
....
ELSE 结果n
END

案例:	若是工资>20000,显示级别A
	若是工资>15000,显示级别B
	若是工资>10000,显示级别C
	不然,显示D

SELECT `salary`,
CASE
WHEN `salary`>20000 THEN '级别A'
WHEN `salary`>15000 THEN '级别B'
WHEN `salary`>10000 THEN '级别C'
ELSE '级别C'
END AS 工资级别
FROM `employees`;

-- ##################################做业################
#一、显示系统时间(注:日期+时间)
SELECT NOW();
#二、查询员工号,姓名,工资,以及工资提升百分之 20%后的结果(new salary)
SELECT `employee_id`,`last_name`,`salary`,`salary`*1.2 'new salary'
FROM `employees`;
#三、将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT LENGTH(`last_name`) 'length'
FROM `employees`
ORDER BY SUBSTR(`last_name`,1,1);
#四、作一个查询,产生下面的结果
/*
<last_name> earns <salary> monthly but wants <salary*3>
          Dream Salary
King earns 24000 monthly but wants 72000
*/
SELECT CONCAT(`last_name`,' earns ',`salary`,' monthly but wants ',`salary`*3) 'Dream Salary'
FROM `employees`;


#五、使用 case-when,按照下面的条件:
/*
job     grade
AD_PRES  A
ST_MAN   B
IT_PROG  C
SA_REP   D
ST_CLERK E
产生下面的结果
Last_name Job_id    Grade
king      AD_PRES   A
*/
SELECT `last_name`,`job_id`,
CASE `job_id`
WHEN 'AD_PRES' THEN 'A'
WHEN 'ST_MAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
WHEN 'SA_REP' THEN 'D'
WHEN 'ST_CLERK' THEN 'E'
END Grade
FROM `employees`;



#进阶5:分组函数(聚合函数)
/*
说明:分组函数每每用于实现将一组数据进行统计计算,最终获得一个值,又称为聚合函数或统计函数
常见分组函数:
sum(字段名):求和
avg(字段名):求平均数
max(字段名):求最大值
min(字段名):求最小值
count(字段名):计算非空字段值的个数
*/
#案例1:查询员工信息表中,全部员工的工资和、工资平均值、最低工资、最高工资、有工资的个数
SELECT SUM(`salary`) 全部员工工资和,AVG(`salary`) 工资平均值,
MIN(`salary`) 最低工资,MAX(`salary`) 最高工资
,COUNT(`salary`) 有工资的个数
FROM `employees`;
#案例2:添加筛选条件
# 一、查询emp表中记录数:
SELECT COUNT(`employee_id`) FROM`employees`;
# 二、查询emp表中有佣金的人数:
SELECT COUNT(`salary`) FROM`employees`;	
# 三、统计emp表中月薪大于2500的人数:
SELECT COUNT(`salary`) FROM`employees`WHERE `salary`>2500;	
# 四、查询有领导的人数:
SELECT COUNT(`manager_id`) FROM`employees`;	

#count 补充介绍
#一、统计结果集的行数,推荐使用*
SELECT COUNT(*)FROM `employees`;-- 统计结果集的行数
SELECT COUNT(1) FROM `employees`;
-- 至关于在表中加了一个常量列,这个常量列的值都是1.*效率高,语义性强。
#二、搭配distinct实现去重的统计
SELECT COUNT() FROM `employees`;
# 需求:查询有员工的部门个数
SELECT COUNT(DISTINCT(`department_id`)) FROM `employees`;
#思考:查询每一个部门的总工资或者平均工资
SELECT `department_id`,SUM(`salary`)
FROM `employees`
GROUP BY `department_id`;