抽出时间去学习,凡事从小做起,不怕单调和重复,长期的积累坚持,想不成功,也难。
目录
在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不行;
having可以对分组之后的数据进行过滤,但它必须和group by 联合使用(但单独使用时效率低);
关键字书写顺序
关键字使用的先后顺序是不能改变的;
select ...
from ...
where ...
group by ...
order by ...
执行顺序
对于mysql中的语句,其实是有执行顺序的,执行顺序和书写顺序大有不同,而且由于执行顺序和书写顺序的不同,出现了很多的误区以及注意点 ,下文有详细描述
from ...
where ...
group by ...
having ...
select ...
order by ...
常见函数
常见的函数分为单行处理函数(处理几行输出几行),和多行处理函数(处理多行返回一行结果)
常见的单行处理函数
-
lower() 转换小写
select lower(uname) as ename from emp;
-
upper() 转换大写
-
substr()取子串,格式:substr(被截取的字符串,起始下标,截取长度)
注意:起始下标从1开始
where substr(ename,1,1) = 'A';
-
length()取长度
-
trim()去空格
-
str_to_date() 将字符串转换成日期
-
date_format()格式化日期
-
round()四舍五入
-
rand()生成随机数
-
ifnull()可以将null转换成一个具体值
分组函数
分组函数又称多行处理函数
-
count计数、sum求和、avg平均值、max最大值、min最小值
-
注意:分组函数必须先分组,然后才能使用,也就是说按照执行顺序,在group by后面才能使用分组函数
错误演示: select ename,sal from emp where sal > min(sal);
理论上这是没问题的,但实际运行中会报错 ;
正确示例: select min(sal) from emp;
-
如果没有分组,那么就默认一张表就是一组
select max(salary) from emp;
注意点:
在数据库中运算时遇见null其结果就是null,但是在分组函数中自动会排除null;
null不是一个值,他表示什么也没有;
count(某个字段)得到的结果是该数据表中的,该字段不为null的字段个数;
分组查询(可分组 )
实际需求中我们会遇到先需要对数据表进行分组,分完组之后在进行查询;
案例演示:
select ename,job ,sum(sal) from emp group by job;
上面这条语句只能在的MySQL在运行,本身无意义,但在Oracle中会报错,应为Oracle的语法要求相对mysql而言比较严格,
重点结论:
在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不行;
你也可以联合两个字段成一个字段看(两个字段联合分组)
select deptno,job,max(sal) from emp group by deptno,job;
注意点
-
加了group by 之后,select后面的字段就不能随意写了,你就只能写group by后面的字段和分组函数;
-
分组函数不能写在where后面,这个执行顺序有关,先分组后使用分组函数;
-
为什么在select后面可以使用分组函数呢,也和执行顺序有关,select执行在group by后面;
//找出每个部门中薪资最高的,显示的最高薪资要大于3000
select ename,job,max(sal) from emp where sal>3000 group by ename,job;
having可以对分组之后的数据进行过滤,但它必须和group by 联合使用(但单独使用时效率低);
效率低代码演示:
select ename,job,max(sal) from emp group by ename,job having sal>3000;
为解决上面效率低的问题,我们可以采用where和having联合使用,此时条件删选会优先考虑where,where完成不了才会考虑having;
优化后策略:
效率低代码演示:
select ename,job,max(sal) from emp group by ename,job having sal>3000;
这样的优化看似愚蠢,但实际上一些实际运用中还真有where解决不了的需要having解决的例如:找出每个部门平均薪资,要求显示的平均薪资高于2500的,针对这个需求,就要having解决了
单表查询总结
可以先从表中查数据,先通过where筛选,然后对筛选后的结果通过having进行过滤;
对于分组函数,他的语法位置是在select后面;
在使用group by进行分组查询之后,要格外注意select后面的字段;
关键字执行顺序,from -- where -- group by -- having -- select -- order by;
综合案例练习:
select * from emp2;
update emp2 set id=3 where age=33;
select * from emp;
select gender,max(age) as '最大年龄' from emp group by gender;
select name,gender,age from emp order by age;
select name,gender,age from emp where name like '小%';
select name,gender,age from emp where name like '小%' order by age;
select name,gender empname,age empgen from emp;
select * from emp where age between 16 and 29 order by age;