SQL Server 复杂查询 子查询 分页查询 identity(1,1)自增 ——学习笔记

时间:2021-03-04 00:26:26

问题:-如何显示高于部门平均工资的员工的姓名、薪水、所在部门的平均工资 

思考:每个部门的平均工资都不一样哦 =。=SQL Server 复杂查询 子查询 分页查询 identity(1,1)自增 ——学习笔记

做法:一步一步分解递进到最终结果

1、首先知道各个部门平均工资

select avg(sal), deptno from emp group by deptno (NOTE: 这里得到的结果我们可以当做获得了一张临时表,我们搜索过的结果表,再进行查找~~)

2、把以上结果当成一张表SQL Server 复杂查询 子查询 分页查询 identity(1,1)自增 ——学习笔记

select emp.ename, emp.sal, temp.myavg ,emp.deptno  from emp,(select avg(sal)myavg , deptno from emp group by deptno )temp  

(NOTE:这个temp是括号就是之前搜索的临时表的别名,下横线表示别名)

where emp.deptno = temp.deptno and emp.sal > temp.myavg

(NOTE:大家自信看上面,为何要括号看做先获得的一张表,就是子表,要别名是为了找到它里面的行列信息)


问题:请显示第5个到第10个入职的员工(按照时间的先后循序)

思考:应用分页查询

1、显示第一个到第4个入职的员工

select top 4 * from emp order by hiredate

 (NOTE:top 指令从头开始,hiredate指令是加入的时间循序)

2、依旧把上面搜索的表当做结果

select top 6 * from emp where empno not in 

( select top 4 empno from emp order by hiredate ) (NOTE:这里还是通过子查询,把前4个的人编号去掉)

order by hiredate (NOTE:这句话不能少!!因为是按照时间循序去掉的,不然就不是按时间循序了!)


/*****************测试*********************************************

--identity(1,1)  例如下面表示testId 字段自增,从1,每次+1 

create table test(

testId int primary key identity(1,1),

testName varchar(30),

testPass varchar(30)

)

insert into test (testName,testPass)  values  ("Chiuan" , "Chiuan" ) ;

insert into test (testName,testPass)  select testName, testPass from test;  (这句话疯狂拷贝,可以用来做压力测试)


运行上面这句话,使数据增长到百万~~~~
-- test 表按照id排序 select top 6 * from test where testId not in  (select top 99 testId from test ) 
(NOTE:我们运行以上,不管增加99 分页查找速度还是依旧很快的哦!!谢谢老师~~)

问题:如何删除一张表中重复的记录 create table cat( catId int, catName varchar(30) )
insert into cat values(11,' Chiuan ' )   (Note: 我们运行几次,可以得到重复数据,因为没有设置primary key所以这里允许重复id数据)
 select  * from cat
select distinct * into #temp from cat   (NOTE: 这句话创建了临时表,并且只有非重复记录,以下的应该都知道啦  ) delete from cat  insert into cat select * from #temp drop table #temp
左外连接和右外连接 问题:显示公司每个员工和它上级的名字 内连接 select w.ename , b.ename from emp w, emp b where w.mgr = b.empno 显示公司每个员工和它的上级的名字,要求没有上级的人,名字也要显示 左外连接:指左边的表的记录全部显示,如果没有匹配的记录就用null填 右外连接:指右边的表的记录全部显示,如果没有匹配的记录就用null填 select w.ename , b.ename from emp w left joinemp b on w.mgr=b.empno