练习——部门员工表


create table DEPT
(
  DEPTNO decimal(2) primary key,
  DNAME  VARCHAR(14),
  LOC    VARCHAR(13)
);
create table EMP
(
  EMPNO    decimal(4) primary key,
  ENAME    VARCHAR(10),
  JOB      VARCHAR(9),
  MGR      decimal(4),
  HIREDATE DATETIME,
  SAL      decimal(7,2),
  COMM     decimal(7,2),
  DEPTNO   decimal(2)
);
insert into DEPT (DEPTNO, DNAME, LOC) values (10, 'ACCOUNTING', 'NEW YORK');
insert into DEPT (DEPTNO, DNAME, LOC) values (20, 'RESEARCH', 'DALLAS');
insert into DEPT (DEPTNO, DNAME, LOC) values (30, 'SALES', 'CHICAGO');
insert into DEPT (DEPTNO, DNAME, LOC) values (40, 'OPERATIONS', 'BOSTON');
commit;

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-06-01', 2850, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 3260.95, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 6655, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1730.3, null, 10);
commit;

SELECT * FROM  dept;
select * from emp;


字段说明:
dept(部门表):depno,部门编号;dname,部门名称,loc,办公地点
emp(员工表):EMPNO,工号;ENAME,姓名;JOB,工种;
   MGR,上级编号; HIREDATE,雇佣日期;SAL,工资,COMM,奖金,
 DEPTNO,部门编号

简单查询(单表查询)
1、查询所有没有job的人员 (job为空)
select * from emp where job is null
2、查询姓名以“C”开头的人员,注意,不区别大小写
select * from emp
where ename like'c%' or ename like'C%'
3、查询所有工资在2000到3000到人员,两种写法
select * from emp
where sal between 2000 and 3000;
select * from emp
where sal in(2000,3000);
4、查询所有工资不在2000到3000到人员
select * from emp
where sal not between 2000 and 3000;
5、查询所有10,20,40部门的人员,两种写法
select * from emp
where deptno in(10,20,40);
SELECT 'The current time is: '+ CONVERT(char(30), CURRENT_TIMESTAMP)
select datetime
6、查询工资不为3000的,且在1980年雇佣的人员
select * from emp
where sal !=3000 and hiredate between '1980-1-1'and '1980-12-31';
7、插入2条在今年2.1号就业的人员记录,然后查询本年雇佣的所有人员
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7686, 'XIAOYONG', 'CLERK', 7782, '2010-2-1', 1730.3, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7709, 'SHANZHAN', 'CLERK', 7782, '2010-2-1', 1754.8, 300, 20);
SELECT * from emp
where HIREDATE between '2010-1-1'and '2010-12-31'
8、对比所有人的工资和上涨20%以后的工资
select SAL*1.2 as '涨价20%后'  from emp
union all
select SAL as '涨价前' from emp

select SAL*1.2 as '涨价20%后',SAL as '涨价前'  from emp
9、查询时用户需要看到一个固定的列:school,内容为“lovo”。
select deptno,ename,sal,HIREDATE ,max('lovo') 'school' from emp
group by deptno,ename,sal,HIREDATE;

select empno,ename,'lovo' school from emp;

 
10、查询:部门编号,员工名称,工资。人员按各部门分开,同一部分老员工排在前面。
select deptno,ename,sal,HIREDATE from emp

order by deptno,HIREDATE ;

 

------------------------------------------------------------------

1、查询各部门人数,字段:部门名称,人数。要求一是不显示没有人员的空部门,二是要显示这些空部门。

select d.deptno,d.dname,empno
from dept d,emp e where  d.deptno=e.deptno
order by d.deptno


select d.dname,count(*) as 人数
from dept d,emp e where  d.deptno=e.deptno
group by d.deptno,d.dname


select d.dname,count(*) as 人数
from dept d join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname

要求二
select d.dname,count(e.empno) as 人数
from dept d  left join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname


2、查询人数最多的部门名称,字段:同上
select d.dname,count(e.empno) as 人数
from dept d  left join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname
having count(e.empno)= (
 select max(x) from (
  select count(e.empno) as x
  from dept d  left join emp e on  d.deptno=e.deptno
  group by d.deptno,d.dname
 ) t
)
--方法2:使用视图(类似于内存中的一个表)
create view  v1
as
 select d.deptno,d.dname,count(e.empno) as x
 from dept d  left join emp e on  d.deptno=e.deptno
 group by d.deptno,d.dname

