内链接和外链接的区别

两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的。用来连接两张表的表达式组成了连接条件。当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结果集--包括两张表中数据行的计划。简单地说,就是两张表有了子集,虽然只是暂时的 


有两者基本类型的的连接,inner和outer连接。两种类型的主要区别在于,即使是在连接条件不满足的情况下,外部连接也会在结果集内返回行,而内部连接不会在结果集类返回行 
当外部连接不满足连接条件时,通常返回一个表中的列,但是第二个表中没有返回值--为null


(一)内连接 
  内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的 
列值。内连接分三种: 
  1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结 
果中列出被连接表中的所有列,包括其中的重复列。 
  
  2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的 
列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。 


  3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选 
择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。


(二) 外连接   
  外连接,返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左
外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。
  left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录;
  right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录;
例如1:SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 
   ON a.username=b.username 
例如2:SELECT a.*,b.* 
   FROM city as a FULL OUTER JOIN user as b 
   ON a.username=b.username 
(三) 交叉连接    
  交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到 
结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查 
询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下 
列交叉连接检索到的记录数将等于6*8=48行。    
  例如:SELECT type,pub_name 
   FROM titles CROSS JOIN publishers 

   ORDER BY type


转自:http://leign.iteye.com/blog/512822

### SQL 中内连接与外连接的区别详解 #### 定义对比 内连接(`INNER JOIN`)返回的是两个表中满足连接条件的记录集合[^1]。这意味着只有当两表中的数据能够匹配上时,这些数据才会被包含在最终结果集中。 相比之下,外连接(`OUTER JOIN`)不仅会返回符合条件的数据行,还会保留那些无法找到对应匹配项的一侧或者两侧的所有原始数据行[^2]。它进一步细分为左外连接 (`LEFT JOIN`)、右外连接 (`RIGHT JOIN`) 全外连接 (`FULL OUTER JOIN`)。 #### 数据范围差异 对于 **内连接** 而言,如果某一条记录在任一参与联接的表格里找不到相配对的信息,则该条目不会出现在最后输出的结果集当中[^3]。 而针对 **外连接** 的情况来说: - 左外连接 (`LEFT JOIN`) 将始终显示左侧表内的全部资料,即使右侧没有对应的项目也会如此处理; - 右外连接 (`RIGHT JOIN`) 则正好相反,优先保障右边的内容完整性; - 至于全外连接 (`FULL OUTER JOIN`) 是指无论哪一边都尽可能多地展示所有可用信息——只要存在至少一侧有相应关联即可呈现出来[^4]。 #### 实际应用举例说明 假设我们有两个简单的关系型数据库表 `Employees` (员工) `Departments`(部门),其中前者包含了每位雇员的名字以及他们所属的具体科室编号;后者则列出了各个分组及其描述性的名称。 ##### 使用 INNER JOIN 获取共同部分 ```sql SELECT Employees.Name AS EmployeeName, Departments.DepartmentName FROM Employees INNER JOIN Departments ON Employees.DepartmentID = Departments.ID; ``` 此查询仅提取那些既存在于 `Employees` 表又能在 `Departments` 找到其参照对象的人员名单与其所在单位称号[^5]。 ##### 应用 LEFT JOIN 查看未分配者 ```sql SELECT Employees.Name AS EmployeeName, Departments.DepartmentName FROM Employees LEFT JOIN Departments ON Employees.DepartmentID = Departments.ID; ``` 这段脚本除了给出已知归属关系之外,还将揭示哪些职员尚未指定任何特定的工作小组,即他们的 DepartmentName 值可能为空(NULL)。 同样可以构建 RIGHT JOIN 或 FULL OUTER JOIN 来探索其他角度下的完整视图。 --- ### 总结 综上所述,在实际操作过程中选择合适的连接方式取决于具体的业务需求:如果你只关心双方都有交集的部分就选用 inner join;要是希望得到更广泛覆盖度的数据展现形式的话,则应该考虑 outer joins 类型之一^.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值