`

数据库连接查询类型(左连接、右连接、全连接、内连接和交叉连接)

阅读更多

在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的 不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

       连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
       SQL-92标准所定义的FROM子句的连接语法格式为:
       FROM join_table join_type join_table [ON (join_condition)]
       其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。 join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连 接、自然连接和不等连接三种。
       外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有 符合搜索条件的数据行。
       交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
       连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。
       无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。

       下面结合案例说明:

       假设有如下表:


       一个为投票主表,一个为投票者信息表~记录投票人IP及对应投票类型,左右连接实际说是我们联合查询的结果以哪个表为准~
1:如右接连 right join 或 right outer join:(只显示右向表的全部数据)

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


       我们以右边voter表为准,则左表(voteMaster)中的记录只有当其ID在右边(voter)中存在时才会显示出来,如上图,左边中ID为3.4.5.6因为这些ID右表中没有相应记录,所以没有显示!

注意:多个表也同样可以做外连接 ,如有三个表testA,testB,testC,各有A,B两列,可有如下的三个表的外连接:

SELECT *
FROM TESTA
LEFT OUTER JOIN TESTB
ON TESTA.A=TESTB.A
LEFT OUTER JOIN TESTC
ON TESTA.A=TESTC.A

2:因此我们自然能理解左连接 left join 或者 left outer join (左向表的全部数据)
       左向外联接:左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。


可见,现在右边中ID在中存在时才会显示,当右边中没有相应数据时则用NULL代替!
3:全连接 full join 或者 full outer join ,为二个表中的数据都出来,这里演示效果与上一样!

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

       全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。
       在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。

select * from voteMaster vm full outer join voter vt on vm.id=vt.id

注意:mysql不支持全外连接,不过可以使用union达到同样的目的,如下:

select vm.id, vm.voteTitle, vt.ip from voteMaster as vm left join voter vt on vm.id=vt.id union
select vm.id, vm.voteTitle, vt.ip from voteMaster as vm right join voter vt on vm.id=vt.id

4:内连接 inner join 或者 join;

       内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
       1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
       2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
       3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。 即在select 后面指定要查找的列,而不是笼统地使用*。

 

              select vm.id, vm.voteTitle, vt.ip from voteMaster as vm inner join voter as vt on vm.id=vt.id

       内连接不会产生null值,即如果一方没有对应的数据,则不会显示在结果集中,这是和外连接最大的不同。
5:交叉连接(完全连接)cross join 不带 where 条件的
       没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生6*3=18条记录)


等价select vm.id,vm.voteTitle,vt.ip from voteMaster as vm,voter as vt

注意:交叉连接不带ON条件子句

总结:

连接类型             定义

内连接                只连接匹配的行

左外连接            包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行

右外连接            包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行

全外连接            包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

(H)(theta) 连接      使用等值以外的条件来匹配左、右两个表中的行

交叉连接            生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配

 

 

 

SELECT 语句的 FROM 子句可以指定以下几种类型的连接:

FROM 子句关键字           相应的结果集

CROSS JOIN                 笛卡尔乘积(所有可能的行对)

INNER JOIN                 仅对满足连接条件的 CROSS 中的列

LEFT OUTER JOIN        一个表满足条件的行,和另一个表的所有行

RIGHT OUTER JOIN      LEFT 相同,但两个表的角色互换

FULL OUTER JOIN         LEFT OUTER RIGHT OUTER 中所有行的超集

分享到:
评论

相关推荐

    SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接

    SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接

    数据库和ado知识

    数据库连接字符串 SqlConnection类的State属性 SqlCommand类的方法: StatementCompleted事件的触发 获得刚刚插入数据库的自增id Sql注入攻击(避免方式?) 如何使用迭代生成树形菜单 单例模式(单例模式的创建) ...

    Oracle 数据库连接查询SQL语句

    外连接: 全连接(full join)、左连接(left join)、右连接(right join)。 交叉联接(cross join)。 外连接与内连接不一样,外连接返回的查询结果中不仅包含符合条件的行,还包括左表(左外连接),右表(右外连接)...

    精通sql结构化查询语句

    9.4 外连接 9.4.1 左外连接 9.4.2 右外连接 9.4.3 全外连接 9.4.4 在外连接中使用聚合函数 9.5 交叉连接 9.5.l 交叉连接的定义 9.5.2 交叉连接举例 9.6 多表连接的综合应用 9.6.1 内连接与左外连接的综合应用 ...

    SQL编写规范(数据库操作规范)

     如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表    例如:  EMP表描述了LOCATION表和CATEGORY表的交集  SELECT *  FROM LOCATION L,  ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。  SQL语言主要包含5个部分  数据定义...

    SQL数据库资源大放送

    如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表...

    21天学会SQL

    11.2.6 交叉连接查询 230 11.2.7 连接查询中使用聚合函数 232 11.2.8 高级连接查询实例 233 11.3 组合查询 235 11.3.1 使用组合查询 236 11.3.2 使用UNION的规则 237 11.3.3 使用UNION得到复杂的统计 汇总样式 238 ...

    SQL语法大全

    1. ASP与Access数据库连接: dim conn,mdbfile mdbfile=server.mappath("数据库名称.mdb") set conn=server.createobject("adodb.connection") conn.open "driver={microsoft access driver (*.mdb)};uid=admin;...

    精通SQL 结构化查询语言详解

    9.3.5 交叉连接(CROSS JOIN)  9.4 UNION与UNION JOIN  9.4.1 关系的集合运算  9.4.2 UNION运算符  9.4.3 ORDER BY子句排序UNION运算结果  9.4.4 对多表进行UNION运算  9.4.5 UNION JOIN 连接表  9.5 ...

    程序员的SQL金典6-8

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    程序员的SQL金典7-8

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    程序员的SQL金典4-8

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    程序员的SQL金典3-8

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    程序员的SQL金典.rar

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

Global site tag (gtag.js) - Google Analytics