sqlserver——复杂查询

SQL Server
614
0
0
2022-04-18

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填充