`

表连接详解

阅读更多
转载(http://www.cnblogs.com/mac_arthur/archive/2010/01/17/1650005.html)

两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
多表连接原理
学习数据库查询的时候对多表连接查询的有些概念还比较模糊。而连接查询是在数据库查询操作的时候肯定要用到的。对于此概念
我用通俗一些的语言和例子来进行讲解。这个例子是我讲课的时候经常采用的例子。
首先我们做两张表:员工信息表和部门信息表,在此,表的建立只为讲述连接的概念,所以字段非常的简单
EmployeeTB(员工信息表):

employeeid employeename deptid
0001  张三  01
0002  李四  01
0003  王五  02
0004  赵六  02
0005  郑七  NULL

DeptTB(部门信息表)
deptid  deptname
01  技术部
02  市场部
03  工程部

我们现在需要进行连接查询,连接两张表检索数据。分别检索员工信息表的员工编号、员工姓名和部门信息表中的部门名称。
显然,两个表的连接条件是 员工表的部门编号=部门表的部门编号
注意:郑七不属于任何部门(新来的员工,还没有分配到任何的部门),而工程部不存在任何的员工(比如是一个新成立的部门,还没有员工)
1、内连接查询
我们可以有两种方式,这两种是等效的 :
Java代码
一种是:SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e,DeptTB AS d WHERE e.deptid=d.deptid  
另外一个是:SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e INNER JOIN DeptTB AS d ON e.deptid=d.deptid  

检索的结果都是:
employeeid employeename deptname
0001  张三  技术部
0002  李四  技术部
0003  王五  市场部
0004  赵六  市场部


而“郑七”和“工程部”的信息是不会检索出来。因为采用内连接计算的时候必须要保证连接的条件e.deptid=d.deptid匹配,结果才会 被检索出来。当我们连接两张检索数据的时候,检索的方式是首先逐行扫描“员工信息表”中的记录,然后根据连接条件来决定此记录是否被检索。比如对于张三, 这条记录的deptid是01(部门编号),它在部门表中能找到和它匹配的编号01,而编号01的部门名称(deptname)是“技术部”所以张三这条 记录会被检索,最终的结果肯定是:

0001  张三  技术部

同样,李四、王五、赵六也能。但是郑七的部门编号是NULL,它在部门信息表中找不到匹配的项(因为部门信息表中不存在部门编号为NULL的部门),所以郑七不会被检索。
同理,没有任何人员的部门编号为03,所以工程部的记录也不会被检索

2、左外联结
但是有些情况下,我们需要知道所有员工的信息,即使他不属于任何部门。这样我们就可以采用外连接,在这里为左外连接,也就是连接中的左表的表中的 记录,无论能不能在右表中找到匹配的项,都要检索,如果没有匹配的项目,那么右表中的字段值为NULL(空),在这里就代表,此员工不属于任何部门。
检索语句为:
Java代码
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON e.deptid=d.deptid  
检索的结果都是:

employeeid employeename deptname
0001  张三  技术部
0002  李四  技术部
0003  王五  市场部
0004  赵六  市场部
0005  郑七  NULL

但是在这里,工程部同样不会被检索,因为,deptname是在连接的右边的表中,“工程部”在左表中不存在任何的记录,所以不会被检索。这里关注的是“连接中的左边的表”


3、右外连接
有时,我们需要知道,全部部门的信息,即使它没有任何的员工。在我们的查询中部门表在连接的右边,如果我们想知道右边表中的所有记录信息,那么就 可以采用右外连接,如果此记录在左边的表中找不到匹配项,则相应字段(employeeid,employeename)为NULL
检索语句为:
Java代码
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON e.deptid=d.deptid  
检索的结果都是:

employeeid employeename deptname
0001  张三  技术部
0002  李四  技术部
0003  王五  市场部
0004  赵六  市场部
NULL  NULL  工程部

但在这里,郑七是不会被检索了,因为它在右表中找不到匹配项,这里关注的是“连接中的右边的表”

4、完全外连接
如果我们想知道所有的记录呢?无论员工有没有部门,部门有没有员工,我们都需要检索。这里就可以使用完全外连接。关注连接中的两部分。如果没有部门,部门为空,没有员工,员工信息为空。
检索语句为:
Java代码
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e FULL OUTER JOIN DeptTB AS d ON e.deptid=d.deptid  

检索的结果都是:
Java代码
employeeid employeename deptname  

0001  张三  技术部
0002  李四  技术部
0003  王五  市场部
0004  赵六  市场部
0005  郑七  NULL
NULL  NULL  工程部



http://hahalzb.blogbus.com/logs/18812385.html
(一)内连接
  内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的
列值。内连接分三种:
  1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结
果中列出被连接表中的所有列,包括其中的重复列。
  例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
  SELECT *
  FROM authors AS a INNER JOIN publishers AS p
  ON a.city=p.city
  2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的
列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
  3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选
择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
  例,在选择列表中删除authors 和publishers 表中重复列(city和state):
  SELECT a.*,p.pub_id,p.pub_name,p.country
  FROM authors AS a INNER JOIN publishers AS p
  ON a.city=p.city
(二) 外连接  
  外连接,返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左
外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。
  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
分享到:
评论

相关推荐

    Oracle表连接的具体讲解

    "Oracle表连接详解" 在 Oracle 中,表连接是指将两个或多个表中的数据结合起来,以满足查询的需求。表连接可以分为三种:内连接、外连接和自连接。 一、 内连接(Inner Join) 内连接是一种最基本的表连接方式,...

    数据库表连接(内外、左右连接).docx

    【数据库表连接详解】 在关系型数据库管理中,表连接是一种重要的查询操作,它允许从多个相关表中检索数据。连接使得数据间的关联性得以展现,增强了数据查询的灵活性。通常,一个实体的信息可能分散在多个表中,...

    数据库多表连接查询详解

    数据库多表连接查询详解 连接查询是关系数据库管理系统中的一种重要查询方式,它允许用户从多个表中检索数据,并将它们组合成一个结果集。连接查询的基本思想是通过连接运算符在多个表之间建立关系,从而实现数据的...

    Oracle SQL表连接技术详解及其应用场景

    内容概要:本文详细介绍了Oracle SQL中的表连接技术,包括常见的连接类型如排序--合并连接(SMJ)、嵌套循环(NL)和哈希连接(HJ)。文中解释了每种连接的工作原理、适用场景以及优缺点,通过具体示例展示了这些...

    JAVA 数据库 连接 方法详解

    在Java编程中,连接数据库是常见的任务,涉及多种数据库如Microsoft SQL Server、Sybase、Oracle以及MySQL等。这里我们将详细讲解如何使用Java进行数据库连接,包括JDBC(Java Database Connectivity)驱动的使用、...

    连接跟踪conntrack详解

    非常详细的连接跟踪过程讲解 非常详细的连接跟踪过程讲解

    oracle连接详解

    oracle连接详解,oracle连接详解oracle连接详解oracle连接详解

    Java数据库连接池详解(一)

    Java数据库连接池详解(一)

    J2me存储和连接详解

    ### J2me存储和连接详解 #### J2me RMS存储详解 J2ME(Java 2 Micro Edition)作为Java平台的一个分支,专为资源受限的设备(如早期的移动电话和PDA)设计,提供了MIDP(Mobile Information Device Profile)等...

    在SAP前台用TCODE:SE16H实现表连接查询

    "SAP SE16H 表连接查询详解" 在 SAP 系统中,SE16H 是一个功能强大的工具,能够实现复杂的表连接查询。今天,我们将详细介绍如何使用 SE16H 实现表连接查询,并提供一个实际的示例。 SE16H 介绍 SE16H 是 SAP ...

    kettle数据库资源表结构详解

    kettle是一个优秀的ETL,它的数据库结构是什么样的呢?本文档以Oracle数据库连接为例,讲解每一个表的各个列名的含义,帮助你缕清kettle的架构模式,方便你的二次开发和自主研发ETL。

    oracle14514

    ### Oracle表连接详解 #### 一、引言 在Oracle数据库中,表连接是一种非常重要的技术,用于从多个表中提取所需数据。本文将详细解释四种主要的表连接类型:相等连接、外连接、不等连接和自连接,并通过具体的示例...

    几种常用的表连接方式

    ### 几种常用的表连接方式详解 在数据库领域,表连接是数据检索和管理的核心技术之一,用于将多个数据表中的信息结合在一起,形成更完整、更有意义的数据集。本文将深入探讨四种常用的表连接方式:嵌套循环连接、...

    电脑连接电视方法详解 (图文并茂).

    参考资源“电脑电视连接线使用详解.hlp”提供了更详细的步骤和技巧,而“绿色软件站.txt”和“绿色软件站.url”可能包含推荐的软件工具或链接,帮助优化连接效果或解决过程中遇到的问题。在实际操作中,根据自己的...

    oracle多表连接技巧

    ### Oracle多表连接技巧详解 #### 一、引言 在Oracle数据库中,多表连接是一种非常实用且常用的技术,它允许用户从多个表中获取数据,并基于特定条件进行匹配和整合。本文将详细介绍Oracle中多表连接的各种类型及其...

    C3P0连接池配置详解C3P0连接池配置详解

    ### C3P0连接池配置详解 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定、支持JDBC标准的DataSource接口等。C3P0可以有效地管理和重用数据库连接,减少数据库连接创建和销毁带来的性能损耗。本文将详细介绍...

    外连接,内连接 图文详解

    全外连接结合了左外连接和右外连接的结果,返回左右两个表中的所有行,包括那些在另一个表中没有匹配项的行。如果某一边没有匹配,另一边的字段值将被设置为NULL。 3. **交叉连接(CROSS JOIN)**: 交叉连接,又...

Global site tag (gtag.js) - Google Analytics