您的位置:首页 > 数据库

数据库的Join操作

2016-02-27 13:15 295 查看
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;




自连接

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

总结

交叉连接就是笛卡尔积,是所有连接的基础操作;

自然连接不需要手写条件,但要求两张表有同名的属性才有意义,所以往往不够灵活;

内连接可以自己指定条件,所以很灵活和实用;

外链接在内连接的基础上增加了“保全”机制而已;

综上所述,不要被这一个个的专有名词给搞混了,其实本质上差不多,等到运用的时候根据需要自然知道使用那一种连接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: