`
jianchen
  • 浏览: 343105 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

左外关联查询

阅读更多

 A表的结构以及数据如下:



 

B表的结构以及数据如下:



 

 

语句一:

 

select sum(num) from B b left outer join A a on B.a_id = A.a_id  where a.status = 1

执行后结果为 21

 

 

语句二:

select sum(num) from B b left outer join A a on B.a_id = A.a_id

 执行后结果为33

 

一开始认为,语句一,也能够得到我想要的结果(即保持B的行数据不丢),实际上不是如此。

 

补充解释上面的原理:

SELECT语句的执行的逻辑查询处理步骤:

(8)SELECT (9)DISTINCT
(11)<TOP_specification> <select_list>
(1)FROM <left_table>
(3) <join_type> JOIN <right_table>
(2)  ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE | ROLLUP}
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

 

每个步骤产生一个虚拟表,该虚拟表被用作下一个步骤的输入。只有最后一步生成的表返回给调用者。如

果没有某一子句,则跳过相应的步骤。

1. FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。

2. ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。

3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。

如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到

处理完所有的表为止。

4. 对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。

5. GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。

6. CUBE|ROLLUP:把超组插入VT5,生成VT6。

7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。

8. SELECT:处理SELECT列表,产生VT8。

9. DISTINCT:将重复的行从VT8中移除,产生VT9。

10. ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有表(VC10)。

11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。

  • 大小: 6.4 KB
  • 大小: 7.3 KB
分享到:
评论

相关推荐

    hibernateHQL关联查询

    - **左外连接(Left Outer Join)**:除了返回两个表中满足连接条件的记录外,还会返回左表中不满足连接条件但右表中不存在匹配项的记录。 - **右外连接(Right Outer Join)**:除了返回两个表中满足连接条件的...

    浅谈Linq to sql 的多表关联与动态条件查询

    其中,第一个 join 关键字关联了 Articles 和 Categories 表,第二个 join 关键字关联了 Articles 和 Categories 表,并使用了 DefaultIfEmpty() 方法来处理左外连接。 动态条件查询是指在运行时根据条件来动态地...

    SQL_左外连接_右外连接_全连接_内连接

    比如,如果你想要得到所有作者的信息,无论他们是否已与出版商关联,那么左外连接是最佳选择。同样,如果你想查看所有出版商,即使没有作者与之关联,右外连接会是合适的选择。而内连接则用于只关注存在关联的数据。...

    mysql关联查询

    这里我们将深入探讨左关联、右关联、内连接和外连接,以及交叉连接。 1. **内连接(INNER JOIN)** 内连接返回两个表中匹配的行。这意味着只有当第一个表(称为“主”表)中的记录在第二个表(称为“从”表)中也...

    Oracle sql语句多表关联查询

    左外连接是指左表中的所有记录都显示,右表中的记录只显示满足连接条件的。 Oracle SQL 语句多表关联查询是数据库管理系统中的一种常见查询方式,通过了解字符串和数字的比较、分组查询、HAVING 子句、查询顺序、...

    Criteria连表查询

    Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询

    kettle实现SQL关联查询

    "Merge Join" Step就是其中之一,它允许用户实现类似SQL中的各种类型关联查询,包括INNER JOIN、LEFT JOIN、RIGHT JOIN以及FULL JOIN。 INNER JOIN是SQL中的一种基本联接类型,它返回两个表中存在匹配的记录。在...

    三表关联查询

    4. 全外连接(FULL OUTER JOIN):返回所有左表和右表的记录,如果在另一张表中没有匹配项,结果将填充NULL。 三、三表关联的基本语法 三表关联查询的语法可能会有所不同,但基本结构如下: ```sql SELECT column...

    Hibernate 内连接和左外连接

    本文主要讨论的是内连接(INNER JOIN)和左外连接(LEFT OUTER JOIN)两种类型,并结合实际例子进行详细讲解。 内连接(INNER JOIN)返回两个表中匹配的行。这意味着只有当第一个表的某行与第二个表的某行有匹配的...

    sql多表关联查询语法详解

    总结,掌握SQL的多表关联查询,包括左外连接、右外连接和嵌套查询,是数据库管理和数据分析的关键技能。理解并熟练运用这些方法,能帮助你在处理复杂的数据关系时游刃有余,提高数据处理的效率和准确性。在实际应用...

    数据库,SQLServer2016,左外连接,下载无需修改直接可用

    左外连接是一种外部连接类型,它在查询时保留了左表(通常是主查询或驱动表)的所有记录,并将这些记录与右表(被查询表)中匹配的记录组合在一起。 左外连接的关键特性在于,即使在右表中没有与左表记录相匹配的...

    C#使用左外连接查询数据

    本文将深入探讨如何使用C#进行左外连接(Left Outer Join)查询,这是数据库查询中的一个关键概念,用于合并两个或多个表的数据,保留左表的所有记录,即使右表中没有匹配的记录。我们将基于提供的描述和标签来构建...

    通用的分页存储过程,内置的函数、内连接、左外连接

    另一方面,"左外连接"(LEFT JOIN)则会返回所有左表(通常是主表)的记录,即使在右表中没有匹配的记录。如果右表有匹配,结果将包含右表的记录;如果没有,相应的字段将填充为NULL。这在处理不完全一对多或多对多...

    第22讲 SQL语言高级04--多表关联查询.PPT

    左外连接会返回所有左表的记录,即使在右表中没有匹配项,而右外连接反之。全外连接会返回左右两边表的所有记录,无论是否有匹配项。在Oracle语法中,外连接可以通过在WHERE子句中指定特定条件来实现: ```sql -- ...

    关联关系按条件查询细

    1. **外连接**:分为左连接(LEFT JOIN)和右连接(RIGHT JOIN),在没有查询条件时,能获取所有信息,左边或右边表的所有记录都会被包含。当有查询条件时,只保留符合条件的关联记录。 2. **内连接**(INNER JOIN...

    mstr多度量设置内外关联的区别

    外关联,特别是左外关联(Left Join),在MSTR中意味着即使同行中其他度量为零,只要至少有一个度量不为零,也会显示该行数据。这对于希望查看所有医院的全面数据,即使某些度量没有记录,也非常重要。在手术数量的...

    实例讲解MYSQL联合查询

    MySQL是一种广泛使用的开源关系型数据库管理系统,其联合查询(JOIN)功能是数据库操作中的核心部分,用于合并多个数据表中的相关记录,以便进行更复杂的分析和检索。在本实例讲解中,我们将深入探讨MySQL联合查询的...

    SQL 四种连接-左外连接、右外连接、内连接、全连接详解

    SQL中的四种连接方式是数据库操作中非常重要的概念,它们分别是内连接、左外连接、右外连接和全连接。理解这四种连接可以帮助我们更有效地从多个表中提取所需信息。 1. **内连接(Inner Join)** 内连接是最常见的...

    经典sql语句,关联到四张表,非常经典

    外连接则包含了左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。在外连接中,即使不存在匹配项也会返回一行记录。在给出的例子中没有直接体现外连接的用法,但是可以通过...

    MYSQL基础:多表关联查询.docx

    左外连接(LEFT JOIN)返回左表(通常是主表)的所有行,即使右表没有匹配的行。右外连接(RIGHT JOIN)则相反,返回右表的所有行。例如: ```sql SELECT * FROM table1 LEFT JOIN table2 ON table1.column = ...

Global site tag (gtag.js) - Google Analytics