`
灵动的水
  • 浏览: 195498 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

mysql表连接总结

阅读更多
1. 内连接(自然连接)
2. 外连接
(1)左外连接 (左边的表不加限制)
(2)右外连接(右边的表不加限制)
(3)全外连接(左右两表都不加限制)
3. 自连接(同一张表内的连接)
SQL的标准语法:
select table1.column,table2.column from table1 [inner | left | right | full ] join table2 ontable1.column1 = table2.column2;
inner join 表示内连接;
left join表示左外连接;
right join表示右外连接;
full join表示完全外连接;
on子句用于指定连接条件。
注意:
如果使用from子句指定内、外连接,则必须要使用on子句指定连接条件;
如果使用(+)操作符指定外连接,则必须使用where子句指定连接条件。
内连接(InnerJoin/Join)
1.1 Inner Join
Inner join逻辑运算符返回满足第一个(顶端)输入与第二个(底端)输入联接的每一行。这个和用select查询多表是一样的效果,所以内连接用的很少。
还有一点要说明的就是Join 默认就是inner join。所以我们在写内连接的时候可以省略inner 这个关键字。
1.2 下面举例来说明内连接:
1.2.1 先创建2张测试表并插入数据:
SQL> select * from dave;
ID NAME
---------- ----------
1 dave
2 bl
1 bl
2 dave
SQL> select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
1.2.3 用内链接进行查询:
SQL> Select a.id,a.name,b.name from davea inner join bl b on a.id=b.id; -- 标准写法
ID NAME NAME
---------- ---------- ----------
1 dave dave
2 bl bl
1 bl dave
2 dave bl
SQL> Select a.id,a.name,b.name from davea join bl b on a.id=b.id; -- 这里省略了inner关键字
ID NAME NAME
---------- ---------- ----------
1 dave dave
2 bl bl
1 bl dave
2 dave bl
SQL> Select a.id,a.name,b.name from davea,bl b where a.id=b.id; -- select 多表查询
ID NAME NAME
---------- ---------- ----------
1 dave dave
2 bl bl
1 bl dave
2 dave bl
从这三个SQL 的结果我们也可以看出,他们的作用是一样的。
1.3 自然连接(Natural join)
自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。
先看一下自然连接的例子:
SQL> Select id,name from dave a naturaljoin bl b;
ID NAME
---------- ----------
1 dave
2 bl
这里我们并没有指定连接的条件,实际上oracle为我们自作主张的将,dave表中的id和name字段与bl表中的id和name字段进行了连接。也就是实际上相当于
SQL> Select dave.id,bl.name From davejoin bl on dave.id = bl.id and dave.name=bl.name;
ID NAME
---------- ----------
1 dave
2 bl
因此,我们也可以将自然连接理解为内连接的一种。
有关自然连接的一些注意事项:
(1).如果做自然连接的两个表的有多个字段都满足有相同名称个类型,那么他们会被作为自然连接的条件。
(2).如果自然连接的两个表仅是字段名称相同,但数据类型不同,那么将会返回一个错误。
外连接(OuterJoin)
outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULLOUTER JOIN。通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。
在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。如果基表的数据在另一张表没有记录。那么在相关联的结果集行中列显示为空值(NULL)。
对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
3.(+)操作符只适用于列,而不能用在表达式上。
4.(+)操作符不能与or和in操作符一起使用。
5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
在做实验之前,我们先将dave表和bl里加一些不同的数据。以方便测试。
SQL> select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
3 big bird
4 exc
9 怀宁
SQL> select * from dave;
ID NAME
---------- ----------
8 安庆
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm
2.1 左外连接(Left outer join/ left join)
left join是以左表的记录为基础的,示例中Dave可以看成左表,BL可以看成右表,它的结果集是Dave表中的数据,在加上Dave表和BL表匹配的数据。换句话说,左表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录。BL表记录不足的地方均为NULL.
示例:
SQL> select *from dave a left join bl b on a.id = b.id;
ID NAME ID NAME
--------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm -- 此处B表为null,因为没有匹配到
8 安庆 -- 此处B表为null,因为没有匹配到
SQL> select *from dave a left outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安庆
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。
SQL> Select *from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用关键字where
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安庆
2.2 右外连接(rightouter join/ right join)
和left join的结果刚好相反,是以右表(BL)为基础的, 显示BL表的所以记录,在加上Dave和BL 匹配的结果。 Dave表不足的地方用NULL填充.
示例:
SQL> select * from dave a right join bl bon a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁 --此处左表不足用Null填充
已选择7行。
SQL> select * from dave a right outerjoin bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁 --此处左表不足用Null填充
已选择7行。
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。
SQL> Select * from dave a,bl b wherea.id(+)=b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁
2.3 全外连接(full outer join/ full join)
左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。
示例:
SQL> select * from dave a full join bl bon a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安庆
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
9 怀宁
已选择9行。
SQL> select * from dave a full outer joinbl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安庆
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
9 怀宁
已选择9行。
自连接
自连接(self join)是SQL语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。
示例:
在oracle的scott的schema中有一个表是emp。在emp中的每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理。
下面我们需要将每一个员工自己的名字和经理的名字都找出来。这时候我们该怎么做呢?
如果我们有两张这样的表分别教worker和mgr,那么我们就很好写SQL语句。
Select worker.name,Mgr.name From worker,mgrWhere worker.id = mgr.id;
但现在我们只有一张emp表。所以我们可以采用自连接。自连接的本意就是将一张表看成多张表来做连接。我们可以这样来写SQL语句:
SQL> select work.enameworker,mgr.ename manager from scott.emp work, scott.emp mgr
2 where work.mgr= mgr.empno
3 order by work.ename;
WORKER MANAGER
---------- ----------
ADAMS SCOTT
ALLEN BLAKE
BLAKE KING
CLARK KING
FORD JONES
JAMES BLAKE
JONES KING
MARTIN BLAKE
MILLER CLARK
SCOTT JONES
SMITH FORD
WORKER MANAGER
---------- ----------
TURNER BLAKE
WARD BLAKE
已选择13行。

各种连接的一个图示:



======
另外可以再参考http://huaxia524151.iteye.com/blog/1423614
分享到:
评论

相关推荐

    mysql连接驱动包

    总结来说,MySQL连接驱动包是Java开发与MySQL数据库不可或缺的桥梁,选择合适的版本取决于你的Java环境和MySQL服务器版本。这两个版本的差异主要体现在对JDBC规范的支持程度、对新MySQL特性的支持以及性能优化等方面...

    mysql连接驱动jar包

    总结来说,MySQL连接驱动jar包是Java开发中不可或缺的部分,它使得我们可以通过JDBC API轻松地与MySQL数据库进行交互。了解其安装、配置和使用方法,以及解决可能出现的问题,是每个Java开发者必备的技能。在日常...

    mysql .net 连接驱动

    总结来说,MySQL .NET连接驱动为.NET开发者提供了高效、安全的途径来访问和管理MySQL数据库,无论是简单的CRUD操作还是复杂的业务逻辑,都能借助这个驱动轻松实现。通过理解并熟练使用MySql.Data.dll、MySql.Data....

    使用Python语言和MySQL连接库进行MySQL表连接的示例代码

    ### 使用Python语言和MySQL连接库进行MySQL表连接的示例代码 #### 一、引言 随着数据量的不断增长,高效地管理数据库成为了一项关键技能。在众多数据库管理系统中,MySQL因其开源、易用及高效等特点而备受开发者...

    通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法.pdf

    Navicat for MySQL 远程连接错误 1130 是因为 MySQL 服务器不允许从远程主机连接,我们可以通过修改 user 表或授权法来解决这个问题。无论选择哪种方法,都需要首先连接到 MySQL 服务器,然后执行相应的命令以解决...

    MySql连接字符串总结

    总结来说,MySQL连接字符串的配置取决于所使用的连接方式,包括ODBC、OLE DB和.NET驱动,每种方式都有其特定的参数和格式。正确配置这些连接字符串是确保应用程序能够成功连接到MySQL数据库的关键步骤。在实际应用中...

    PowerDesigner逆向生成MYSQL数据库表结构总结.docx

    PowerDesigner 逆向生成 MYSQL 数据库表结构总结 PowerDesigner 是一款功能强大且专业的数据建模工具,广泛应用于数据仓库设计、数据集成和业务流程建模等领域。通过 PowerDesigner 的逆向工程,可以快速生成 MYSQL...

    自己总结 mysql服务器连接不成功之解决方法

    总之,解决MySQL连接问题需要仔细排查服务状态、权限设置、配置文件内容和数据文件的兼容性。在处理这些问题时,务必谨慎操作,避免丢失数据。如果以上方法都无法解决问题,建议查看MySQL的日志文件,它会提供更具体...

    远程用户连接mysql授权

    ### 远程用户连接MySQL授权详解 #### 一、引言 随着互联网技术的发展与企业规模的扩大,数据库系统的远程访问需求日益增加。对于MySQL这样的关系型数据库管理系统而言,实现远程用户连接授权变得尤为重要。本文将...

    jsp连接MySQL用连接池方式步骤

    ### JSP连接MySQL使用连接池方式详解 #### 一、引言 在现代Web开发中,JSP(Java Server Pages)是一种广泛使用的服务器端技术,用于生成动态网页内容。为了提高应用程序的性能和效率,通常会采用连接池来管理与...

    winform,EF连接mysql数据库驱动

    总结来说,要在WinForm应用中使用EF连接MySQL数据库,你需要安装MySQL数据提供程序,创建EF模型,然后通过DbContext进行数据库操作。同时,根据项目需求,合理设计和组织数据库访问层,可以提高代码的可维护性和复用...

    mysql C++连接池

    总结来说,这个压缩包提供了一个C++实现的MySQL连接池,可以简化数据库操作并优化性能。`SqlHelper`和`ConnPool`类是实现这一目标的关键组件,它们可以帮助开发者更高效地管理和使用MySQL数据库。

    vb编写的mysql数据库连接查看器

    总结来说,这个VB项目提供了通过ODBC驱动连接MySQL数据库的能力,使得非程序员也可以方便地进行数据浏览和管理。这在数据库管理、数据分析或小型应用开发中非常有用。通过深入理解VB、ADO、ODBC以及MySQL之间的交互...

    用power Designer生成mysql表关系视图的方法

    总结以上知识点,使用Power Designer生成MySQL表关系视图是一个涉及数据库管理、ODBC驱动配置以及Power Designer操作的应用过程。掌握这些知识点不仅有助于数据库管理员和开发人员进行高效的工作,也能够帮助相关IT...

    mysql的安装以及eclips连接数据库

    MySQL 的安装和 Eclipse 连接数据库 本资源将指导您如何安装 MySQL 数据库,配置 MySQL,可以使用 Eclipse 连接到 MySQL 数据库,并对数据库进行基本操作。 安装 MySQL 在安装 MySQL 之前,需要下载 MySQL 的...

    Linux开启mysql远程连接

    ### Linux开启MySQL远程连接详解 #### 一、背景介绍 随着云计算和大数据技术的发展,Linux作为服务器操作系统的优势日益凸显,而MySQL作为一款广泛使用的开源关系型数据库管理系统,在Linux环境下更是得到了广泛...

    MYSQL数据库连接偶尔连不上,几秒后又自动恢复

    ### MySQL数据库连接偶尔无法连接问题解析 #### 一、问题背景与现象 在日常使用MySQL数据库的过程中,可能会遇到一种情况:数据库连接偶尔会出现无法连接的情况,但几秒钟之后这种状况又会自动恢复正常。这种情况...

    mysql开启远程连接权限

    ### MySQL开启远程连接权限 在本篇文章中,我们将详细介绍如何通过命令行的方式,在Windows系统上为MySQL数据库开启远程连接权限。对于需要从不同位置管理数据库的用户来说,这是一个非常实用的功能。下面,我们将...

Global site tag (gtag.js) - Google Analytics