问题:-如何显示高于部门平均工资的员工的姓名、薪水、所在部门的平均工资
思考:每个部门的平均工资都不一样哦 =。=
做法:一步一步分解递进到最终结果
1、首先知道各个部门平均工资
select avg(sal), deptno from emp group by deptno (NOTE: 这里得到的结果我们可以当做获得了一张临时表,我们搜索过的结果表,再进行查找~~)
2、把以上结果当成一张表
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