使用 scott/tiger 用户下的 emp 表和 dept 表完成下列练习表的结构说明如下
emp 员工表(empno 员工号/ename 员工姓名/job 工作/mgr 上级编号/hiredate 受雇日期/sal
薪金/comm 佣金/deptno 部门编号)
dept 部门表(deptno 部门编号/dname 部门名称/loc 地点)
工资=薪金+佣金
1列出至少有一个员工的所有部门。
2列出薪金比“SMITH”多的所有员工。
3列出所有员工的姓名及其直接上级的姓名。
4列出受雇日期早于其直接上级的所有员工。
5列出部门名称和这些部门的员工信息同时列出那些没有员工的部门。
6列出所有“CLERK”办事员的姓名及其部门名称。
7列出最低薪金大于 1500 的各种工作
8列出在部门“SALES”销售部工作的员工的姓名假定不知道销售部的部门编号。
9列出薪金高于公司平均薪金的所有员工。
10列出与“SCOTT”从事相同工作的所有员工。
11列出薪金等于部门 30 中员工的薪金的所有员工的姓名和薪金。
12列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金。
13列出在每个部门工作的员工数量、平均工资和平均服务期限。
14列出所有员工的姓名、部门名称和工资。
15列出所有部门的详细信息和部门人数。
16列出各种工作的最低工资。
17列出各个部门的 MANAGER经理的最低薪金。
18列出所有员工的年工资,按年薪从低到高排序。
1列出至少有一个员工的所有部门。(两个表联合查询及 group by...having 的用法)
select dname from dept where deptno in(select deptno from emp group by deptno having
count()>1);
2列出薪金比“SMITH”多的所有员工。(经典的自连接查询)
select ename from emp where sal>(select sal from emp where ename like'SMITH');
3列出所有员工的姓名及其直接上级的姓名。(多次对自己查询,为表的取个别名内部查
询可以像对象一样引用外部的对象的字段这里引用与编程中的作用域相似即与{}类比)
select ename,(select ename from emp where empno in(a.mgr)) from emp a ;
4列出受雇日期早于其直接上级的所有员工。(同上,日期可直接拿来比较)
select ename from emp a where HIREDATE<(select HIREDATE from emp where empno
in(a.mgr));
5列出部门名称和这些部门的员工信息同时列出那些没有员工的部门(以 emp 表为主
左连接查询)
select dname,emp. from dept left join emp on dept.deptno=emp.deptno;
6列出所有“CLERK”办事员的姓名及其部门名称。(域注意())
select ename,(select dname from dept where deptno in(a.deptno)) as dname from emp a
where JOB like'CLERK';
7列出最低薪金大于 1500 的各种工作。
select job from emp where sal>1500;
8列出在部门“SALES”销售部工作的员工的姓名假定不知道销售部的部门编号。(经
典的两个表连接)
select ename from emp where deptno=(select deptno from dept where dname
like'SALES');
9列出薪金高于公司平均薪金的所有员工。(反复查自己)
select ename from emp where sal>( select avg( sal) from emp);
10列出与“SCOTT”从事相同工作的所有员工。(排除自己)
select ename from emp where job in(select job from emp where ename like'SCOTT') and
ename!='SCOTT' ;
11列出薪金等于部门 30 中员工的薪金的所有员工的姓名和薪金。(any 的用法且排挤)
select ename,sal from emp where sal=any(select sal from emp wheredeptno=30) and
deptno!=30;
12列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金。(max 的用法)
select sal,ename from emp where sal>(select max(sal) from emp where deptno=30);
13列出在每个(每个是关键字,对此 group by)部门工作的员工数量、平均工资和平均服务
期限。(经典的 group by 用法)
select deptno,count(),avg(a.sal),avg(sysdate-HIREDATE) from emp a group by deptno;
14列出所有员工的姓名、部门名称和工资.(经典的两个表的连接查询用具体的名称替换
一个表中的主键的 id (解决很多人在实际运用中会遇到的不能绑定多列的问题)也可用
where 来查询 ,与题 5 比较)
select ename,sal,(select dname from dept a where a.deptno=b.deptno)as dname from
emp b;
15列出所有部门的详细信息和部门人数。(因为是将显示 dept 和后面临时表 b 的全部
字段(注意:不只是 dept 的字段,注意号))
select * from dept a left join (select deptno,count() from emp group by deptno) b on
a.deptno=b.deptno ;
16列出各种(与每个同义(参看题 13))工作的最低工资。
select job,min(sal) from emp group by job ;
17列出各个部门的 MANAGER经理,经理唯一不用 group by的最低薪金。
select min(sal) from emp where job like'MANAGER';(因为 MANAGER 是值不是字段所以
不能用小写)
18列出所有员工的年工资,按年薪从低到高排序。(nvl:空转化函数)
select ename,sal+nvl(comm,0) as sal from emp order by sal ;