首页 > 数据库 >SQL语句On和Where语句的区别

SQL语句On和Where语句的区别

时间:2024-03-08 18:45:42浏览次数:32  
标签:语句 where id 过滤 user SQL test Where order

前面我们讲解了Join的底层驱动表 选择原理,也知道了基本的内连接外连接两种SQL查询表连接方式
但是我们再查询多表的时候on和where语句到底有什么区别?

where是过滤条件 ,不满足where的一定不会出现在结果中
on是连接条件, 对于内连接来说 on和where效果一致
对于外连接来说, 如果在被驱动表中无法匹配on的过滤条件,该记录是要加入到结果集中
不符合匹配条件的被驱动表的数据,全部用NULL值填充
先 on 再left join 再where
使用on关键字时,会先根据on后面的条件进行筛选,条件为真时返回该行
on的优先级高于left join,所以left join关键字会把左表中没有匹配的所有行也都返回,然后生成临时表返回
where对与行的筛选是在left join之后的,也就是生成临时表之后对临时表进行筛选
下面我们来实战SQL演练一下

1.建表及测试数据

我们先创建两个表 test_user 和 test_order 这两个表作为我们的测试表及测试数据

  • test_user 5条数据, 索引只有主键id
  • test_order 3条数据,索引同样也只有主键id

根据表记录 可以知道

  • user用户表有4个用户, aa,bb,cc,dd
  • order订单表有 1,2,3 个订单, aa一条衣服, bb用户一个鞋子,一个电视

 

2. 内连接的on连接过滤条件等同于where过滤条件

当连接条件是 inner join内连接时, on连接的过滤条件 等同于 where 过滤条件

也就是说 你把过滤条件 放到 on 语句后面 或者放到 where 语句后面,效果是一致的

 

3.left join 外连接 on 连接条件
left join外连接的时候, on 连接条件过滤 和 where 条件过滤 区别就很大了, on 条件是 被驱动表 不匹配的也要展示, 用NULL来填充

但是 where语句就是 不满足的全部都过滤掉, 下面我们来实际看下效果

on语句 的过滤条件, 不符合的展示出来,用NULL填充

#找出驱动表
explain select * from test_user left join test_order on ( test_user.id = test_order.user_id)  and test_order.user_id = 2;
#查询结果
select * from test_user left join test_order on ( test_user.id = test_order.user_id)  and test_order.user_id = 2;

查看结果

test_user是驱动表, 那么test_order就是被驱动表
on 条件是 ( test_user.id = test_order.user_id) and test_order.user_id = 2
是否只返回了 test_order.user_id = 2 的数据 ? 并不是, user_id 不等于2的也都返回了
只不过 她们的被驱动表数据 order 的数据 全都是 NULL填充的
所以 on 后面的过滤条件, 不是做过滤的,而是做匹配的, 不匹配的用NULL填充

 

 

 

5.更复杂的 on 和 where的对比

如果 上面的例子 你还是没区分出来 on 和 where的 区别, 我们再来一个更加直观的, 一眼就看出来区别

 

我们看下执行结果

on条件查询
pay > 100 的 数据返回
pay <= 100的也有一条, 但是都用NULL填充了
返回了 驱动表 test_user 连接 被驱动表 test_order 的符合数据的所有数据 5条数据 且 >100 的 2条 正常展示
pay <= 100的数据 用NULL填充
on先执行 , 连接条件生成临时表, 所以数据就在那里了, 5条数据
然后 匹配 pay >100 的2条, 匹配展示, 其余的 全都 NULL填充
where 条件查询
结果 只有2条数据 pay>100 的就2条数据
where是基于临时表去过滤的
不满足的不会呈现到返回结果
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/u010134642/article/details/134276061

标签:语句,where,id,过滤,user,SQL,test,Where,order
From: https://www.cnblogs.com/shijianchuzhenzhi/p/18061629

相关文章

  • PostgreSQL应该用哪个时区表示符?
    PG中国用哪个时区标识符?在linux中使用timedatectl查看时间,可以看到localtime中时区是CST。$timedatectlLocaltime:Mon2024-03-0418:19:54CSTUniversaltime:Mon2024-03-0410:19:54UTCRTCtime:Mon2024-03-0410:19:53Timezone:Asia/Shanghai(CST,+......
  • 如何避免MYSQL主从延迟带来的读写问题?
    在MYSQL部署架构选型上,许多公司都会用到主从读写分离的架构,如下是一个一主一从的架构,主库master负责写入,从库slave进行读取。但是既然是读写分离,必然会面临这样一个问题,当在主库上进行更新后,有可能数据还没来得及同步到从库,但是这个时候又有读数据的需求,为了能正确读取出数据,这......
  • EF Core 显示SQL语句
     1.使用Nuget引入如下两个包:Microsoft.Extensions.LoggingMicrosoft.Extensions.Logging.Console 2.在DbContext.cs中加入以下代码publicstaticreadonlyLoggerFactoryLoggerFactory=newLoggerFactory(new[]{newDebugLoggerProvider()});......
  • MySQL(四):InnoDB引擎底层解析
    官方文档地址:https://dev.mysql.com/doc/refman/8.3/en/innodb-storage-engine.html。InnoDB存储引擎有三大特性:双写机制、BufferPool、自适应Hash。InnoDB存储引擎架构的内存和磁盘结构如下:上述架构图描述了数据在内存和磁盘上的流转和存储流程,在实际开发......
  • 笔记(五):MySQL之事务概述
    一、什么是事务事务(Transaction):访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。二、事务的四大特性1、原子性(Atomicity)原子性是指事务包含的所有操作要么......
  • MySQL(三):MySQL的执行原理
    1、单表访问之索引合并-indexmergeMySQL中使用多个索引来完成一次查询的执行方法称之为索引合并(indexmerge)。索引合并算法有Intersection合并、Union合并、Sort-Union合并。1.1、Intersection合并Intersection合并,某个查询可以使用多个二级索引,将从多个二级索......
  • SQL Server自增列跳号总结
    从SQLServer2012开始,Microsoft就引入了一个新的功能/特性IDENTITYCACHE,引入这个功能的目录是为了提高包含自增列(IDENTITY)相关表的INSERT性能。但是随之而来的,就是可能会出现自增列(标识列)的跳号问题,如下所示:CREATE TABLE TEST(ID INT IDENTITY(1,1), NAME VARCHAR(16......
  • MySQL(二):MySQL中的系统库
    1、概述MySQL有几个系统数据库,包含了MySQL服务器运行过程中所需的一些信息以及一些运行状态信息。系统库作用performance_schemaMySQL服务器运行过程中的一些状态信息,是对MySQL服务器的一个性能监控,包括最近执行的语句,及花费的时间、内存使用情况等信息informa......
  • MySQL(一):整体架构
    1、整体概述  MySQL是由连接池、管理工具和服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。1.1、ConnectionPool-连接池创建数据库连接是一个耗时的操作,连接池的作用就是将这些连接缓存下来,再次访问数据库时,可以直接用已经建立好的连接,提升服......
  • windows搭建rails环境中,mysql2 gem 安装error问题
    windows搭建rails环境中,mysql2gem安装error问题可以尝试使用下面几种方法:1. Uninstallingandreinstallingthegemwilloftensolvethisissuewithnoneedtodownloadandmovefilesaroundbyhand.Fromyourrailsappdirectory:>gemuninstallmysql2You......