数据库的Join操作

join clause是指在关系数据库中利用两张(或多张)表中相同的属性,讲两张(或多张)表的记录结合在一起的操作。
Join 操作主要分为三大类:

  • 交叉连接(Cross join);
  • 自然连接(Natural join);
  • 内连接(Inner join);
  • 外连接(Outer join):左连接Left outer join,右连接Right outer join,全连接Full outer join;
  • 自连接

示例

这里写图片描述

Department.DepartmentID is the primary key, while Employee.DepartmentID is a foreign key.

CREATE TABLE department
(
 DepartmentID INT,
 DepartmentName VARCHAR(20)
);

CREATE TABLE employee
(
 LastName VARCHAR(20),
 DepartmentID INT
);

INSERT INTO department VALUES(31, 'Sales');
INSERT INTO department VALUES(33, 'Engineering');
INSERT INTO department VALUES(34, 'Clerical');
INSERT INTO department VALUES(35, 'Marketing');

INSERT INTO employee VALUES('Rafferty', 31);
INSERT INTO employee VALUES('Jones', 33);
INSERT INTO employee VALUES('Heisenberg', 33);
INSERT INTO employee VALUES('Robinson', 34);
INSERT INTO employee VALUES('Smith', 34);
INSERT INTO employee VALUES('Williams', NULL);

交叉连接

SELECT *
FROM employee CROSS JOIN department;

SELECT *
FROM employee, department;

返回的是两张(或多张)表的笛卡尔积。那两张表举例,即第一张表的每一条记录都与第二张表的每一条记录连接。

交叉连接在实际中往往仅用来测试数据库的性能。

自然连接( ⋈)

自然连接是一个二元操作:R ⋈ S。通过对两张表的同名属性的值取等来完成连接,并且返回的结果中,同名属性只保留一列:

SELECT *
FROM employee NATURAL JOIN department;

这里写图片描述

如果自然连接时没有同名的属性,则会进行交叉连接。

内连接

SELECT *
FROM employee INNER JOIN department 
ON employee.DepartmentID = department.DepartmentID;

内连接可以看做是交叉连接加上where条件的操作:

SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;

这里写图片描述

左连接

SELECT *
FROM employee LEFT OUTER JOIN department 
ON employee.DepartmentID = department.DepartmentID;

这里写图片描述

Table(A) LEFT OUTER JOIN Table(B):首先,完全保留“左表” Table(A)中的所有记录;如果对于A中的一条记录,on语句的匹配记录为0条,则在返回结果中,B的每一个属性用null表示。这一特点反应在上面的示例中就是“Williams”那一行。

右连接

右连接的特性参照左连接,类似的,保全所有“右表”的记录,无法匹配的“左表”所在行全用null表示。反映在示例中就是“Marketing”那一行:

SELECT *
FROM employee RIGHT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;

这里写图片描述

全连接

参照“左连接”和“右连接”的定义,不难理解“全连接”即指保留两张表所有的记录,无法匹配的记录的相应部分用null表示:

SELECT *
FROM employee FULL OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;

这里写图片描述

自连接

所谓的自连接无非就是所有参与连接的表为同一张表而已。

总结

交叉连接就是笛卡尔积,是所有连接的基础操作;
自然连接不需要手写条件,但要求两张表有同名的属性才有意义,所以往往不够灵活;
内连接可以自己指定条件,所以很灵活和实用;
外链接在内连接的基础上增加了“保全”机制而已;

综上所述,不要被这一个个的专有名词给搞混了,其实本质上差不多,等到运用的时候根据需要自然知道使用那一种连接。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值