1、使用group by 和having子句
group by:用于对查询的结果分组统计
having子句用于限制分组显示的结果
例子:
--显示每个部门平均工资和最高工资
select avg(sal),deptno from emp group by deptno;
--显示每个部门的每种岗位的平均工资和最低工资
select avg(sal),min(sal),deptno,job from emp group by deptno,job order by deptno;
注:having往往和group by结合使用,可以对分组查询结果进行筛选
--显示平均工资高于2000的部门好和它的
平均工资
select avg(sal),deptno from emp group by deptno having sal(sal) >2000;
注:对数据分组的总结
1、分组函数只能出现在选择列表,having、order by子句中
2、如果在select 语句中同时包含group by,having ,order by ,那么他们的顺序
是group by,having,order by
3、在选择列中如果有列、表达式、和分组函数、那么这些列和表达式必须有
一个出现在group by子句中,否则会出错
2、多表查询
--显示雇员名字,雇员薪资,部门名字以及部门地址
--如果多张表都有相同名字的字段,则需要带上表名
slect ename,sal,deptname,address from emp,dept where dept.name='sales' and dept.no= emp.no;
2.1自连接
--显示AA员工的上级
select ename from emp where empno = (select mgr from emp where ename='AA');
--显示公司每个员工姓名以及上司的名字
select a.ename,b.ename from emp a,emp b where a.mgr = b.empno;
2.2子查询
嵌入在其他sql语句中的select语句
单行子查询:只返回一行数据的子查询语句
--如何显示与B同一部门的所有员工
select * from emp where deptno = (select deptno from emp where ename ='B');
多行子查询:返回多行数据的子查询
--如何查询部门号为10的工作岗位相同的名字,岗位,
select * from emp where job in (select distinct job from emp where deptno = 10);
--显示高于部门平均工资的员工信息
selct * from emp where sal > select avg(sal),deptno from emp group by deptno;
注:
在from子句中使用子查询
当在from子句中使用子句中使用子查询时,该子查询会被作为一个临时表来对待,
当在from子句中使用子查询时,必须给子查询指定别名
2.3分页查询
--请显示第6个到第10个入职的雇员(按照时间的先后顺序)
注:top 后面的数字表示要取出的几条记录
select top5 * from emp where empno not in (select top5 empno from emp order by hiredate)
order by hiredate;
--显示第1个到第4个入职的雇员
select top4 * from emp order by hiredate;
注;
identity(1,1),表示该字段自增
--如何删除掉一张表重复记录
create table temp--创表
select distinct * into temp from a;
drop table a:
create table a--创表
insert into a select * from temp;
drop table temp;
2.4、左外连接与右外连接
左外连接:指左边的表的记录全部显示,如果匹配的记录就用null填充
--显示公司每个员工和它的上级名字,要求没有上级人,名字也要显示
select w.ename,b.ename from emp w left join emp b on w.mgr=b.empno;
右外连接:指右表记录全部显示,如果没有匹配的就用null填充