内连接(inner)

来源:互联网 发布:淘宝最恶心sb的男模特 编辑:程序博客网 时间:2024/06/14 04:49

wiki百科:https://zh.wikipedia.org/wiki/连接_(SQL)#.E5.86.85.E8.BF.9E.E6.8E.A5

示例用表

下文中解释"连接"都将用到这里的两张表. 表中的记录(行)用于演示不同类型的"连接"和"连接谓词"的作用.在下面两张表中, Department.DepartmentID 是主键, Employee.DepartmentID 是外键.

雇员表(Employee)LastNameDepartmentIDRafferty31Jones33Steinberg33Robinson34Smith34JasperNULL部门表(Department)DepartmentIDDepartmentName31销售部33工程部34秘书35市场部


注:"市场部" 目前没有员工列出. 同样, 雇员 "Jasper" 不在 部门表中的任何一个部门.

内连接(innerjoin)是应用程序中用的普遍的"连接"操作,它一般都是默认连接类型。内连接基于连接谓词将两张表(如A 和 B)的列组合在一起,产生新的结果表。查询会将 A 表的每一行和 B表的每一行进行比较,并找出满足连接谓词的组合。当连接谓词被满足,A 和 B中匹配的行会按列组合(并排组合)成结果集中的一行。连接产生的结果集,可以定义为首先对两张表做笛卡尔积(交叉连接) -- 将 A中的每一行和 B 中的每一行组合,然后返回满足连接谓词的记录。实际上 SQL产品会尽可能用其他方式去实现连接,笛卡尔积运算是非常没效率的.

SQL定义了两种不同语法方式去表示"连接"。首先是"显式连接符号",它显式地使用关键字 JOIN,其次是"隐式连接符号",它使用所谓的"隐式连接符号"。隐式连接符号把需要连接的表放到 SELECT 语句的 FROM 部分,并用逗号隔开。这样就构成了一个"交叉连接",WHERE 语句可能放置一些过滤谓词(过滤条件)。那些过滤谓词在功能上等价于显式连接符号.

内连接"可以进一步被分为: 相等连接,自然连接,和交叉连接(见下).

程序要应该特别注意连接依据的列可能包含NULL 值,NULL 值不与任何值匹配(甚至和它本身) --除非连接条件中显式地使用 ISNULL 或 ISNOT NULL 等谓词.

例如,下面的查询通过 Employee 表和 Department 表共有的属性 DepartmentID 连接两表。在两表DepartmentID匹配之处(如连接谓词被满足),查询将组合两表的 LastNameDepartmentID DepartmentName 等列,把它们放到结果表的一行(一条记录)里。当DepartmentID 不匹配,就不会往结果表中生成任何数据.

显式的内连接实例:

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

等价于:

SELECT *  FROM   employeedepartment WHERE  employee.DepartmentID = department.DepartmentID

显式的内连接的输出结果:

Employee.LastNameEmployee.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentIDRobinson34秘书34Jones33工程部33Smith34秘书34Steinberg33工程部33Rafferty31销售部31

 雇员 "Jasper" 和部门 "市场部"都未出现。它们在预期得到的表中没有任何匹配的记录: "Jasper"没有关联的部门,而号码为35的部门中没有任何雇员。这样,在"连接"后的表中,就没有关于 Jasper 或 市场部的信息了。相对于预期的结果,这个行为可能是一个微妙的Bug。外连接可能可以避免这种情况.

相等链接

相等连接(equi-join,或 equijoin),是比较连接(θ连接)的一种特例,它的连接谓词只用了相等比较。使用其他比较操作符(如 <</code>)的不是相等连接。前面的查询已经展示了一个相等连接的实例:

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

等价于 隐式的:
SELECT *  FROM   employeedepartment WHERE  employee.DepartmentID = department.DepartmentID
SELECT *FROM   employee        INNER JOIN department           USING (DepartmentID)

自然连接

自然连接比相等连接的进一步特例化。两表做自然连接时,两表中的所有名称相同的列都将被比较,这是隐式的。自然连接得到的结果表中,两表中名称相同的列只出现一次.

SELECT *FROM   employee NATURAL JOIN department

用了 USING 语句后,在连接表中,DepartmentID列只出现一次,且没有表名作前缀:

DepartmentIDEmployee.LastNameDepartment.DepartmentName34Smith秘书33Jones工程部34Robinson秘书33Steinberg工程部31Rafferty销售部

交叉连接

交叉连接(crossjoin),又称笛卡尔连接(cartesianjoin)或叉乘(Product),它是所有类型的内连接的基础。把表视为行记录的集合,交叉连接即返回这两个集合的笛卡尔积。这其实等价于内连接的链接条件为"永真",或连接条件不存在.

SELECT *FROM   employee CROSS JOIN department

隐式的交叉连接实例:

SELECT *FROM   employee ,department;
Employee.LastNameEmployee.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentIDRafferty31Sales31Jones33Sales31Steinberg33Sales31Smith34Sales31Robinson34Sales31JasperNULLSales31Rafferty31Engineering33Jones33Engineering33Steinberg33Engineering33Smith34Engineering33Robinson34Engineering33JasperNULLEngineering33Rafferty31Clerical34Jones33Clerical34Steinberg33Clerical34Smith34Clerical34Robinson34Clerical34JasperNULLClerical34Rafferty31Marketing35Jones33Marketing35Steinberg33Marketing35Smith34Marketing35Robinson34Marketing35JasperNULLMarketing35

交叉连接不会应用任何谓词去过滤结果表中的记录。程序员可以用 WHERE 语句进一步过滤结果集.

0 0
原创粉丝点击