首页 > 数据库 >SQL语句中过滤条件放在on、where、having的区别和联系

SQL语句中过滤条件放在on、where、having的区别和联系

时间:2022-09-18 12:13:13浏览次数:105  
标签:join SQL 过滤 子句 where having

摘要:SQL语句中,过滤条件放在不同筛选器on、where和having的区别和联系。

综述

  在《SQL语句中过滤条件放在on和where子句中的区别和联系》中,介绍了多表关联SQL语句中,过滤条件放在on和where子句中的区别——inner join中没区别,外连接就不一样。本文在此基础上,介绍on、where和having三类子句的区别和联系。

区别和联系

  在写SQL语句的时候,我们经常会用到各种表连接(left join、right join、inner join和 full join等),还有各种分组聚合函数(sum、min、max、avg和count等)。那么我们在写连接操作SQL的时候,对于不同的过滤条件是放在 ON 子句,还是代表分组操作的 having 子句,抑或 where子句中呢?我们先看一下三种条件关键字的执行顺序:

on > where > 聚合函数 > having

  详细的来讲,就是:

步骤一、根据on筛选器生成生成临时表。此时的临时表会因为left join或right join的特性而一定带有主表的记录,也就是主表的记录不会被 on 条件过滤掉。

步骤二、根据where筛选器过滤临时表。因为临时表已经生成完毕,根据where条件过滤时主表记录也会被过滤。

步骤三、聚合函数进行运算。

步骤四、 聚合函数运算完毕,having子句生效,对运算完毕的临时表进行过滤 ,生成最终的结果表。

  三个筛选器on、where和having都可以加条件,on是最先执行,where次之,having最后。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的。

  了解了上述执行过程后,我们来聊聊应该把过滤条件放在哪,即如何使用on、where和having筛选器。下面是一些基础的选择标准,供各位参考:

  1. 所有的连接条件都必需要放在ON子句。

  2. 如果在表关联后需要保留主表的所有记录,不论有没有相匹配的从表记录,那么我们就应该将过滤条件放在 on 中。

  3. 如果过滤条件需要在聚合函数运算完毕之后才能确定,比如我们想要找出平均分数大于60分的班级,那么就必须等待分组聚合函数执行完毕才能进行过滤,那这个过滤条件肯定就是放在having中了,因为where生效的时候聚合函数还没有进行运算。

  4. 如果过滤条件不依赖聚合函数,只是想要符合条件的部分记录而且没有要求保留主表的全部记录,那么我们就应该放在where子句中。当然,如果表关联是采用inner join的话,因为没有主从表的关系,所以放在 where 和 on 中是一样的。

  5. 就执行效率来看:因为on生效最早,所以放在on中应该最快,其次是where,最后是having。

结束语

  以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作具有一定的参考和学习价值;如果有疑问,大家可以在评论区留言交流,也希望大家多多点赞关注。谢谢大家对楼兰胡杨的支持!

Reference

标签:join,SQL,过滤,子句,where,having
From: https://www.cnblogs.com/east7/p/16704564.html

相关文章

  • MySQL数据备份 mysqldump 详解
    MySQL数据备份流程1打开cmd窗口通过命令进行数据备份与恢复;需要在Windows的命令行窗口中进行;l 开始菜单,在运行中输入cmd回车;l 或者win+R,然后输入cmd回车,即......
  • mysql基础命令
    MySQL数据库入门——常用基础命令  1、使用帮助信息  登陆数据库就不介绍了哦  比如说想做创建的数据库的操作,不知道命令,就可以查看帮助信息 mysql>......
  • MySQL常见字符串截取小结
    MySQL截取字符串常见函数有:left()、right()、substring()、substring_index()。从左侧截取字符串用法:left(str,length)描述:left(被截取字符串,截取长度)SELECTLEFT('......
  • 第二十一章 MySQL数据库优化
    一、数据硬件优化(选型)1.数据库选择1.真实的硬件物理机,虚拟化,搭建数据库2.云服务器ECS,自己搭建数据库3.云数据库(RDS,DRDS)2.数据库类型1.OLTP 在线事务处理系统,支持大......
  • sqlite3使用2
    一.在cmd中打开SQLite1.进入数据库通过输入d:cdD:\……\SQLitesqlite3进入数据库查看数据库的基本信息:.help显示各种重要的SQLite点命令的列表.show显示SQLite命......
  • MySQL EXPLAIN详解
    Explain简介本文主要讲述如何通过explain命令获取select语句的执行计划,通过explain我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引......
  • 关于MySQL的lock wait timeout exceeded解决方案
    copy自:关于MySQL的lockwaittimeoutexceeded解决方案一、关于MySQL出现lockwaittimeoutexceeded;tryrestartingtransaction的解决方案。我们可以通过到informa......
  • sqlite4操作
    目录SQLite数据库(一):基本操作...1目录...1一、SQLite介绍...21.   什么是SQLite.22.   什么是数据库...23.   数据库是如何存储数据的...24.  ......
  • 第十七章 MySQL的各种主从
    一、延时从库1.已经有主从配置延时从库1.停止主从 mysql>stopslave;2.设置延时从库 mysql>changemastertomaster_delay=180; 3.开启主从 mysql>startslav......
  • 了解 SQL 排名函数:Row_Number、Rank 和 Dense_Rank
    了解SQL排名函数:Row_Number、Rank和Dense_RankPhotoby卡斯帕卡米尔鲁宾on不飞溅自从我开始学习SQL以来,一直很困惑,无法清楚地理解RankingFunctions之间的......