Oracle初级测试题五--多表连接

涎涎原创约 1792 字大约 6 分钟...OracleOracle

16-Oracle初级测试题五--多表连接.mdopen in new window

注意

本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。

--写一条查询语句,查询员工姓名、部门名称、工作地点?

select ename,dept.dname,dept.loc from emp,dept where emp.deptno(+) = dept.deptno;

--练习一

--1.写一个查询,显示所有员工姓名,部门编号,部门名称。

select ename,dept.deptno,dept.dname
from emp,dept
where emp.deptno(+) = dept.deptno;

--2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金

select ename,dept.loc,comm
from emp,dept
where emp.deptno = dept.deptno and loc in 'CHICAGO' 
and comm is not null;

--3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。

select ename,dept.loc
from emp,dept
where emp.deptno = dept.deptno and ename like '%A%';

select ename,dept.loc
from emp,dept
where emp.deptno = dept.deptno and instr(ename,'A') <> 0;

select ename,dept.loc
from emp,dept
where emp.deptno = dept.deptno and instr(ename,'A') != 0;

select ename,dept.loc
from emp,dept
where emp.deptno = dept.deptno and instr(ename,'A') > 0;

--练习二

--1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。

select empno,ename,sal,grade,loc
from emp,dept,salgrade
where emp.deptno = dept.deptno and sal between losal and hisal
order by sal asc;

--思考:查询每个员工的姓名和直接上级姓名?

select worker.ename,manager.ename
from emp worker,emp manager
where worker.mgr = manager.empno(+);

如何区分外部连接的符号(+)放在哪一边这是我一直没有搞清楚的地方

--练习三

--1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。

select worker.ename,worker.empno,manager.ename,worker.mgr
from emp worker,emp manager,dept
where worker.mgr = manager.empno(+)
and worker.deptno = dept.deptno 
and loc in ('NEW YORK','CHICAGO');

--2.第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。

select worker.ename,worker.empno,manager.ename,worker.mgr
from emp worker,emp manager,dept
where worker.mgr = manager.empno(+)
and worker.deptno = dept.deptno 
and loc in ('NEW YORK','CHICAGO')
order by worker.empno asc;

--3.查询所有员工编号,姓名,部门名称,包括没有部门的员工也要显示出来。

select empno,ename,dept.dname
from emp,dept
where emp.deptno(+) = dept.deptno;

--练习四 --使用SQL-99写法,完成如下练习 --1.创建一个员工表和部门表的交叉连接。

交叉连接会产生两个表的交叉乘积,
和两个表之间的笛卡尔积是一样的;
使用CROSS JOIN 子句完成。

select * from emp cross join dept;

--2.使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期

自然连接是对两个表之间相同名字和
数据类型的列进行的等值连接;
如果两个表之间相同名称的列的数据类型不同,
则会产生错误;
使用NATURAL JOIN子句来完成。

select ename,dname,hiredate
from emp
natural join dept
where hiredate > '01-5月-80';

--3.使用USING子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点

自然连接是使用所有名称和
数据类型相匹配的列作为连接条件,
而USING子句可以指定用某个或
某几个相同名字和数据类型的列作为连接条件。

使用USING子句创建连接时,应注意以下几点:

如果有若干个列名称相同但数据类型不同,
自然连接子句可以用USING子句来替换,
以指定产生等值连接的列。
如果有多于一个列都匹配的情况,
使用USING子句只能指定其中的一列。
USING子句中的用到的列不能使用表名和别名作为前缀。
NATURAL JOIN子句和USING子句是相互排斥的,
不能同时使用。

select ename,dname,loc
from emp 
join dept using(deptno)
where loc in 'CHICAGO';

--4.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点,薪资等级

自然连接条件基本上是具有相同列名的表之间的等值连接;
如果要指定任意连接条件,
或指定要连接的列,
则可以使用ON子句;
用ON将连接条件和其它检索条件分隔开,
其它检索条件写在WHERE子句;
ON子句可以提高代码的可读性。 

select ename,dname,loc,grade
from emp join dept
on emp.deptno = dept.deptno
join salgrade
on sal between losal and hisal
where loc in 'CHICAGO';

--5.使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。

左外连接以FROM子句中的左边表为基表,
该表所有行数据按照连接条件无论是否与右边表能匹配上,
都会被显示出来。 

select worker.ename,manager.ename
from emp worker
left outer join emp manager
on worker.mgr = manager.empno;

--6.使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。

右外连接以FROM子句中的右边表为基表,
该表所有行数据按照连接条件无论是否与左边表能匹配上,
都会被显示出来。 

select worker.ename,manager.ename
from emp manager
right outer join emp worker
on worker.mgr = manager.empno;

--课后作业 --1.显示员工SMITH的姓名,部门名称,直接上级名称

select worker.ename,dname,manager.ename
from emp worker,emp manager,dept
where worker.mgr = manager.empno
and worker.deptno = dept.deptno 
and worker.ename in 'SMITH'; --通常写法

select worker.ename,dname,manager.ename
from emp worker join emp manager
on worker.mgr = manager.empno
join dept
on worker.deptno = dept.deptno 
where worker.ename in 'SMITH';--join on

select worker.ename,dname,manager.ename
from emp worker left outer join emp manager
on worker.mgr = manager.empno
left outer join dept
on worker.deptno = dept.deptno 
where worker.ename in 'SMITH';--左外连接 left outer join

select worker.ename,dname,manager.ename
from emp worker right outer join emp manager
on worker.mgr = manager.empno
right outer join dept
on worker.deptno = dept.deptno 
where worker.ename in 'SMITH';--右外连接 right outer join 

--2.显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。

select ename,dname,sal,grade
from emp,dept,salgrade
where emp.deptno = dept.deptno 
and sal between losal 
and hisal and grade > 4;--通常写法

select ename,dname,sal,grade
from emp join dept
on emp.deptno = dept.deptno
join salgrade
on sal between losal and hisal
where grade > 4;--join on

select ename,dname,sal,grade
from emp left outer join dept
on emp.deptno = dept.deptno
left outer join salgrade
on sal between losal and hisal
where grade > 4;--左外连接 left outer join

select ename,dname,sal,grade
from emp right outer join dept
on emp.deptno = dept.deptno
right outer join salgrade
on sal between losal and hisal
where grade > 4;--右外连接 right outer join 

--3.显示员工KING和FORD管理的员工姓名及其经理姓名。

我特么实在不知道如何断句!!!!等我想明白再做!!!!

--4.显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。

select worker.ename as 员工姓名,worker.hiredate as 员工入职日期,
manager.ename as 经理姓名,manager.hiredate as 经理入职日期
from emp worker,emp manager 
where worker.mgr = manager.empno and 
worker.hiredate < manager.hiredate;

分割线


相关信息

以上就是我关于 Oracle初级测试题五--多表连接 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。

上次编辑于:
贡献者: 涎涎
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.4