假设现在有两张表:部门表(dept)(共两个字段:id,name),员工表(emp)(id,name,salary,dept_id):
问题001:查询所有员工的工资,按升序排列
答案001: select name ,salary from emp
order by salary asc;
问题002:查询每个部门的平均工资是多少?
答案002:select max(d.name),avg(e.salary) //1
from dept d join emp e//2
on d.id = e.dept_id//3
group by d.id;//4
分析002:本条sql的执行顺序是:2---->3---->4--->1,即先确定要查询的表,再对表进行连接,然后按部门ID对得到的连接表进行分组,然后转到第一句,对得到的每个分组的员工工资求平均;
问题003:查询每个部门的工资高于1500的员工的平均工资是多少,按平均工资升序排列。
答案003:select max(d.name),avg(e.salary) avg_sal//1
from dept d join emp e//2
on d.id = e.dept_id//3
where e.salary > 1500//4
group by d.id//5
order by avg_sal asc;//6
分析003:本条sql执行顺序:2---->3---->4---->5---->1---->6;总结一下sql的执行过程from(确定查询对象)---->on(表之间发生关联)----> where(对关联表记录进行过滤)---->group by(对过滤后的记录进行分组,即把联合表分成几个小组)---->having( 对分组进行过滤) ---->select( 得到初步的结果)---->order by(对初步的结果进行排序)
根据sql 的执行顺序:可以得到如下结论
1 表的别名在 on where group by having select order by 后面都可用;
2 字段的别名只有在order by 后面才可以用,因为select 执行顺序在order by 之前,在 from on where ,group by,having 之后;