1、关于查询结果去重
mysql> select distinct job from emp ;//distinct关键字
mysql> select ename,distinct job from emp;
以上的sql语句时错误的。
记住:distinct只能出现在所有字段的最前面。distinct后面有几个字段,就将后面的若干字段看成一个整体来进行去重。
案例:统计岗位的数量?
2、关于分组语句与分组函数
分组函数包括:
count/avg/sum/max/min
分组语句group by
mysql>select max(sal),job from emp group by job;
注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。并且当任何一个分组函数都是在group by语句执行结束之后才会执行的。当一条sql语句没有group by的话,整张表的数据会自成一组。
注意:当查询语句使用了分组语句group by时,select语句后面只能跟与分组有关的字段和分组函数!
如:select ename,job,max(sal) from emp group by job;
以上语句是错误的!ename字段既没有参与分组,又不是查询函数,所以该条查询命令出来结果将毫无意义(因为mysql语言比Oracle松散,所以才能出现结果,如果放在Oracle中运行将直接报错)
多次分组
按照字段进行多个分组,如查询每个部门每个岗位的工资总和:
image.png
3、having与where语句
案例:找出每个部门的最高薪资,要求显示薪资大于2900的数据。
第一种:where语句
第二种:having语句
注意:由于在查询语句中,语句的执行顺序where>group by>having,所以先执行where可以先过滤掉一部分无用的数据,再进行分组,而having语句需要对分组后的数据进行过滤。
所以在这种情况中where语句更有效率。
案例:找出每个部门的平均薪资,要求显示薪资大于2000的数据。
注意:此时只能使用having语句,因为此时计算平均值时需要计算全部数据,不能将其他去掉,所以最后过滤平均薪资小于2000的数据
4、计算日期差
TimeStampDiff(间隔类型, 前一个日期, 后一个日期)
timestampdiff(YEAR, hiredate, now())
间隔类型:
SECOND 秒,
MINUTE 分钟,
HOUR 小时,
DAY 天,
WEEK 星期
MONTH 月,
QUARTER 季度,
YEAR 年
5、含有NULL的运算与空处理函数
select ename,(sal+comm)*12 as yearsal form emp;
注意:所有数据库都是这样规定,只要有NULL参与运算的运算结果一定是NULL。
ifnull()空处理函数
ifnull(可能为NULL的数据,被当作什么处理)
属于单行处理函数。
其中sum函数在进行运算时会自动过滤NULL