ORACLE SQL-select-多表查询

ORACLE SQL-select-多表查询


本文是在ORACLE 12c环境下hr用户进行的实验,如果有其他同学需要进行试验,请先解锁oracle12c 下的hr用户。

内连接:

等值连接模式

select e.last_name , d.department_name
from departments d,employees e
where d.department_id = e.department_id;  

注意:如果不写限定条件会产生笛卡尔积

修改后join: where 变成 join on 如下:

select e.last_name , d.department_name
from departments d join employees e
on d.department_id = e.department_id;

总结:用,连接两个表的时候关键字用where,join 关键字需要使用on关键字。
解论:
a,b的形式和a join b a inner join b的形式得出的结果都是一样的。
而且 a join b 就是a inner join b的缩略模式---->内连接模式

不等值连接模式

select e.last_name , d.department_name
from departments d inner join employees e
on d.department_id BETWEEN 100 and 260;

所以加上限定条件修改为如下形式:

select e.last_name , d.department_id
from departments d inner join employees e
on d.department_id BETWEEN 100 and 260
and d.department_id = e.department_id;

自然连接

select e.last_name,d.department_name
from departments d NATURAL JOIN employees e;

–1.自然连接子句要基于两个表中具有相同名称的所有列。
–2.他从两个表中选择在所有匹配列中具有相同值的行
–3.如果具有相同名称列句有不同的数据类型,那么结果也不成立

select  employee_id,last_name,
       location_id,department_id
from employees JOIN departments
USING (department_id);

–当表中出现多个相同的列 筛选其中某一个列的时候选择使用using

自连接(顾名思义自己连接自己)

select worker.last_name emp, manager.last_name mgr
from employees worker JOIN employees manager
on (worker.manager_id = manager.employee_id);

解释:条件出现在一个表中,我们使用一个语句搞不定的时候使用自然连接

外连接:

左外连接

SELECT e.last_name,e.department_id,d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);

右外连接

SELECT e.last_name,e.department_id,d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);

左连接和右连接的特点都是谁为驱动表就显示谁的所有数据

驱动表:
匹配表:

左连接L LETT JOIN R (L为驱动表R为匹配表 所以显示 L的全部数据)
右连接L RIGHT JOIN R (R为驱动表L为匹配表 所以显示 R的全部数据)

全连接

SELECT e.last_name,e.department_id,d.department_name
FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id);

L FULL OUTER JOIN R
L和R都为驱动表

你可能感兴趣的:(Oracle,数据库)