二、函数的使用

使用的数据为上一节中的员工信息数据employes

/*
select 函数名(实参列表) from 表;
分类:1.单行函数:字符函数、数学函数、日期函数、其他函数、流程控制函数
      2.分组函数:又称统计函数
*/

#一.字符函数
#length():返回参数值字节个数
SELECT LENGTH('john');
SELECT LENGTH('祖国');

#concat():拼接字符串
SELECT CONCAT(name_last,'_',name_first) FROM employes;

#upper(),lower()
SELECT UPPER('john');#将字符串改为大写
SELECT LOWER('joHn');#将字符串改为小写

#substr,substring
SELECT SUBSTR('今天是个伟大日子',7) out_put;#截取第7个字符以后的所有字符
SELECT SUBSTRING('今天是个伟大日子',3,2) out_put;#截取第3个字符以后的两个字符

#instr()
SELECT INSTR('孤帆远影碧空尽,唯见长江天际流','长江') AS out_put;#返回指定字符串在目标字符串中的起始位置

#trim()#去除前后空格
SELECT TRIM(' 张翠山 ') AS out_put;
SELECT TRIM('a'FROM'aaa张翠山aaa') AS out_put;#去除前后的'a'

#lpad()#左填充指定长度字符
SELECT LPAD('殷素素',10,'*') AS out_put; 

#rpad()#右填充指定长度字符
SELECT RPAD('殷素素',10,'*') AS out_put; 

#replace()#替换函数
SELECT REPLACE('孤帆远影碧空尽,唯见长江天际流','长江','黄河')

#二,数学函数

#round()四舍五入
SELECT ROUND(4.3332,2);

#ceil()向上取整
SELECT CEIL(4.72638);
SELECT CEIL(-4.72638);

#floor()向下取整
SELECT FLOOR(5.3827);

#truncate()截断
SELECT TRUNCATE(1.76378,1)

#mod()取余
SELECT MOD(-10,-3);
SELECT MOD(8,3);

#三,日期函数
#now()返回当前系统日期+时间
SELECT NOW();

#curdate()返回当前系统日期,不包含时间
SELECT CURDATE();

#curtime()返回当前的系统时间
SELECT CURTIME();

#获取指定部分时间
SELECT YEAR(NOW());
SELECT YEAR('2008-3-27');

SELECT MONTH(NOW());
SELECT MONTH('2008-3-27');

SELECT DAY(NOW());
SELECT DAY('2008-3-27');

#str_to_date()将字符串转换成指定格式的日期
SELECT STR_TO_DATE('2009-2-12','%Y-%c-%d') AS out_put;

#date_format()将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日');

#四、其他函数
SELECT VERSION();#查看当前版本
SELECT DATABASE();#查看当前数据库
SELECT USER();


#五、流程控制函数
#1.if函数
SELECT IF(10>5,'大','小');
SELECT name_first,commission_pet,IF(salary>7000,'nice','shit') AS 备注 FROM employes;

#2.case函数
#(1)等值判断
/*
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
...
else 要显示的值或语句;
end
*/
SELECT salary 原始工资,department_id,
CASE department_id
WHEN 745 THEN salary*1.2
WHEN 746 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employes;

#(2)区间值判断,类似于多重if
/*
case 
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
。。。
else 要显示的值或语句
end
*/
SELECT salary,
CASE 
WHEN salary >8000 THEN '一般'
WHEN salary >7000 THEN '良好'
WHEN salary >6000 THEN '优秀'
ELSE '不错'
END AS '备注'
FROM employes;

#六,分组函数
/*
sum,avg,max,min,count
*/

#1.简单使用
SELECT SUM(salary) FROM employes;
SELECT COUNT(salary) FROM employes;
SELECT SUM(salary),AVG(salary),MIN(salary) FROM employes;

#2.参数支持哪些类型
SELECT SUM(name_last) FROM employes;#字符进入不报错,但是结果为0,无意义
SELECT MIN(name_last) FROM employes;#由于字符串可以排序,所以最大最小值生效

#3.忽略null值:计算sum()和avg(),表格中的Null值不参与运算

#4.和distinct搭配使用
SELECT SUM(DISTINCT salary) FROM employes;#去重之后再求和
SELECT COUNT(DISTINCT salary) FROM employes;#去重之后再计数

#5.count()函数的详细介绍
SELECT COUNT(salary) FROM employes;


#五.分组查询group by()
/*
select 分组函数(),列 from 表 【where 筛选条件】 group by 分组列表 【order by】;
*/

#(1)简单分组查询
#email中含有5的数据,按照部门分组求平均工资
SELECT AVG(salary) AS 平均工资,department_id FROM employes WHERE email LIKE '%5%' GROUP BY department_id;
#对高于7000的数据,求每个领导下的员工最高工资
SELECT MAX(salary) AS 最高工资,manager_id FROM employes WHERE salary>7000 GROUP BY manager_id;

#(2)添加复杂的筛选条件
#分组前的筛选条件用where(),放在group by()前面;分组后的筛选条件用having(),放在group by()后面。

#部门人数大于2的部门
SELECT COUNT(*),department_id FROM employes GROUP BY department_id HAVING COUNT(*)>2;#having()可以执行分组后的筛选
#查询每个工种有奖金的员工的最高工资大于7000的工种编号和最高工资
SELECT MAX(salary),job_id FROM employes WHERE commission_pet IS NOT NULL GROUP BY job_id HAVING MAX(salary)>7000;
#查询领导编号大于581的每个领导手下员工最低工资大于5000的数据
SELECT MIN(salary),manager_id FROM employes WHERE manager_id >581 GROUP BY manager_id HAVING MIN(salary)>5000;

#(3)按表达式或函数分组
#按照姓名长度分组,并把员工个数大于1的组的员工个数列出来
SELECT COUNT(*),LENGTH(CONCAT(name_last,name_first)) AS 姓名长度
FROM employes 
GROUP BY LENGTH(CONCAT(name_last,name_first)) 
HAVING COUNT(*)>1;

#(4)先按照部门分组,再按照工种分组,求平均工资
SELECT AVG(salary),department_id,job_id
FROM employes
GROUP BY department_id,job_id;

你可能感兴趣的:(SQL)