Advertisement

SQL连接查询中ON和WHERE子句筛选的差异总结

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


简介:
本文详细探讨了在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查询至关重要,尤其是在处理外部联接时避免因误解导致错误结果的发生。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • 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查询至关重要,尤其是在处理外部联接时避免因误解导致错误结果的发生。
  • 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时更是如此。错误使用可能导致数据过滤不准确,并进而引发程序问题。所以开发人员需要深入了解这两种筛选器的不同之处以便在实践中避免不必要的麻烦。
  • SQLWHEREHAVING简述
    优质
    本文简要介绍并对比了SQL语句中的WHERE与HAVING两个子句的功能及使用场景,帮助读者理解二者在数据筛选过程中的不同作用。 在SQL查询语句中,`WHERE`子句与`HAVING`子句都用于过滤数据,但它们的应用场景有所不同。 首先,`WHERE`子句主要用于在进行分组操作前筛选单个行记录。它通常出现在查询的开始部分,并对来自指定表或视图中的每一行数据应用条件判断,决定是否将其包含于结果集中。此子句支持基本比较运算符(如>、<、=等)和逻辑运算符(AND、OR、NOT),并可使用任何非聚合函数。例如,如果我们想筛选出薪水高于5000的员工记录,可以这样写: ```sql SELECT * FROM emp WHERE sal > 5000; ``` 相比之下,`HAVING`子句则与分组操作紧密相关,它们共同用于需要进行汇总的数据查询中。具体来说,在使用`GROUP BY`语句对数据进行分类后,我们可以用到`HAVING`来进一步筛选这些已经分好的类别或组合结果集。值得注意的是,“HAVING”支持聚合函数的使用,因为它处理的对象是经过分组后的结果而不是原始行记录本身。 例如,如果我们想找出那些工资总额超过10000元的部门,可以这样写: ```sql SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 10000; ``` 在此查询中,“GROUP BY”语句首先根据“deptno”字段对数据进行分组处理,然后通过`HAVING`子句筛选出工资总额超过设定值的部门。 在实际使用时,请记得先用`WHERE`来过滤原始行记录,在经过必要的聚合操作后(如使用了`GROUP BY`)再利用`HAVING`来进一步限定结果。需要注意的是,“HAVING”不能单独使用,必须配合“GROUP BY”。 总结来说: 1. `WHERE`子句在数据分组之前应用,适用于单个行的筛选。 2. `HAVING`子句则是在进行分组操作后用于对这些组合后的记录或类别结果集进一步过滤。 3. 另外,“WHERE”不支持聚合函数的使用,而“HAVING”可以。 理解这两者的区别和用法对于编写高效的SQL查询至关重要。
  • SQL多表
    优质
    本课程深入讲解了如何使用SQL进行复杂的多表数据查询,涵盖内连接、外连接等各类连接方式的应用场景与优化技巧。 SQL Server 数据库中的多表关联查询语句用于从多个相关联的表中提取数据。这种查询通常使用JOIN关键字来连接不同的表格,并根据需要应用WHERE子句以过滤结果集。编写有效的多表关联查询对于提高数据库操作效率和获得所需信息至关重要。
  • SQLJOINONWHERE区别详解
    优质
    本文深入解析SQL查询中的JOIN操作符配合ON和WHERE子句的区别及其应用场景,帮助读者理解如何正确使用它们以优化数据库查询。 本段落简要介绍了SQL语句中的JOIN操作中ON和WHERE子句的区别及其工作原理。
  • SQL操练-嵌套
    优质
    本课程专注于提升学员在SQL中的高级查询技能,通过实践操作教授如何进行有效的表连接及子查询应用,助力数据处理效率与精度的双重优化。 【例3.49】查询学生的选修课程情况首先引入知识点:连接查询其实就是对于多个表进行笛卡尔积。 ```sql select Student.*, Sc.* from TEST.Student, TEST.SC where Student.Sno = Sc.Sno; ``` 上面的例子是等值查询,`where`的条件是‘=’ ,也可以是非等值查询将条件改为‘!=’即可。 【例3.50】用自然连接完成上述的【3.49】 首先引入 自然连接:自然连接类似于关系代数中的自然连接,在此不再赘述 ```sql select Student.Sno, Sname, Ssex, Sage, Cno, Grade from TEST.Student ,TEST.SC; ``` 注意,上面代码中最后一个例子的表名可能存在拼写错误(TEst),应当修正为 TEST.SC。
  • MySQL
    优质
    本资料全面总结了MySQL数据库中常用的查询语句,包括基础查询、条件筛选、排序与分组等技巧,旨在帮助读者快速掌握高效数据检索方法。 ### MySQL查询语句汇总知识点详解 #### 1. 使用`SHOW`语句找出在服务器上当前存在的数据库 - **语法**: `SHOW DATABASES;` - **功能**: 列出当前MySQL服务器上所有可用的数据库。 - **示例**: ```sql mysql> SHOW DATABASES; ``` - **说明**: 此命令会返回一个包含所有数据库名称的结果集。 #### 2. 创建数据库 - **语法**: `CREATE DATABASE ;` - **功能**: 创建一个新的数据库。 - **示例**: ```sql mysql> CREATE DATABASE MYSQLDATA; ``` - **说明**: 上述命令将创建名为`MYSQLDATA`的新数据库。 #### 3. 选择数据库 - **语法**: `USE ;` - **功能**: 选择特定的数据库作为后续操作的目标。 - **示例**: ```sql mysql> USE MYSQLDATA; ``` - **说明**: 成功选择数据库后,MySQL会显示`Database changed`消息。 #### 4. 查看数据库中的表 - **语法**: `SHOW TABLES;` - **功能**: 列出选定数据库中的所有表。 - **示例**: ```sql mysql> SHOW TABLES; ``` - **说明**: 此命令将返回一个包含当前数据库中所有表名的结果集。 #### 5. 创建表 - **语法**: `CREATE TABLE (, ...);` - **功能**: 创建新的表并定义其结构。 - **示例**: ```sql mysql> CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1)); ``` - **说明**: 上述命令创建了一个名为`MYTABLE`的表,其中包含两个字段:`name`和`sex`。 #### 6. 显示表结构 - **语法**: `DESCRIBE ;` - **功能**: 显示指定表的所有列及其数据类型。 - **示例**: ```sql mysql> DESCRIBE MYTABLE; ``` - **说明**: 此命令会列出`MYTABLE`表的所有列以及它们的数据类型等信息。 #### 7. 插入记录到表 - **语法**: `INSERT INTO VALUES (...);` - **功能**: 将一行或多行数据插入到指定的表中。 - **示例**: ```sql mysql> INSERT INTO MYTABLE VALUES (hyq, M); ``` - **说明**: 上述命令向`MYTABLE`表中插入了一条新记录,其中`name=hyq`, `sex=M`. #### 8. 使用LOAD DATA INFILE导入数据到数据库 - **语法**: ```sql LOAD DATA LOCAL INFILE filename.txt INTO TABLE table_name; ``` - **功能**: 将文本段落件中的内容加载进表中。 #### 9. 更新表记录 - **语法**: ```sql UPDATE SET column1 = value1, column2 = value2,... WHERE condition; ``` #### 10. 删除数据库和数据表 ##### 删除数据库: - **语法**: `DROP DATABASE database_name;` - **功能**: 永久删除指定的数据库。 - **示例**: ```sql mysql> DROP DATABASE MYSQLDATA; ``` ##### 删除表: - **语法**: `DROP TABLE table_name;` - **功能**: 从当前选择的数据库中永久移除数据表。 #### MySQL服务器管理和安全性 - 初始账户管理包括删除匿名用户和设置`root`密码。 ```sql use mysql; delete from User where User=; update User set Password=PASSWORD(newpassword) where User=root; ``` - 用户登录示例: ```sql mysql -uroot -p; -- 登录提示输入密码 mysql -uroot -ppassword; -- 直接使用密码登录 mysql mydb -uroot -p; mysql mydb -uuser1234567890-pnewpassword; ``` - 用户权限管理: ```sql GRANT ALL ON mydb.* TO NewUserName@HostName IDENTIFIED BY password; GRANT USAGE ON *.* TO NewUserName@HostName IDENTIFIED BY password; GRANT SELECT, INSERT, UPDATE ON mydb.* TO NewUserName@HostName IDENTIFIED BY password; GRANT UPDATE, DELETE ON mydb.TestTable TO NewUserName@HostName IDENTIFIED BY password; UPDATE User SET Password=PASSWORD(password) WHERE User=NewUserName; ``` 以上知识点涵盖了MySQL查询语句的基本使用以及服务器管理和安全性方面的要点,有助于初学者理解和掌握MySQL的基本操作和最佳实践。
  • MySQL
    优质
    本资料全面总结了MySQL数据库中的常用查询语句,包括基础查询、高级筛选条件、排序与分组以及联表查询等内容,旨在帮助读者快速掌握高效的数据检索技巧。 MySQL查询语句是数据库管理中的重要工具,用于检索、更新、删除及操作数据。本总结将介绍MySQL的基本查询语法以及高级技巧。 1. **基础查询** - **SELECT语句**: 从表中选择数据的命令,基本格式为 `SELECT column1, column2... FROM table_name;` - **WHERE子句**: 过滤结果集,如`SELECT * FROM table WHERE condition;` - **LIKE操作符**: 模式匹配使用此操作符,例如 `SELECT * FROM table WHERE column LIKE pattern;` - **通配符**:`%` 代表零个、一个或多个字符;`_` 代表单个字符。 - **ORDER BY子句**: 排序结果集,默认为升序(ASC),降序使用DESC。 - **GROUP BY子句**: 对结果进行分组,通常与聚合函数配合使用。 - **HAVING子句**: 过滤经过GROUP BY后的数据。 2. **聚合函数** - **COUNT()**:计算行数 - **SUM()**:数值列的总和 - **AVG()**:平均值 - **MAX()**:最大值 - **MIN()**:最小值 3. **连接查询** - **INNER JOIN**: 返回两个表中匹配的数据。 - **LEFT JOIN (LEFT OUTER JOIN)**: 包含左表的所有行,即使右表没有对应记录。 - **RIGHT JOIN (RIGHT OUTER JOIN)**: 包含右表的所有行,即便左表无对应的记录。 - **FULL JOIN (FULL OUTER JOIN)**: 返回两个表中的所有数据。 4. **子查询** - 在一个查询中嵌套另一个查询,用于获取或比较信息。可以作为SELECT、FROM、WHERE等部分使用。 5. **联合查询 (UNION, UNION ALL)** - 合并多个SELECT语句的结果集。 - 使用UNION去除重复行;使用UNION ALL保持所有数据。 6. **分页查询 (LIMIT, OFFSET)** - LIMIT用于限制结果数量,OFFSET指定从何处开始返回记录。 7. **别名 (AS)** - 为表或列提供更易读的名称。例如 `SELECT column AS alias FROM table;` 8. **集合运算符 (INTERSECT, EXCEPT)** - 在某些MySQL版本中不支持,但在其他数据库系统里用于获取两个查询结果集之间的交集和差集。 9. **自连接** - 表与其自身的关联操作,通常用来处理层次数据或查找相关联的信息。 10. **窗口函数 (ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD())** - 提供在结果集中进行计算的能力,如行号、排名等信息的获取。 11. **条件表达式 (IF(), CASE)** - 在SQL查询中实现逻辑判断功能。 12. **视图 (CREATE VIEW)** - 创建基于一个或多个表的数据集虚拟表示方法。 13. **存储过程和函数** - 封装复杂的业务逻辑,便于重复利用。 14. **索引** - 通过创建索引来提升查询性能。 15. **事务处理 (BEGIN, COMMIT, ROLLBACK)** - 确保数据库操作的一致性和完整性。 以上内容仅涵盖了MySQL查询的基础和高级特性的一部分。深入掌握这些概念,将有助于提高在数据库管理中的效率与能力。
  • 使用C++SQLSQL Server并数据库内容
    优质
    本教程详细介绍了如何利用C++编程语言结合SQL语句实现与Microsoft SQL Server的数据交互,包括建立连接及执行基本查询操作。适合希望掌握数据库访问技能的C++开发者学习参考。 简单的C++访问SQL Server数据库,并查询表中的内容。