`

SQL SERVER 关于外联接(Outer Join)及其他

阅读更多

http://kitesky.itpub.net/post/909/23464

SQL SERVER 关于外联接(Outer Join)及其他

一 使用外联接

  以前在Oracle中用=(+)和(+)=来进行左外联接和右外联接;后来用SQL Server时用*=和=*进行外连接左外联接和右外联接;
现在决定用SQL-92的标准方法:[OUTER] JOIN,OUTER是可以省略的。

  LEFT OUTER JOIN 或 LEFT JOIN        表示左外联接 

  RIGHT OUTER JOIN 或 RIGHT JOIN   表示左外联接 

  FULL OUTER JOIN 或 FULL JOIN        表示左外联接

  外联接的意思不用多说,我们都懂,但是JOIN到底怎么用呢?没有找到很好的资料,只能从例子中学习了:

  1、这个例子也许没有实际意义,只是为了说明问题:

CREATE TABLE orders(order_id int, firm_id int, p_id int) CREATE TABLE firms (firm_id int, f_name int) CREATE TABLE products(p_id int, p_name int) select a.order_id, b.f_name, c.p_name from orders a left join firms b on a.firm_id = b.firm_id left join products c on a.p_id = c.p_id

  说明:orders表是主表,先和从表firms进行左联接,再和从表products进行左联接。

  判断是外联接中的主表还是从表主要看from从句中各个表在LEFT JOIN或RIGHT JOIN两边的位置:LEFT JOIN左边的表是主表,RIGHT JOIN右边的表是主表;

  ON表达了两个表连接的条件,一般外联接是等值联接,不等值联接意义不大;

  在多个表的连接中,一个表既可以做主表又同时可以做从表,为了说明这个问题,我们修改以上SQL为:

select a.order_id, b.f_name, c.p_name from orders a left join firms b on a.firm_id = b.firm_id right join products c on a.order_id = c.p_id

  这个SQL没有什么意义,但从中可以看出a表既是b的主表又是c的从表;到底怎么用,还是要根据实际情况来决定是左联接还是右联接;

  那天,看到了这样一个例子:

create table tab1 (c1 int, c2 int, c3 int) create table tab2 (c1 int, c2 int, c3 int) create table tab3 (c1 int, c2 int, c3 int) create table tab4 (c1 int, c2 int, c3 int) SELECT * FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3 left OUTER JOIN tab3 right OUTER JOIN tab4 ON tab3.c1 = tab4.c1 ON tab2.c3 = tab4.c3

  这种用法还真少见,具体怎么个意思,还在理解中...我把它改写成:

SELECT * FROM tab1 left JOIN tab2 ON tab1.c3 = tab2.c3 LEFT OUTER JOIN tab4 ON tab2.c3 = tab4.c3 RIGHT OUTER JOIN tab3  ON tab3.c1 = tab4.c1

  也许它们是一个意思。我发现加个括号,看的更清楚一些(它是个嵌套)

SELECT * FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3 left OUTER JOIN (tab3 right OUTER JOIN tab4 ON tab3.c1 = tab4.c1) ON tab2.c3 = tab4.c3

  二 外联接中 "ON + AND" 与 "ON + WHERE" 的区别

  1、on条件是外联接时在生成临时表时使用的联结条件,不论从表是确定值还是NULL,主表所有的值都会出现;

  如果再加上and条件; 如果and条件引用的是主表的列,则对结果毫无影响,主表的所有纪录依然会全部出现;如果and条件引用的是从表的列,则不符合条件的从表纪录显示NULL;

  2、where条件是在临时表生成后,再对临时表进行过滤的条件。临时表中的所有纪录都受影响,不符合条件的纪录被过滤出结果集;

  3、示例:

select a.module_id, a.name, b.module_name from fb_autocoding a left join fb_app_module b on a.module_id = b.module_id and b.module_internal_label <> 'LO'; select a.module_id, a.name, b.module_name from fb_autocoding a left join fb_app_module b on a.module_id = b.module_id where b.module_internal_label <> 'LO';

  三 其他Join运算

  merge join:在处理其他联结之前,先把相关两个表联结在一起;

  hash join:把一个表join到已经被执行过join的结果上;

  用括号改变join的顺序:

select catalog.item, catalog.item_color, product.item, color.color_name from catalog full outer join (product cross join color) on catalog.item = product.item and catalog.item_color = color.color_name;

posted on 2007-07-12 15:44 junky 阅读(848) 评论(1)  编辑  收藏 所属分类: SQL Server 、database

 

分享到:
评论

相关推荐

    SQL Server CROSS APPLY和OUTER APPLY的应用详解

    SQL Server中的CROSS APPLY和OUTER APPLY是两种特殊的表运算符,它们在2005版本及以上引入,主要用于处理复杂的数据转换和联接操作。这些运算符的主要区别在于如何处理右表表达式的结果。 CROSS APPLY用于执行内联...

    sql语句的内联外联 经典面试题

    答案:可以使用JOIN关键字实现SQL语句的内联外联,例如INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN等。 4.3 SQL语句的内联外联有什么优缺点? 答案:SQL语句的内联外联可以提高查询效率和数据整合性,但也可能...

    SQL中inner join、outer join和cross join的区别

    **定义**:`OUTER JOIN`(通常称为“外联接”)用于返回两个表中的所有匹配行。如果某个表中有行但另一个表中没有匹配行,则结果集中仍然会显示这些行,但未匹配的列将包含`NULL`值。 - **LEFT OUTER JOIN**(左外...

    SQL外联接及其性质.pdf

    SQL外联接及其性质是数据库管理中的一个重要概念,它为数据库查询提供了强大的数据整合能力。本文将深入探讨SQL外联接的定义、类型、性质以及在实际应用中的重要性。 首先,SQL外联接是一种特殊的关系代数运算,它...

    SQL Server数据库技术大全 电子书

    2.3.2 外联接(OUTER JOIN)/38 2.3.3 完全联接(FULL JOIN)/39 2.3.4 交叉联接(CROSS JOIN)/40 2.3.5 联接的替代写法/40 2.3.6 联合(UNION)/41 2.4 SQL数据类型/42 2.4.1 精确数字类型/43 2.4.2 近似数字类型/...

    SQL Server视频教程(以2000为例,结合使用范例,深入浅出,图文并茂)

    内联接返回两个表中匹配的记录,外联接分为左外(LEFT OUTER JOIN)、右外(RIGHT OUTER JOIN)和全外(FULL OUTER JOIN),分别返回左表、右表或两表所有记录,即使在另一表中没有匹配项。交叉联接则是两个表的...

    sql.rar_sql外联查询

    外联查询分为三种主要类型:左外联(LEFT JOIN)、右外联(RIGHT JOIN)和全外联(FULL OUTER JOIN),每种都有其独特的用途和特性。 首先,我们来了解一下**内联查询**(INNER JOIN)。这是最基础的联接类型,它...

    数据库的外联和内联知识 Inner Join

    在关系数据库管理系统中,SQL 语言提供了多种类型的连接方式,如 inner join、left outer join、right outer join、full outer join、cross join 等。 inner join,也称为等值连接或自然连接,是最常见的一种连接。...

    SQL Server2005 T-SQL 概述

    但对于外联接,如LEFT OUTER JOIN、RIGHT OUTER JOIN或FULL OUTER JOIN,ON与WHERE中的条件处理方式不同。在外联接中,如果左表(LEFT OUTER JOIN)或右表(RIGHT OUTER JOIN)的行在联接过程中找不到匹配项,这些行...

    数据库外联、内联.pdf

    本文主要讨论了数据库中的连接类型,包括内联(Inner Join)、外联(Outer Join)以及它们的变体,如左外联(Left Outer Join)、右外联(Right Outer Join)和全外联(Full Outer Join)。这些概念对于理解和优化...

    sql中内联和外联区别

    在SQL查询语言中,连接(Join)操作是十分常见的需求之一,主要用于将两个或多个表中的数据合并起来进行查询。连接类型多种多样,包括内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER ...

    sql 外联、内联简单的例子

    FROM子句关键字 相应的结果集 CROSS JOIN 笛卡尔乘积(所有可能的行对) INNER JOIN 仅对满足连接条件的CROSS中的列 LEFT OUTER JOIN 一个表满足条件的行,...FULL OUTER JOIN LEFT OUTER 和 RIGHT OUTER中所有行的超集

    Writing Queries Using Microsoft SQL Server 2008 Transact-SQL

    - 外联接:包括LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN,解释它们的用途和语法。 - 自联接:介绍如何在一个表内部进行联接。 ##### V. 使用子查询 - 单行子查询:教授如何使用单行子查询来增强查询的灵活性。 - ...

    SQL常用增删改查语句

    Select s.Stu_Name as '姓名', c.Course_name as '科目', sc.Score_Num from Students as s left outer join Scores as sc on s.Stu_ID=sc.Stu_ID left outer join Courses as c on sc.Course_Id=c.Course_Id ...

    SQL Server操作全集

    2. **连接操作**:`LEFT OUTER JOIN`, `RIGHT OUTER JOIN`, `FULL OUTER JOIN`用于连接多个表,根据连接条件选择不同的记录组合。 ### 扩展SQL功能 1. **插入空表**:通过`SELECT * INTO new_table FROM old_table...

    SQLServer数据库设计和高级查询3_2

    SQL Server支持多种类型的联接,包括内联接(INNER JOIN)、外联接(LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)和交叉联接(CROSS JOIN)。正确选择联接类型对于获取准确的结果集至关重要。 #### 3. **窗口函数** ...

    外 联 接.rar

    在IT行业中,外联接(Outer Join)是数据库查询中的一种关键操作,它允许我们从一个或多个表中检索数据,即使某些记录在另一个表中没有匹配。这与内联接(Inner Join)不同,内联接只返回两个表中都有匹配记录的结果...

    《数据库系统原理与应用(SQL_Server_2000)》考试题.pdf

    15. **联接类型**:外联接(Outer Join)允许保留两侧关系中未匹配的元组,左外联接(Left Outer Join)保留左侧关系的所有元组。 16. **聚合函数**:`COUNT(*)`是正确的聚合函数,用于计算行数。 17. **空值操作*...

    SQL Server 2005中的外联结用法

    在SQL Server 2005中,外联结(Outer Join)是一种重要的查询技术,它允许用户获取关联表之间的所有数据,即使其中一方没有匹配的记录。外联结分为三种类型:左外联结(Left Outer Join)、右外联结(Right Outer ...

Global site tag (gtag.js) - Google Analytics