表的复杂查询
说明:
在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给
大家介绍较为复杂的select语句
数据分组 -max(最大),min(最小),avg(平均),sum(和),count(统计)
见下例:
--如何显示所有员工中最高工资和最低工资
select min(sal)"最低工资",max(sal)"最高工资" from emp
--显示最低工资并显示出雇员名字
select ename"姓名",sal"工资" from emp where sal=(select min(sal) from emp)
--显示所有员工的平均工资和工资总和
select avg(sal)"平均工资",sum(sal)"工资总和" from emp
--把高于平均工资的雇员的名字和他的工资显示出来
select ename,sal from emp where sal>(select avg(sal) from emp) order by sal
--计算共有多少员工
select count(*)"雇员数" from emp
--扩展要求
--请显示工资最高的员工的名字、工作岗位
select ename,job from emp where sal=(select max(sal) from emp)
--请显示工资高于平均工资的员工信息,并显示平均工资(效率不高)
select ename"姓名",job"岗位",sal"工资",(select avg(sal) from emp)"平均工资" from emp where sal>(select avg(sal) from emp) order by sal
表的复杂查询
group by和having子句
group by用于对查询的结果分组统计
having子句用于限制分组显示结果
例:
1 --group by和having子句使用(having与group by结合使用,可以对分组后的查询结果进行筛选) 2 3 --如何显示每个部门的平均工资和最高工资 4 select deptno"部门号",avg(sal)"平均工资",max(sal)"最高工资",min(sal)"最低工资" from emp group by deptno 5 6 --如何显示每个部门的平均工资和最高工资并显示部门名称(多表查询) 7 select emp.deptno"部门号",avg(sal)"平均工资",max(sal)"最高工资",min(sal)"最低工资",dept.dname"部门名称" from emp,dept where emp.deptno=dept.deptno group by emp.deptno,dept.dname 8 9 --显示每个部门的每种岗位的平均工资和最低工资 10 select deptno"部门号",job"岗位",avg(sal)"平均工资",min(sal)"最低工资" from emp group by deptno,job order by deptno 11 12 --显示平均工资低于2000的部门号和它的平均工资 13 select deptno"部门号",avg(sal)"平均工资" from emp group by deptno having avg(sal)<2000 14 15 --显示平均工资大于2000的部门号和它的平均工资并按升序排列 16 select deptno"部门号",avg(sal)"平均工资" from emp group by deptno having avg(sal)>2000 order by "平均工资"
2、如果在select语句中同时包含有group by,having,ovrder by那么他们的顺序是group by,having,order by
3、在选择列中如果有列、表达式、和分组函数,那么这些列和表达式必需有一个出现在group by子句中,否则就会出错
如:
select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000