select * from v1
where x = (select max(x) from v1)
3、查询至少有3个人部门,字段:同上
SELECT * FROM  dept;
select * from emp;


4、查询各员工及其直接上级信息,字段:员工姓名,上级姓名
(提示:上级编号在mgr字段)

select e1.ename 员工姓名,e2.ename 上级姓名 from emp e1 join emp e2
on e1.mgr=e2.empno

5、查询比上级来得早的员工及上级信息,字段:员工姓名,上级姓名,雇佣日期
SELECT * FROM  dept;
select * from emp;

select e1.ename 员工姓名,e2.ename 上级姓名,e1.hiredate 雇佣日期  from emp e1 join emp e2
on e1.mgr=e2.empno
where e1.hiredate<e2.hiredate
6、需求同上,只是字段不同:员工姓名,上级姓名,员工雇佣日期,上级雇佣日期
select e1.ename 员工姓名,e2.ename 上级姓名,e1.hiredate 员工雇佣日期,e2.hiredate 上级雇佣日期 from emp e1 join emp e2
on e1.mgr=e2.empno
where e1.hiredate<e2.hiredate

7、查询没有员工的部门,分别使用not in和not exists方法
SELECT * FROM dept;
select * from emp;

select d.dname from dept d
where d.deptno not in (select e.deptno from emp e);

8、查询各部门工资最高的员工,要求使用2种方法
select
9、查询:部门名称,员工名称,工资。人员按各部门分开,同一部分老员工排在前面。
    要求2种方法,一种是使用多表连接,一种不能使用多表连接。
