单世民第二次练习(练习数据初始化.sql)

--工资排序  头十个人
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  以及视图相关东西还没来得及整理  后续整理

猜你喜欢

转载自blog.csdn.net/idiot2B/article/details/80543041