Advertisement

SQL连接查询中ON和WHERE筛选的区别

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本文探讨了在SQL连接查询中使用ON与WHERE子句进行数据筛选时的关键差异。帮助读者理解二者在条件表达式上的不同应用及其对查询结果的影响。 SQL连接查询是数据库操作中的重要部分,它允许我们从多个表中组合并筛选数据。在执行这种查询时,On筛选器与Where筛选器虽然看起来相似,但在特定情况下它们的作用不同,尤其是在处理Outer Join(如Left Join和Right Join)时这一点尤为重要。 首先了解一下三种基本的SQL连接类型:Cross Join、Inner Join以及Outer Join。Cross Join返回两个表的所有可能组合;Inner Join只返回匹配的数据行;而Outer Joins则会显示所有左表或右表中的记录,即使在另一个表中没有对应的记录,这些未配对的记录将被NULL填充。 对于Cross和Inner Join,On筛选器与Where筛选器的效果是一样的。然而,在处理Left Join时,两者的区别就显现出来了: 假设我们有两个表格:Main(主表)和Ext(扩展表),这两个表格通过ID字段关联。如果我们想找出地址不为杭州的所有用户信息,则会出现两种不同的写法。 1. 使用On筛选: ```sql SELECT * FROM Main LEFT JOIN Ext ON Main.id = Ext.id AND address <> 杭州; ``` 在这种情况下,On筛选器不仅检查Main和Ext之间的匹配关系,还会应用于Ext表。因此,即使在Ext中没有相应的记录,地址为杭州的行也会被排除在外。但是这意味着我们可能会看到主表中的某些用户信息(其扩展信息为空),因为这些用户可能并未提供地址。 2. 使用Where筛选: ```sql SELECT * FROM Main LEFT JOIN Ext ON Main.id = Ext.id WHERE address <> 杭州; ``` 在这个例子中,Where筛选器在最后阶段应用,因此它会检查整个结果集。这表示无论是在Main表还是Ext表里出现的地址为杭州的信息都会被排除掉。 理解On和Where筛选的区别对于编写正确的SQL查询非常重要,尤其是在处理Outer Join时更是如此。错误使用可能导致数据过滤不准确,并进而引发程序问题。所以开发人员需要深入了解这两种筛选器的不同之处以便在实践中避免不必要的麻烦。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • SQLONWHERE
    优质
    本文探讨了在SQL连接查询中使用ON与WHERE子句进行数据筛选时的关键差异。帮助读者理解二者在条件表达式上的不同应用及其对查询结果的影响。 SQL连接查询是数据库操作中的重要部分,它允许我们从多个表中组合并筛选数据。在执行这种查询时,On筛选器与Where筛选器虽然看起来相似,但在特定情况下它们的作用不同,尤其是在处理Outer Join(如Left Join和Right Join)时这一点尤为重要。 首先了解一下三种基本的SQL连接类型:Cross Join、Inner Join以及Outer Join。Cross Join返回两个表的所有可能组合;Inner Join只返回匹配的数据行;而Outer Joins则会显示所有左表或右表中的记录,即使在另一个表中没有对应的记录,这些未配对的记录将被NULL填充。 对于Cross和Inner Join,On筛选器与Where筛选器的效果是一样的。然而,在处理Left Join时,两者的区别就显现出来了: 假设我们有两个表格:Main(主表)和Ext(扩展表),这两个表格通过ID字段关联。如果我们想找出地址不为杭州的所有用户信息,则会出现两种不同的写法。 1. 使用On筛选: ```sql SELECT * FROM Main LEFT JOIN Ext ON Main.id = Ext.id AND address <> 杭州; ``` 在这种情况下,On筛选器不仅检查Main和Ext之间的匹配关系,还会应用于Ext表。因此,即使在Ext中没有相应的记录,地址为杭州的行也会被排除在外。但是这意味着我们可能会看到主表中的某些用户信息(其扩展信息为空),因为这些用户可能并未提供地址。 2. 使用Where筛选: ```sql SELECT * FROM Main LEFT JOIN Ext ON Main.id = Ext.id WHERE address <> 杭州; ``` 在这个例子中,Where筛选器在最后阶段应用,因此它会检查整个结果集。这表示无论是在Main表还是Ext表里出现的地址为杭州的信息都会被排除掉。 理解On和Where筛选的区别对于编写正确的SQL查询非常重要,尤其是在处理Outer Join时更是如此。错误使用可能导致数据过滤不准确,并进而引发程序问题。所以开发人员需要深入了解这两种筛选器的不同之处以便在实践中避免不必要的麻烦。
  • SQLONWHERE子句差异总结
    优质
    本文详细探讨了在SQL连接查询中使用ON和WHERE子句进行数据筛选的区别,并总结其适用场景与特点。 在SQL查询中使用连接(JOIN)可以将两个或多个表的数据合并在一起,并基于它们之间的相关列获取结果集。连接操作涉及到`ON`和`WHERE`子句的运用,这两个子句处理筛选条件的方式有所不同,特别是在执行外部联接时这种区别更为显著。 当进行内部联接(INNER JOIN)或者交叉联接(CROSS JOIN),在这些类型的JOIN中使用 `ON` 子句定义连接条件。如果只利用 `ON` 而不采用 `WHERE` ,查询结果依然有效且不会发生变化,因为两者在此类操作中的效果一致。 然而,在执行外部联接时,如左联接(LEFT JOIN)和右联接(RIGHT JOIN),这两种子句的差异便显现出来。这些类型的JOIN旨在返回所有来自一个表中的记录,即使在另一个表中没有匹配项的情况下也会如此。此时: 1. **生成笛卡尔积**:系统首先无条件地合并两个表的所有可能组合。 2. **应用ON筛选器**:随后根据 `ON` 子句的条件过滤满足连接规则的数据对。 3. **添加外部行**:对于左联接,如果右表中没有匹配项,则结果集中将使用NULL填充相应的列;反之亦然,即在右联接时会补充缺少匹配记录的情况。 4. **应用WHERE筛选器**:如果有 `WHERE` 子句存在的话,在上述步骤之后它会对最终的结果集进行进一步的过滤。 假设我们有两个表为`main`和`ext`, 并且希望查找所有地址不是杭州的用户。如果我们使用左联接,并把条件放在ON子句中: ```sql SELECT * FROM main LEFT JOIN ext ON main.id = ext.id AND address <> 杭州 ``` 在这个查询里, `address <> 杭州` 只影响到 `ext` 表中的记录;如果在 `main` 表中有条没有匹配项且地址为杭州的记录,则这条记录会被保留下来,并且相应的列将被填充NULL。 若我们将条件移至WHERE子句: ```sql SELECT * FROM main LEFT JOIN ext ON main.id = ext.id WHERE address <> 杭州 ``` 这时, `WHERE` 子句会在最后一步中过滤结果集,因此它会同时检查两个表的地址列以确保没有杭州地址出现在最终结果集中。 总结来说,在确定表之间关联时主要使用ON筛选器,并且在执行外部联接操作期间仅在连接阶段有效。而WHERE子句则是在所有连接和初步筛选之后对最终的结果集进行额外条件过滤,这对于编写准确的SQL查询至关重要,尤其是在处理外部联接时避免因误解导致错误结果的发生。
  • SQL语句JOINONWHERE详解
    优质
    本文深入解析SQL查询中的JOIN操作符配合ON和WHERE子句的区别及其应用场景,帮助读者理解如何正确使用它们以优化数据库查询。 本段落简要介绍了SQL语句中的JOIN操作中ON和WHERE子句的区别及其工作原理。
  • SQLWHEREHAVING
    优质
    本文章主要讲解在SQL查询语句中WHERE与HAVING两个关键字的功能及区别,帮助读者理解它们各自的使用场景。 1. 类型: “WHERE”是一个约束声明,在查询数据库的结果返回之前对查询条件进行限制,即在结果返回前生效,并且不能在 WHERE 后面使用聚合函数; “HAVING”是一个过滤声明,表示在查询数据库的结果返回之后再进行筛选操作,即在结果返回后生效,并且可以在 HAVING 后面使用聚合函数。 2. 使用的角度: 由于 WHERE 的执行顺序是在聚合函数之前,因此不允许在 WHERE 后面直接使用聚合函数。例如,在下面的 SQL 语句中:`select sum(score) from student group by student.sex where sum(student.age)>100;` 这样的写法是不正确的,因为 `WHERE` 子句中的条件需要基于原始数据而非经过聚合后的结果来评估。
  • SQLLEFT JOIN与ONWHERE条件关键字详解
    优质
    本文深入解析了SQL查询中的LEFT JOIN语法及其与ON、WHERE关键字的不同用法,帮助读者理解如何正确使用这些条件以实现高效的数据检索。 LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配项。如果右表中没有相应的记录,则结果为 NULL。本段落主要介绍了 SQL 中的 left join 以及 on 和 where 关键字的区别。
  • SQLONWHERE用于过滤条件详解
    优质
    本文详细解析了在SQL查询语句中使用ON和WHERE来设置过滤条件的不同之处,帮助读者理解何时以及如何正确运用这两个关键字。 在SQL查询中,`ON` 和 `WHERE` 都用于设置过滤条件,但它们在不同类型的查询中扮演的角色和产生的效果是有区别的。本篇文章将深入探讨`ON`和`WHERE`在`JOIN`操作中的具体差异,并通过实例来帮助理解。 `JOIN`操作是SQL中用于合并两个或更多表的数据的关键部分。主要有四种类型的`JOIN`: `INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN` 和 `FULL OUTER JOIN`. 我们首先关注 `INNER JOIN`, 因为它是使用`ON`和`WHERE`最相似的情况。 1. **INNER JOIN**: - 在`INNER JOIN`中,可以同时用到`ON`和`WHERE`来设置过滤条件。但是它们的应用顺序不同。 - 使用 `ON` 设置的条件会在两个表进行笛卡尔积运算之后对结果进行初步筛选,也就是说,在连接操作发生后应用这些条件。 - 如果在执行 `INNER JOIN` 的时候既使用了 `ON`, 也用了 `WHERE`, 那么 `WHERE` 条件会进一步过滤由 `ON` 过滤后的数据集。 - 示例: ```sql SELECT * FROM person p INNER JOIN account a ON p.id = a.id AND p.id != 4 AND a.id != 4; SELECT * FROM person p INNER JOIN account a ON p.id = a.id WHERE p.id != 4 AND a.id != 4; ``` 这两个查询的结果是相同的,因为在 `INNER JOIN` 中, `ON` 和 `WHERE` 的过滤条件都只对最终的匹配结果生效。 2. **LEFT JOIN**(或`RIGHT JOIN`): - `LEFT JOIN`(或`RIGHT JOIN`)保留左表(或右表)的所有记录,即使在右表(或左表)中没有匹配的记录。 - 使用 `ON` 设置条件仅对非主侧有效, 而 `WHERE` 则作用于整个结果集。 - 当使用 `LEFT JOIN` 时,如果通过 `ON` 条件未能找到对应的行,则该行在连接的另一端为NULL。 - 示例: ```sql SELECT * FROM person p LEFT JOIN account a ON p.id = a.id AND p.id != 4 AND a.id != 4; ``` 在这个例子中, 即使有 `p.id != 4` 的条件,`LEFT JOIN` 还是会保留所有来自 `person` 表的记录,只是在没有匹配到对应行的情况下,其对应的字段值为NULL。 如果添加了 `WHERE` 条件: ```sql SELECT * FROM person p LEFT JOIN account a ON p.id = a.id WHERE p.id != 4 AND a.id != 4; ``` 这时, `WHERE` 条件会过滤掉在 `person` 表中ID为4的记录,即使在执行了 `LEFT JOIN` 的情况下使用了 `ON`, 因为 `WHERE` 是在整个结果集上进行操作。 总结来说,`ON` 主要用于定义两个表之间的关联条件, 而 `WHERE` 则对整个查询的结果进行过滤。在 `INNER JOIN` 中两者的作用基本相同,在执行 `LEFT JOIN` 和 `RIGHT JOIN` 时,它们的效果会有所不同:使用 `ON`, 过滤仅限于非主侧的记录;而通过 `WHERE`, 可以在整个结果集中应用条件。 理解这些区别对于编写更高效、准确的SQL查询至关重要。希望这篇文章的内容能帮助你理解和运用`ON`和`WHERE`的区别,如有任何疑问欢迎进一步交流讨论。
  • 【MySQL】:分组使用WHERE与HAVING
    优质
    本文详细解析了在MySQL数据库操作中,分组查询时WHERE和HAVING两个关键字的不同作用及其应用场景,帮助读者掌握其正确用法。 在SQL查询中使用分组查询(Group By)是一种强大的功能,它允许我们将数据根据特定的字段值进行分类,并对每个类别的数据执行聚合运算,例如求总和、平均数或计数等操作。 当我们利用`GROUP BY`语句时,数据库会依据指定列将具有相同值的行归为一组。假设我们创建了一个名为`tab`的数据表,该表包含姓名(NAME)、分数(score)、性别(gender)以及薪水(salary)四列,并且插入了一些数据样本。 例如,如果我们要统计男生和女生各自的人数及最高分,则可以使用以下查询: ```sql SELECT gender, COUNT(gender), MAX(score) FROM tab GROUP BY gender; ``` 这条SQL语句会返回每个性别的学生人数(通过`COUNT(gender)`计算)以及他们各自的最高分数(利用`MAX(score)`)。值得注意的是,当应用了`GROUP BY`之后,在查询结果中的其他列要么出现在聚合函数中,要么在`GROUP BY`子句内。在这个例子中,“gender”作为分组依据而“COUNT(gender)”和“MAX(score)”则是用于计算的聚合函数。 另外,我们可以通过使用`WHERE`或`HAVING`来设定额外的数据筛选条件。“WHERE”通常会出现在数据进行分组之前,并且可以用来过滤原始数据;例如: ```sql SELECT gender, AVG(score) FROM tab WHERE score IN (60, 80) GROUP BY gender; ``` 这条查询将只显示分数为60或80的学生,然后根据性别计算平均成绩。 另一方面,“HAVING”则在执行完分组后使用,并允许我们对聚合的结果进行筛选。例如: ```sql SELECT gender, AVG(score) FROM tab GROUP BY gender HAVING AVG(score) > 60; ``` 这条查询只会显示那些平均分数大于60的性别的信息。 总结而言,`WHERE`和`HAVING`在SQL查询中扮演着重要角色。前者通常用于筛选原始数据中的行,而后者则用来过滤聚合后的结果集。理解并正确使用这两个关键字是进行复杂数据分析的关键所在。
  • SQL多表
    优质
    简介:本教程深入浅出地讲解了如何使用SQL进行多表连接查询,包括内连接、外连接等不同类型的连接方式及其应用场景。 SQL 多表连接查询是指在 SQL 语句中将多个表进行关联以获取不同表格中的数据。这种查询可以分为外连接、内连接及交叉连接等多种类型。 一、外连接 1. 左连接(LEFT JOIN) 左连接返回第一个表即左表的所有行,如果该表的某一行与第二个或右表没有匹配项,则结果中对应的部分为空值(NULL)。 SQL 语句:`SELECT * FROM student LEFT JOIN course ON student.ID = course.ID` 执行结果会包含学生信息中的所有记录,并且对于那些未在课程表中有对应的项目,其返回的将是空值(NULL)。 2. 右连接(RIGHT JOIN) 右连接返回第二个或右表的所有行。如果左表中某一行与右表没有匹配项,则结果中对应的部分为空值(NULL)。 SQL 语句:`SELECT * FROM student RIGHT JOIN course ON student.ID = course.ID` 执行结果会包含课程信息中的所有记录,并且对于那些未在学生表中有对应的项目,其返回的将是空值(NULL)。 3. 完全外连接(FULL JOIN) 完全外连接将两个表格的所有行都包括进来。如果右表中某一行没有匹配项,则结果中对应的部分为空值(NULL),同样地,左表中的情况也是如此。 SQL 语句:`SELECT * FROM student FULL JOIN course ON student.ID = course.ID` 执行结果会包含学生和课程信息的全部记录,并且对于那些在对方表格里未找到对应的项目,其返回的将是空值(NULL)。 二、内连接 内连接(INNER JOIN)只返回两个表中满足条件的数据行。 SQL 语句:`SELECT * FROM student INNER JOIN course ON student.ID = course.ID` 执行结果会仅包含那些在学生和课程表格中有对应关系的数据项,即只有当两边都有匹配时才会显示出来。 三、交叉连接 交叉连接(CROSS JOIN)返回的是两个表的笛卡尔积集合。 SQL 语句:`SELECT * FROM student CROSS JOIN course` 四、处理一对多或多对一的关系 在实际应用中,有时需要处理如学生与课程之间的一对多关系。此时可以创建一个中间关联表格来存储这些信息,并通过该表格进行查询操作以获取所需数据。 例如: SQL 语句:`SELECT s.Name, C.Cname FROM student_course AS sc LEFT JOIN student AS s ON s.Sno = sc.Sno LEFT JOIN course AS c ON c.Cno = sc.Cno` 执行结果会显示学生选课的具体情况,包括了学生的姓名和所选择的课程名称。
  • LEFT JOIN ON WHERE 后面添加过滤条件
    优质
    本文探讨了SQL查询中使用LEFT JOIN时,在ON和WHERE子句后添加过滤条件的不同效果及其应用场景。 在使用LEFT JOIN进行数据库查询时,过滤条件可以放在ON后面也可以放在WHERE后面。这两种方式的主要区别在于执行逻辑的不同。 1. 如果将过滤条件放在ON后面的LEFT JOIN中,则该条件不仅会影响连接操作的匹配过程(即决定哪些行会被合并),还会导致不符合此条件的左表中的记录不会出现在结果集中,这可能会使查询返回的结果与预期不符。 2. 若把同样的过滤条件写在WHERE后面,那么LEFT JOIN会首先执行所有符合条件的数据联接,并且即使右表中没有匹配项(即连接字段为NULL),这些行也会被包含进最终的输出。之后,在应用了WHERE子句中的额外筛选后,只有满足特定标准的结果才会保留下来。 因此,在使用过滤条件时需谨慎选择其位置以确保查询结果符合预期需求。
  • SQL多表与关联
    优质
    本篇文章将详细介绍在SQL中如何执行多表连接查询及其相关联的操作,包括内连接、外连接等不同类型的连接方式,帮助读者掌握高效的数据检索技巧。 SQL中的多表连接查询包括内连接(INNER JOIN)、左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)、全外连接(FULL OUTER JOIN)以及交叉连接(CROSS JOIN)。以下是各种类型的简要描述: - 内部连接(INNER JOIN):返回两个表中满足条件的所有组合。 - 全外部联接(FULL OUTER JOIN):将两表中的相同记录合并在一起,同时显示A表中有而B表没有的数据,并且这些数据在结果集中以NULL表示;同样地,也展示出B表有但A表中不存在的记录并用NULL填充缺失部分。 - 左外连接(LEFT JOIN):基于左表的所有行进行联接。对于右表中的不匹配项,在结果集里显示为null值。 - 右外连接(RIGHT JOIN):与左外连接相反,它以右表为基础,展示出该侧所有记录,并且在没有对应的左侧记录时用NULL填充。 这些描述帮助理解不同类型的SQL联接如何操作和返回数据。