创建工资表t_sal(autoid,empno,salary,date_sal),autoid代表流水号,date_sal代表禽工资日期。并添加一些记录。如果员工没有领取过工资,则不会在表中记录。
10、查询所有人员领取工资的详细记录:部门名称,人员姓名,工资,领取日期。要求,有些员工没有领取工资,则该月领取的工资记为0(注意:这些人的工资记录在表中并不存在。
11、查询某个月领取过二次工资的人员名单:人员姓名,领取次数,月份

 

1、查询各部门人数,字段:部门名称,人数。
要求一是不显示没有人员的空部门,二是要显示这些空部门。
要求一:使用传统写法和join写法
select d.deptno,d.dname,empno
from dept d,emp e where  d.deptno=e.deptno
order by d.deptno


select d.dname,count(*) as 人数
from dept d,emp e where  d.deptno=e.deptno
group by d.deptno,d.dname


select d.dname,count(*) as 人数
from dept d join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname

要求二
select d.dname,count(e.empno) as 人数
from dept d  left join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname

 

2、查询人数最多的部门名称,字段:同上

 

select d.dname,count(e.empno) as 人数
from dept d  left join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname
having count(e.empno)= (
 select max(x) from (
  select count(e.empno) as x
  from dept d  left join emp e on  d.deptno=e.deptno
  group by d.deptno,d.dname
 ) t
)

--效率较低,但简单的方法:相关子查询

--方法2:使用视图(类似于内存中的一个表)
create view  v1
as
 select d.deptno,d.dname,count(e.empno) as x
 from dept d  left join emp e on  d.deptno=e.deptno
 group by d.deptno,d.dname

select * from v1
where x = (select max(x) from v1)

 


3、查询至少有3个人部门,字段:同上
select d.deptno,d.dname,count(e.empno) as x
from dept d  left join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname
having count(e.empno)>=3

 

4、查询各员工及其直接上级信息,字段:员工姓名,上级姓名
(提示:上级编号在mgr字段)

select yg.ename as 员工姓名,sj.ename as 上级姓名
from emp yg,emp sj
where yg.mgr=sj.empno

一个自己连接自己,叫“自连接”!

5、查询比上级来得到的员工及上级信息,字段:员工姓名,上级姓名,雇佣日期


6、需求同上,只是字段不同:员工姓名,上级姓名,员工雇佣日期,上级雇佣日期
7、查询没有员工的部门,分别使用not in和not exists方法
8、查询各部门工资最高的员工,要求使用2种方法
9、查询:部门名称,员工名称,工资。人员按各部门分开,同一部分老员工排在前面。
    要求2种方法,一种是使用多表连接,一种不能使用多表连接。
创建工资表t_sal(autoid,empno,salary,date_sal),autoid代表流水号,date_sal代表禽工资日期。并添加一些记录。
如果员工没有领取过工资,则不会在表中记录。
10、查询所有人员领取工资的详细记录:部门名称,人员姓名,工资,领取日期。
要求,有些员工没有领取工资,则该月领取的工资记为0(注意:这些人的工资记录在表中并不存在。
11、查询某个月领取过二次工资的人员名单:人员姓名,领取次数,月份
1、查询各部门人数,字段:部门名称,人数。
要求一是不显示没有人员的空部门,二是要显示这些空部门。
要求一:使用传统写法和join写法
select d.deptno,d.dname,empno
from dept d,emp e where  d.deptno=e.deptno
order by d.deptno


select d.dname,count(*) as 人数
from dept d,emp e where  d.deptno=e.deptno
group by d.deptno,d.dname


select d.dname,count(*) as 人数
from dept d join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname

要求二
select d.dname,count(e.empno) as 人数
from dept d  left join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname

 

2、查询人数最多的部门名称,字段:同上

select *
from deptno;
group by depno

select d.dname,count(e.empno) as 人数
from dept d  left join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname
having count(e.empno)= (
 select max(x) from (
  select count(e.empno) as x
  from dept d  left join emp e on  d.deptno=e.deptno
  group by d.deptno,d.dname
 ) t
)

--效率较低,但简单的方法:相关子查询

--方法2:使用视图(类似于内存中的一个表)
create view  v1
as
 select d.deptno,d.dname,count(e.empno) as x
 from dept d  left join emp e on  d.deptno=e.deptno
 group by d.deptno,d.dname

select * from v1
where x = (select max(x) from v1)

 


3、查询至少有3个人部门,字段:同上
select d.deptno,d.dname,count(e.empno) as x
from dept d  left join emp e on  d.deptno=e.deptno
group by d.deptno,d.dname
having count(e.empno)>=3

 

4、查询各员工及其直接上级信息,字段:员工姓名,上级姓名
(提示:上级编号在mgr字段)

select yg.ename as 员工姓名,sj.ename as 上级姓名
from emp yg,emp sj
where yg.mgr=sj.empno

一个自己连接自己,叫“自连接”!但是两次的身份是不一样的:员工和上级!


5、查询比上级来得早的员工及上级信息,字段:员工姓名,上级姓名,雇佣日期
select yg.ename as 员工姓名,sj.ename as 上级姓名,yg.hiredate 员工日期,sj.hiredate 上级日期
from emp yg,emp sj
where yg.mgr=sj.empno
and yg.hiredate<sj.hiredate


6、需求同上,只是字段不同:员工姓名,上级姓名,员工雇佣日期,上级雇佣日期


7、查询没有员工的部门,分别使用not in和not exists方法

select * from dept where deptno not in (select distinct deptno from emp)

select * from dept where not exists (select * from emp where dept.deptno=emp.deptno)


8、查询各部门工资最高的员工,要求使用2种方法
select * from dept;
select * from emp order by deptno,sal desc

select ename,sal
from emp a
where sal = (select max(sal) from emp b where  b.deptno=a.deptno)

select ename,sal
from emp e, (select deptno,max(sal) x from emp group by deptno) a
where e.deptno=a.deptno
and e.sal=a.x


9、查询:部门名称,员工名称,工资。人员按各部门分开,同一部门老员工排在前面。
    要求2种方法,一种是使用多表连接,一种不能使用多表连接。
select dept.dname,emp.ename,emp.sal,emp.hiredate
from emp,dept where emp.deptno=dept.deptno
order by dept.dname,hiredate


创建工发放表t_sal(autoid,empno,salary,date_sal),
autoid代表流水号,date_sal代表工资日期。并添加一些记录。

如果员工没有领取过工资,则不会在表中记录。

10、查询所有人员领取工资的详细记录:部门名称,人员姓名,工资,领取日期。
要求,有些员工没有领取工资,则该月领取的工资记为0(注意:这些人的工资记录在表中并不存在。
11、查询某个月领取过二次工资的人员名单:人员姓名,领取次数,月份

你可能感兴趣的:(员工)