#进阶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`;