作者:黄钟瑶
完成时间:2019年4月14日
开发工具与技术:Oracle
多表连接:从多个表中通过连接的条件来获取数据
首先,多表连接在没有连接的条件下,会产生一个错误--笛卡尔集,就是表中的所有行数据相乘,如果表中的数据多时,那么产生的笛卡尔集也是庞大的。
正确的写法,要加个where连接条件。这也是一个等值连接,在employees表中有departments表的外键ID,通过这个ID作为这两个表的相同列,建立连接条件。由于这两个表有相同的列,所以要在列前加上表名,方便于数据库区分。
右外连接:返回连接相同的条件也可以返回左表或者右表的不满足条件的行数据,要用连接符(+)连接。连接左表的称为左连接,连接右表的称为右连接。
右连接,通过department_id作为连接条件,employees表作为子表连接departments父表返回父表的数据,where指定连接条件
select employees.employee_id,departments.department_id
from employees,departments
where employees.department_id(+)=departments.department_id;
除了上面的传统写法,还有SQL1999语法,关键词:left,right join.....
以左外连接为例,返回employees表的数据。
select employees.employee_id,departments.department_id
from employees left join departments
on employees.department_id=departments.department_id;
满外连接:除了返回满足连接条件的行还返回不满足条件的行,通俗点就是都返回行
SELECT employees.last_name, employees.department_id, departments.department_name
FROM employees
FULL OUTER JOIN departments
ON (employees.department_id = departments.department_id) ;
自连接:即自己连接自己,将自身表当作另一个表来连接,查询一些特殊的数据。
select a.last_name ||b.last_name
from employees a,employees b
where a.manager_id=b.employee_id;
自然连接:返回等值相同的数据,列名相同且数据类型相同,关键词:natural join
SELECT employee_id,last_name
FROM employees
NATURAL JOIN departments ;
使用USing子句创建连接:在自然连接时,可以自动匹配表中相同的列,使用
using子句来指定需要返回的列,指定列不需要添加前缀和别名
select employees.employee_id,employees.first_name,department_id
from employees join departments
using( department_id);
On子句:除连接具有相同条件的列还可以指定额外的连接条件,也能够创建多表连接
select employees.employee_id,employees.job_id,departments.department_id
from employees left join departments
on employees.department_id=departments.department_id
总结:如果逻辑处理的好,可以连接更多的表的。个人觉得不管哪种连接,都必须要满足连接的条件,从而再得到需要的数据,在连接过程中也要避免笛卡尔集的发生。