您的位置:首页 > 数据库

连接 (SQL)--维基百科

2016-03-27 20:19 351 查看
SQL 的连接(JOIN)语句将数据库中的两个或多个表组合起来.[1] 由”连接”生成的集合, 可以被保存为表, 或者当成表来使用. JOIN 语句的含义是把两张表的属性通过它们的值组合在一起. 基于 ANSI 标准的 SQL 列出了五种 JOIN 方式:

内连接(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: