Oracle多表查询课后练习题

1. 显示所有员工的姓名,部门号和部门名称。

a) select last_name,e.department_id,department_name

b) from employees e,departments d

c) where e.department_id = d.department_id(+)

总结:

clip_image001

在右边的条件后面加上一个(+)表示右链接查询,是一种联合查询方法

在这里:如果不加上这个符号,会少一个人,也就是有名字但是没有部门的人,如果加载左边,则会出现有部门没有名字的人.

显示效果:

clip_image003

方法二:

select last_name,e.department_id,department_name

from employees e left outer join departments d

on e.department_id = d.department_id

总结:

clip_image004

这种方法和前面的方法都能够达到查询效果,区别在于一个用了 left outer join … on 条件 这样的语法,在执行效率方面应该做了优化,效率更高.

还有一点值得注意,这种表达式没有where来做判断依据.

2. 查询90号部门员工的job_id和90号部门的location_id

a) select distinct job_id,location_id

b) from employees e left outer join departments d

c) on e.department_id = d.department_id

d) where d.department_id = 90

总结:

clip_image005

这个查询语句比上面一个多了一个where条件判断,也多了一个distinct

clip_image007

3. 选择所有有奖金的员工的

last_name , department_name , location_id , city

select last_name,department_name,d.location_id,city

from employees e join departments d

on e.department_id = d.department_id

join locations l

on d.location_id = l.location_id

where e.commission_pct is not null

总结:

clip_image008

可以发现:这个同时查询了三张表,直接用的join on的语法

clip_image010

4. 选择city在Toronto工作的员工的

last_name , job_id , department_id , department_name

select last_name , job_id , e.department_id , department_name

from employees e ,departments d,locations l

where e.department_id = d.department_id and l.city = ‘Toronto’ and d.location_id = l.location_id

总结:

clip_image012

当出现多张表有相同列名而又同时需要查询这个列名的时候,必须指定你要查询的列名是哪张表的列名.

这个案例也是多表查询,不过不难发现,并没有用到join on语法

利用where and and 实现了joinon的查询效果

clip_image014

5. 选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式

employees

Emp#

manager

Mgr#

kochhar

101

king

100

select e1.last_name “employees”,e1.employee_id “Emp#”,e2.last_name”Manger”,e2.employee_id “Mgr#”

from employees e1,employees e2

where e1.manager_id = e2.employee_id(+)

总结:

clip_image016

这个查询的是同一张表,但是却查询了两次,起了两个别名.

clip_image018

张 大鹏

北京理想国惠玩科技有限公司CEO

发表评论

电子邮件地址不会被公开。 必填项已用*标注