【数据库】数据库表连接Join

数据库表连接Join

一条sql join语句对应着关系代数里的一个join操作,它对关系数据库里一个或多个表的列进行合并。
ANSI标准的SQL规定了5种类型的Join:INNER,LEFT OUTER,RIGHT OUTER, FULL OUTER和CROSS。
除此之外一个表能够对自身进行连接,即self-join。

以下两表是后面章节描述所基于的表格

职员表

名字部门id
Rafferty31
Jones33
Heisenberg33
Robinson34
Smith34
WilliamsNULL

部门表

部门id部门名
31Sales
33Engineering
34Clerical
35Marketing

Cross join交叉连接

Cross join交叉连接返回连接中表格各行的笛卡尔积,即[row1_1,row1_2]x[row2_1,row2_2]=>[(row1_1,row_2_1),(row1_1,row_2_2),(row1_2,row_2_1),(row1_2,row_2_2)]

显式语句

SELECT *
FROM employee CROSS JOIN department;

隐式语句

SELECT *
FROM employee, department;
职员表.职员名职员表.部门id部门表.部门名部门表.部门id
Rafferty31Sales31
Jones33Sales31
Heisenberg33Sales31
Smith34Sales31
Robinson34Sales31
WilliamsNULLSales31
Rafferty31Engineering33
Jones33Engineering33
Heisenberg33Engineering33
Smith34Engineering33
Robinson34Engineering33
WilliamsNULLEngineering33
Rafferty31Clerical34
Jones33Clerical34
Heisenberg33Clerical34
Smith34Clerical34
Robinson34Clerical34
WilliamsNULLClerical34
Rafferty31Marketing35
Jones33Marketing35
Heisenberg33Marketing35
Smith34Marketing35
Robinson34Marketing35
WilliamsNULLMarketing35

交叉联接本身并不应用任何谓词来筛选联接表中的行。交叉连接的结果可以通过使用WHERE子句进行过滤,该子句随后可能生成等效的内部连接。

Inner Join内连接

内连接返回两个链接表中同时含有相符列值的行的组合。

内连接示例

显式语句

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName 
FROM employee 
INNER JOIN department ON
employee.DepartmentID = department.DepartmentID
职员表.职员名职员表.部门id部门表.部门id
Robinson34Clerical
Jones33Engineering
Smith34Clerical
Heisenberg33Engineering
Rafferty31Sales

隐式语句

内连接的隐式表示方式:在SELECT语句的FROM子句中列出用于连接的表,并使用逗号分隔它们。如此,这种语句指定了交叉连接,WHERE子句可以应用额外的筛选器谓词

SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;

左外连接Left outer join

左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

左外连接示例

SELECT *
FROM employee 
LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
职员表.职员名职员表.部门id部门表.部门名部门表.部门id
Jones33Engineering33
Rafferty31Sales31
Robinson34Clerical34
Smith34Clerical34
WilliamsNULLNULLNULL
Heisenberg33Engineering33

右外连接Right outer join

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

右外连接示例

SELECT *
FROM employee RIGHT OUTER JOIN department
  ON employee.DepartmentID = department.DepartmentID;
职员表.职员名职员表.部门id部门表.部门名部门表.部门id
Smith34Clerical34
Jones33Engineering33
Robinson34Clerical34
Heisenberg33Engineering33
Rafferty31Sales31
NULLNULLMarketing35

全(外)连接Full outer join

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

全连接示例

# OUTER 关键字可选
SELECT *
FROM employee FULL OUTER JOIN department
  ON employee.DepartmentID = department.DepartmentID;
职员表.职员名职员表.部门id部门表.部门名部门表.部门id
Smith34Clerical34
Jones33Engineering33
Robinson34Clerical34
WilliamsNULLNULLNULL
Heisenberg33Engineering33
Rafferty31Sales31
NULLNULLMarketing35

自连接Self-join

使用自身表格进行连接

SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country
FROM Employee F INNER JOIN Employee S ON F.Country = S.Country
WHERE F.EmployeeID < S.EmployeeID
ORDER BY F.EmployeeID, S.EmployeeID;

参考

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值