本文是在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都为驱动表