- 浏览: 978492 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
Mr.Cheney:
去掉 UUID字符串中的“-” 直接replaceAll(&q ...
JAVA生成全局唯一ID 使用 java.util.UUID -
呜哩喵:
楼主nice
java中的时间操作 -
zxs6587:
Thinking inJava我读着好像说要建立基类对象啊!请 ...
创建子类的对象时也要创建其所有父类的对象? -
just_Word:
getFullYear
date.getyear -
JamesQian:
我觉得楼上的synchronized(this),notify ...
notify() wait()
转载(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
两表连接查询:对两表求积(笛卡尔积)并用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
发表评论
-
having子句的用法
2010-12-02 14:28 1666转载(http://dev.csdn.net/htmls/81 ... -
视图与表的区别与联系
2010-10-30 20:30 2685区别: 1、视图是已经编译好的sql语句,是基于 SQL 语句 ... -
sql语句中出现关键字
2010-01-04 14:54 1737在sql server中关键字用 中括号 "[]&q ... -
查询数据库中不同字段的命令
2009-12-31 20:37 1213select count(distinct item) fro ... -
source 命令使用时出现的问题
2009-12-09 13:19 1068使用source命令时经常出错 出错原因 1 没有指定当前使用 ... -
MySQL 消除出错时的声音
2009-12-09 13:11 974MySQL -u root -b -p -
mysql导入导出命令
2009-10-14 13:51 2344mysqldump命令的输入是在bin目录下. 1.导出整个数 ... -
关于MySQL的AUTO_INCREMENT(自动递增)的设置
2009-10-13 23:27 3777CREATE TABLE test ( id INT UNSI ... -
jdbc概述和常用接口和类
2009-09-25 20:15 84491 JDBC概述 JDBC(Java DataB ... -
mysql中文乱码的问题
2009-09-24 21:19 1107在使用数据库的时候遇到了中文乱码的问题 在网上搜索之后发现方法 ... -
mysql重启
2009-09-24 17:06 2110参考自:http://www.yaiba.net/blog/r ... -
mysql 常用操作
2009-09-19 19:47 1540MySQL使用CREATE TABLE语句创建表,简单语法如下 ... -
MySQL数据库中的Show命令具体用法
2009-09-19 19:44 1504SQL中有很多的基本命令,show命令也是其中之一,在很多使用 ... -
在MySQL数据库中应当如何关闭错误提示音
2009-09-13 14:53 1180使用MySQL的命令终端时,如果输入SQL有误,将有beep ... -
java连接mysql实例
2009-09-13 14:42 8029/** * @(#)JDBCTest.java * * ... -
第一,第二,第三范式
2009-09-13 11:44 4703在创建一个数据库 ... -
查询记录条数
2009-09-01 13:56 1034select count(*) from dt ... -
MySQL模糊查询
2009-09-01 13:41 4072SELECT * FROM oneself WHERE nam ... -
mysql 导入sql文件
2009-09-01 13:34 1406C:\mysql\bin>mysql -u 用户名 ... -
mysql数据库支持中文
2009-04-21 21:46 1173打开终端:application - appendix - t ...
相关推荐
"Oracle表连接详解" 在 Oracle 中,表连接是指将两个或多个表中的数据结合起来,以满足查询的需求。表连接可以分为三种:内连接、外连接和自连接。 一、 内连接(Inner Join) 内连接是一种最基本的表连接方式,...
【数据库表连接详解】 在关系型数据库管理中,表连接是一种重要的查询操作,它允许从多个相关表中检索数据。连接使得数据间的关联性得以展现,增强了数据查询的灵活性。通常,一个实体的信息可能分散在多个表中,...
数据库多表连接查询详解 连接查询是关系数据库管理系统中的一种重要查询方式,它允许用户从多个表中检索数据,并将它们组合成一个结果集。连接查询的基本思想是通过连接运算符在多个表之间建立关系,从而实现数据的...
内容概要:本文详细介绍了Oracle SQL中的表连接技术,包括常见的连接类型如排序--合并连接(SMJ)、嵌套循环(NL)和哈希连接(HJ)。文中解释了每种连接的工作原理、适用场景以及优缺点,通过具体示例展示了这些...
在Java编程中,连接数据库是常见的任务,涉及多种数据库如Microsoft SQL Server、Sybase、Oracle以及MySQL等。这里我们将详细讲解如何使用Java进行数据库连接,包括JDBC(Java Database Connectivity)驱动的使用、...
非常详细的连接跟踪过程讲解 非常详细的连接跟踪过程讲解
oracle连接详解,oracle连接详解oracle连接详解oracle连接详解
Java数据库连接池详解(一)
### J2me存储和连接详解 #### J2me RMS存储详解 J2ME(Java 2 Micro Edition)作为Java平台的一个分支,专为资源受限的设备(如早期的移动电话和PDA)设计,提供了MIDP(Mobile Information Device Profile)等...
"SAP SE16H 表连接查询详解" 在 SAP 系统中,SE16H 是一个功能强大的工具,能够实现复杂的表连接查询。今天,我们将详细介绍如何使用 SE16H 实现表连接查询,并提供一个实际的示例。 SE16H 介绍 SE16H 是 SAP ...
kettle是一个优秀的ETL,它的数据库结构是什么样的呢?本文档以Oracle数据库连接为例,讲解每一个表的各个列名的含义,帮助你缕清kettle的架构模式,方便你的二次开发和自主研发ETL。
### Oracle表连接详解 #### 一、引言 在Oracle数据库中,表连接是一种非常重要的技术,用于从多个表中提取所需数据。本文将详细解释四种主要的表连接类型:相等连接、外连接、不等连接和自连接,并通过具体的示例...
### 几种常用的表连接方式详解 在数据库领域,表连接是数据检索和管理的核心技术之一,用于将多个数据表中的信息结合在一起,形成更完整、更有意义的数据集。本文将深入探讨四种常用的表连接方式:嵌套循环连接、...
参考资源“电脑电视连接线使用详解.hlp”提供了更详细的步骤和技巧,而“绿色软件站.txt”和“绿色软件站.url”可能包含推荐的软件工具或链接,帮助优化连接效果或解决过程中遇到的问题。在实际操作中,根据自己的...
### Oracle多表连接技巧详解 #### 一、引言 在Oracle数据库中,多表连接是一种非常实用且常用的技术,它允许用户从多个表中获取数据,并基于特定条件进行匹配和整合。本文将详细介绍Oracle中多表连接的各种类型及其...
### C3P0连接池配置详解 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定、支持JDBC标准的DataSource接口等。C3P0可以有效地管理和重用数据库连接,减少数据库连接创建和销毁带来的性能损耗。本文将详细介绍...
全外连接结合了左外连接和右外连接的结果,返回左右两个表中的所有行,包括那些在另一个表中没有匹配项的行。如果某一边没有匹配,另一边的字段值将被设置为NULL。 3. **交叉连接(CROSS JOIN)**: 交叉连接,又...