美文网首页
sqlyog中on where having的区别

sqlyog中on where having的区别

作者: Gloria艳 | 来源:发表于2018-10-26 17:46 被阅读0次

    一、 SQL查询在计算机执行的先后顺序

    on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后.


    数据库执行逻辑图

    二、适用条件

    having 带有函数计算的条件查询,也就是聚合函数的条件查询;
    on 两个及两个以上表关联的时候, 连接条件必须写在on后面
    where 起过滤的作用,一个表时where是直接进行条件筛选(除计算字段外);多表关联时where是对关联后的临时表进行条件筛选。


    where和on的区别

    (关系图)

    三、join关联中 on 和 where 的区别

    1. join关联时内连接和外连接的区别
    on

    left join:左外连接,以左表为主,右边表匹配不上的,直接以null(空)显示;
    right join:右外连接,以右表为主,左边表匹配不上的,直接以null(空)显示;
    full join:全部关联起来;
    inner join:只关联两个表共同的部分。inner join一般默认就是join;
    cross join:就是两个表相乘,运算量很大,查询速度比较慢。

    2. on 和where 的区别

    在使用left join时,on和where条件的区别如下:
    1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。/(实际上左连接中如果and语句是对左表进行过滤的,那么不管真假都不起任何作用。如果是对右表过滤的,那么左表所有记录都返回,右表筛选以后再与左表连接返回)/
    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。
    在使用inner join时,不管是对左表还是右表进行筛选,on and和on where都会对生成的临时表进行过滤。
    总结:
    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
    对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面。

    补充:在on的情况下and、or 与on同时对前面的集合起作用,而存在where的时候,先对集合进行on条件的抽取,再根据where的条件进行抽取。
    说下原因:
    (1)、ON后面的筛选条件主要是针对的是关联表【而对于主表筛选条件不适用】。
    (2)、对于主表的筛选条件应放在where后面,不应该放在ON后面
    (3)、对于关联表要区分对待。如果是要条件查询后才连接应该把查询件
    放置于ON后。如果是想再连接完毕后才筛选就应把条件放置于where后面
    (4)、对于关联其实可以先做子查询再做join

    相关文章

      网友评论

          本文标题:sqlyog中on where having的区别

          本文链接:https://www.haomeiwen.com/subject/mslltqtx.html