数据库的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;
自连接
![](http://img.blog.csdn.net/20160227121325668)
Department.DepartmentID is the primary key, while Employee.DepartmentID is a foreign key.
或
返回的是两张(或多张)表的笛卡尔积。那两张表举例,即第一张表的每一条记录都与第二张表的每一条记录连接。
交叉连接在实际中往往仅用来测试数据库的性能。
![](http://img.blog.csdn.net/20160227124130394)
如果自然连接时没有同名的属性,则会进行交叉连接。
内连接可以看做是交叉连接加上where条件的操作:
![](http://img.blog.csdn.net/20160227123844038)
![](http://img.blog.csdn.net/20160227124506618)
Table(A) LEFT OUTER JOIN Table(B):首先,完全保留“左表” Table(A)中的所有记录;如果对于A中的一条记录,on语句的匹配记录为0条,则在返回结果中,B的每一个属性用null表示。这一特点反应在上面的示例中就是“Williams”那一行。
![](http://img.blog.csdn.net/20160227124624759)
![](http://img.blog.csdn.net/20160227124711933)
自然连接不需要手写条件,但要求两张表有同名的属性才有意义,所以往往不够灵活;
内连接可以自己指定条件,所以很灵活和实用;
外链接在内连接的基础上增加了“保全”机制而已;
综上所述,不要被这一个个的专有名词给搞混了,其实本质上差不多,等到运用的时候根据需要自然知道使用那一种连接。
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;
自连接
所谓的自连接无非就是所有参与连接的表为同一张表而已。总结
交叉连接就是笛卡尔积,是所有连接的基础操作;自然连接不需要手写条件,但要求两张表有同名的属性才有意义,所以往往不够灵活;
内连接可以自己指定条件,所以很灵活和实用;
外链接在内连接的基础上增加了“保全”机制而已;
综上所述,不要被这一个个的专有名词给搞混了,其实本质上差不多,等到运用的时候根据需要自然知道使用那一种连接。
相关文章推荐
- Redis同步配置
- windows redis 学习指南
- Redis安装
- oracle访问数据
- redis体系结构
- mysql多版本并发控制
- mysql中间件研究(Atlas,cobar,TDDL)
- mysql变量使用总结
- sql查询重复记录
- 编译安装mysql ERROR: 1 Can't create/write to file '/tmp/#sql_86b_0.MYI'
- 在sql中用dataadd添加时间
- 【小镇的技术天梯】MySQL 查询缓存
- PL/SQL之变量的作用范围
- Mysql一主多从和读写分离配置简记
- 数据库-主键和外键及其约束
- 数据库的索引原理
- Oracle 查询结果列转行
- MySQL追加注释或者大量修改注释
- MySQL知识(十五)——存储过程的调用、查看、修改和删除
- Php-Redis 邮件队列实现总结