select top 10 empno,ename,sal
from emp
order by sal desc
--排名在第六到第十的
with t as(select top 10 row_number() over (order by sal desc)xh,ename,sal
from emp
order by sal desc)
select *
from t
where xh>=6 and xh<=10
--寻找随机数产生函数
select rand()
as '随机数'
select cast( floor(rand()*100) as int)
select cast(ceiling(rand() * 100) as int)
--哪个部门提供了anlyst clerk manager三个职位
select distinct job
from emp
--包含这三个职位的部门
select distinct dname
from emp join dept
on emp.DEPTNO = dept.DEPTNO
where job in ('analyst','clerk','manager')
--每个职位都包含的部门
(select distinct dname
from emp join dept
on emp.DEPTNO = dept.DEPTNO
where job in ('analyst'))intersect(select distinct dname
from emp join dept
on emp.DEPTNO = dept.DEPTNO
where job in ('clerk'))intersect(select distinct dname
from emp join dept
on emp.DEPTNO = dept.DEPTNO
where job in ('manager'))
--找到每一个集合的包含关系 也就是每一个部门号包含的职位 a 并b 得a a交b 得b a-b 不为空集 b-a为空集
--提供工资在两千到五千职位的部门(方法一)
--相当于对于dept表的每一行 一个deptno下 寻找与emp表同一个deptno的job 如果a-b为空集 说明后者包含前者 也就是说对于某一个特定部门 后者的job包含两千到五千人员job的所有范围
--所以可以把部门号输出
select dname
from dept
where not exists (select job
from emp
where sal<=5000 and sal>=2000
except
select job
from emp
where deptno = dept.deptno )
---输出每个部门员工数 每个部门工资总和和平均工资 先显示research部门,再将其他部门按字典序排序
select dname,count(empno) empcnt,sum(sal) sumsal,sum(comm) sumcomm
from dept left join emp on dept.deptno=emp.deptno
group by dname
order by case dname when 'RESEARCH' then 1
else 2
end,dname;
--再把每个部门有哪些职位及对应多少人
--行列转换
with a as
(select empno,deptno
,case job when 'ANALAYT' then 1 end ANALAYT --不满足条件返回null
,case job when 'CLERK' then 1 end CLERK
,case job when 'MANAGER' then 1 end MANAGER
,case job when 'PRESIDENT' then 1 end PRESIDENT
,case job when 'SALESMAN' then 1 end SALESMAN
from emp)
select deptno,sum(ANALAYT) ANALATY --聚集函数忽略null
,sum(CLERK) CLERK
,sum(MANAGER) MANAGER
,sum(PRESIDENT) PRESIDENT
,sum(SALESMAN) SALESMAN
from a
group by deptno
--select into存储一个新的表,并删除
with a as
(select empno,deptno
,case job when 'ANALAYT' then 1 end ANALAYT --不满足条件返回null
,case job when 'CLERK' then 1 end CLERK
,case job when 'MANAGER' then 1 end MANAGER
,case job when 'PRESIDENT' then 1 end PRESIDENT
,case job when 'SALESMAN' then 1 end SALESMAN
from emp)
select deptno,sum(ANALAYT) ANALATY --聚集函数忽略null
,sum(CLERK) CLERK
,sum(MANAGER) MANAGER
,sum(PRESIDENT) PRESIDENT
,sum(SALESMAN) SALESMAN
into newtb2
from a
group by deptno --要是只想要框架,不想要内容,再加一句having 1=2;
having 1=2
drop table newtb2
--视图:简化查询的数据库对象
create view vw_pivot as --现查询,实际上相当于查询了一遍查询语句,是不存储数据的
select deptno,sum(ANALAYT) ANALATY --聚集函数忽略null
,sum(CLERK) CLERK
,sum(MANAGER) MANAGER
,sum(PRESIDENT) PRESIDENT
,sum(SALESMAN) SALESMAN
from(
select empno,deptno
,case job when 'ANALAYT' then 1 end ANALAYT --不满足条件返回null
,case job when 'CLERK' then 1 end CLERK
,case job when 'MANAGER' then 1 end MANAGER
,case job when 'PRESIDENT' then 1 end PRESIDENT
,case job when 'SALESMAN' then 1 end SALESMAN
from emp)a
group by deptno;
select *
from vw_pivot
drop view vw_pivot
select empno,ename,sal
from emp
create view vw_1000sal as
select empno,ename,sal
from emp
where sal>1000
--with check option; --原来满足视图条件的行,经过更改了不满足查询条件,就不允许这个更改
select empno,ename,sal
from vw_1000sal
begin transaction
update vw_1000sal set sal=sal+1000 --update vw_2500sal set sal=sal+1000(只有满足视图条件的才会更改)
select * from vw_1000sal
rollback;
--begin transaction 以及视图相关东西还没来得及整理 后续整理