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
分享到:
相关推荐
- **左外连接(Left Outer Join)**:除了返回两个表中满足连接条件的记录外,还会返回左表中不满足连接条件但右表中不存在匹配项的记录。 - **右外连接(Right Outer Join)**:除了返回两个表中满足连接条件的...
其中,第一个 join 关键字关联了 Articles 和 Categories 表,第二个 join 关键字关联了 Articles 和 Categories 表,并使用了 DefaultIfEmpty() 方法来处理左外连接。 动态条件查询是指在运行时根据条件来动态地...
比如,如果你想要得到所有作者的信息,无论他们是否已与出版商关联,那么左外连接是最佳选择。同样,如果你想查看所有出版商,即使没有作者与之关联,右外连接会是合适的选择。而内连接则用于只关注存在关联的数据。...
这里我们将深入探讨左关联、右关联、内连接和外连接,以及交叉连接。 1. **内连接(INNER JOIN)** 内连接返回两个表中匹配的行。这意味着只有当第一个表(称为“主”表)中的记录在第二个表(称为“从”表)中也...
左外连接是指左表中的所有记录都显示,右表中的记录只显示满足连接条件的。 Oracle SQL 语句多表关联查询是数据库管理系统中的一种常见查询方式,通过了解字符串和数字的比较、分组查询、HAVING 子句、查询顺序、...
Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询
"Merge Join" Step就是其中之一,它允许用户实现类似SQL中的各种类型关联查询,包括INNER JOIN、LEFT JOIN、RIGHT JOIN以及FULL JOIN。 INNER JOIN是SQL中的一种基本联接类型,它返回两个表中存在匹配的记录。在...
4. 全外连接(FULL OUTER JOIN):返回所有左表和右表的记录,如果在另一张表中没有匹配项,结果将填充NULL。 三、三表关联的基本语法 三表关联查询的语法可能会有所不同,但基本结构如下: ```sql SELECT column...
本文主要讨论的是内连接(INNER JOIN)和左外连接(LEFT OUTER JOIN)两种类型,并结合实际例子进行详细讲解。 内连接(INNER JOIN)返回两个表中匹配的行。这意味着只有当第一个表的某行与第二个表的某行有匹配的...
总结,掌握SQL的多表关联查询,包括左外连接、右外连接和嵌套查询,是数据库管理和数据分析的关键技能。理解并熟练运用这些方法,能帮助你在处理复杂的数据关系时游刃有余,提高数据处理的效率和准确性。在实际应用...
左外连接是一种外部连接类型,它在查询时保留了左表(通常是主查询或驱动表)的所有记录,并将这些记录与右表(被查询表)中匹配的记录组合在一起。 左外连接的关键特性在于,即使在右表中没有与左表记录相匹配的...
本文将深入探讨如何使用C#进行左外连接(Left Outer Join)查询,这是数据库查询中的一个关键概念,用于合并两个或多个表的数据,保留左表的所有记录,即使右表中没有匹配的记录。我们将基于提供的描述和标签来构建...
另一方面,"左外连接"(LEFT JOIN)则会返回所有左表(通常是主表)的记录,即使在右表中没有匹配的记录。如果右表有匹配,结果将包含右表的记录;如果没有,相应的字段将填充为NULL。这在处理不完全一对多或多对多...
左外连接会返回所有左表的记录,即使在右表中没有匹配项,而右外连接反之。全外连接会返回左右两边表的所有记录,无论是否有匹配项。在Oracle语法中,外连接可以通过在WHERE子句中指定特定条件来实现: ```sql -- ...
1. **外连接**:分为左连接(LEFT JOIN)和右连接(RIGHT JOIN),在没有查询条件时,能获取所有信息,左边或右边表的所有记录都会被包含。当有查询条件时,只保留符合条件的关联记录。 2. **内连接**(INNER JOIN...
外关联,特别是左外关联(Left Join),在MSTR中意味着即使同行中其他度量为零,只要至少有一个度量不为零,也会显示该行数据。这对于希望查看所有医院的全面数据,即使某些度量没有记录,也非常重要。在手术数量的...
MySQL是一种广泛使用的开源关系型数据库管理系统,其联合查询(JOIN)功能是数据库操作中的核心部分,用于合并多个数据表中的相关记录,以便进行更复杂的分析和检索。在本实例讲解中,我们将深入探讨MySQL联合查询的...
SQL中的四种连接方式是数据库操作中非常重要的概念,它们分别是内连接、左外连接、右外连接和全连接。理解这四种连接可以帮助我们更有效地从多个表中提取所需信息。 1. **内连接(Inner Join)** 内连接是最常见的...
外连接则包含了左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。在外连接中,即使不存在匹配项也会返回一行记录。在给出的例子中没有直接体现外连接的用法,但是可以通过...
左外连接(LEFT JOIN)返回左表(通常是主表)的所有行,即使右表没有匹配的行。右外连接(RIGHT JOIN)则相反,返回右表的所有行。例如: ```sql SELECT * FROM table1 LEFT JOIN table2 ON table1.column = ...