连接 (SQL)--维基百科
2016-03-27 20:19
351 查看
SQL 的连接(JOIN)语句将数据库中的两个或多个表组合起来.[1] 由”连接”生成的集合, 可以被保存为表, 或者当成表来使用. JOIN 语句的含义是把两张表的属性通过它们的值组合在一起. 基于 ANSI 标准的 SQL 列出了五种 JOIN 方式:
SQL 定义了两种不同语法方式去表示”连接”。首先是
内连接”可以进一步被分为: 相等连接,自然连接,和交叉连接(见下).
程序要应该特别注意连接依据的列可能包含 NULL 值,NULL 值不与任何值匹配(甚至和它本身) – 除非连接条件中显式地使用 IS NULL 或 IS NOT NULL 等谓词.
显式的内连接实例:
等价于:
如果 A 和 B 是两个集合,它们的交叉连接就记为: A × B.
用于交叉连接的 SQL 代码在 FROM 列出表名,但并不包含任何过滤的连接谓词.
显式的交叉连接实例:
隐式的交叉连接实例:
外连接查询得到的结果也可以通过关联子查询得到. 例如
也可以写成如下样子:
雇员
Name EmpId DeptName
Harry 3415 财务
Sally 2241 销售
George 3401 财务
Harriet 2202 生产
部门
DeptName Manager
销售 Harriet
生产 Charles
雇员⋉部门
Name EmpId DeptName
Sally 2241 销售
Harriet 2202 生产
更形式的说半连接的语义定义如下:
这里的fun(r)定义同于自然连接。
半连接可以被使用自然连接模拟如下。假定a1,…,an是R的属性名字,则:
因为我们可以通过基本运算模拟自然连接因此也就可以模拟半连接。
SQL> set linesize 999
SQL> select d.deptno,d.dname,d.loc
2 from scott.dept d
3 where d.deptno IN (select e.deptno from scott.emp e);
我们再以Figure 1.1.3.4.2中的Ra和Rb为例,Ra∝Rb可以表述为:
SELECT Ra.* FROM Ra INNER JOIN Rb ON Ra.Id = Rb.Id
内连接(INNER), 全外连接(FULL OUTER), 左外连接(LEFT OUTER), 右外连接(RIGHT OUTER)和交叉连接(CROSS). 在特定的情况下, 一张表(基本表, 视图, 或连接表)可以和自身进行连接, 成为自连接(self-join).
SQL 定义了两种不同语法方式去表示”连接”。首先是
"显式连接符号",它显式地使用关键字 JOIN,其次是
"隐式连接符号",它使用所谓的”隐式连接符号”。隐式连接符号把需要连接的表放到 SELECT 语句的 FROM 部分,并用逗号隔开。这样就构成了一个”交叉连接”,WHERE 语句可能放置一些过滤谓词(过滤条件)。那些过滤谓词在功能上等价于显式连接符号.
内连接”可以进一步被分为: 相等连接,自然连接,和交叉连接(见下).
程序要应该特别注意连接依据的列可能包含 NULL 值,NULL 值不与任何值匹配(甚至和它本身) – 除非连接条件中显式地使用 IS NULL 或 IS NOT NULL 等谓词.
显式的内连接实例:
SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID
等价于:
SELECT * FROM employee,department WHERE employee.DepartmentID = department.DepartmentID
交叉连接(cross join),
又称卡笛生连接(cartesian join)或叉乘(Product),它是所有类型的内连接的基础。把表视为行记录的集合,交叉连接即返回这两个集合的笛卡尔积。这其实等价于内连接的链接条件为”永真”,或连接条件不存在.如果 A 和 B 是两个集合,它们的交叉连接就记为: A × B.
用于交叉连接的 SQL 代码在 FROM 列出表名,但并不包含任何过滤的连接谓词.
显式的交叉连接实例:
SELECT * FROM employee CROSS JOIN department
隐式的交叉连接实例:
SELECT * FROM employee ,department;
外连接查询得到的结果也可以通过关联子查询得到. 例如
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID
也可以写成如下样子:
SELECT employee.LastName, employee.DepartmentID, (SELECT department.DepartmentName FROM department WHERE employee.DepartmentID = department.DepartmentID ) FROM employee
半连接 (⋉)(⋊)
半连接是类似于自然连接的写为R ⋉ S的连接,这里的R和S是关系。[2]半连接的结果只是在S中有在公共属性名字上相等的元组所有的R中的元组。例如下面的例子是“雇员”和“部门”和它们的半连接的表:雇员
Name EmpId DeptName
Harry 3415 财务
Sally 2241 销售
George 3401 财务
Harriet 2202 生产
部门
DeptName Manager
销售 Harriet
生产 Charles
雇员⋉部门
Name EmpId DeptName
Sally 2241 销售
Harriet 2202 生产
更形式的说半连接的语义定义如下:
R ⋉ S = { t : t 属于 R, s 属于 S, fun (t 并 s) }
这里的fun(r)定义同于自然连接。
半连接可以被使用自然连接模拟如下。假定a1,…,an是R的属性名字,则:
R ⋉ S = 派a1,..,an(R⋈S)
因为我们可以通过基本运算模拟自然连接因此也就可以模拟半连接。
半连接2:
当一张表在另一张表找到匹配的记录之后,半连接(semi-jion)返回第一张表中的记录。与条件连接相反,即使在右节点中找到几条匹配的记录,左节点的表也只会返回一条记录。另外,右节点的表一条记录也不会返回。半连接通常使用IN 或 EXISTS 作为连接条件。下面是一个例子:SQL> set linesize 999
SQL> select d.deptno,d.dname,d.loc
2 from scott.dept d
3 where d.deptno IN (select e.deptno from scott.emp e);
《数据库技术》1.2.1.4.4 半连接运算(Semi join)
两个关系R和S的半连接运算是在关系R和S的自然连接运算的基础之上再作一次投影运算,投影的属性是半连接运算左算子的属性。R∝S可以形式化地表示为:R∝S = πR(R∞S)。我们换个角度思考,两个关系得半连接运算实际上使用了两个关系的Common Keys对关系R做了一次选择运算,选择的条件就是R的Common Keys的键值全部等于S的Common Keys的键值。我们再以Figure 1.1.3.4.2中的Ra和Rb为例,Ra∝Rb可以表述为:
SELECT Ra.* FROM Ra INNER JOIN Rb ON Ra.Id = Rb.Id
相关文章推荐
- php+memcached配置
- MySQL学习(二)
- join中连接条件放置位置
- 用Mycat实现从Oracle迁移到Mysql
- sqlsession和sqlsessionFactory区别
- 转载:SqlServer数据库性能优化详解
- Option '--debug-info' used, but is disabled/mysqlslap --debuginfo被禁止
- Spark实战-Spark SQL(三)
- Spark实战-Spark SQL(二)
- 数据库的基本操作
- T-SQL, Part III: Check table's existance
- 数据库之左外连接、右外连接、全外连接
- 硬盘、数据库查找算法
- PostgreSQL字符串处理
- MySql_插入记录时,存在就更新(或不做任何动作),不存在就添加
- oracle 性能优化--索引总结
- PLSQL之循环和游标
- sql数据类型
- PLSQL之触发器
- c# 中使用memcached