一、 SQL查询在计算机执行的先后顺序
on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后.
二、适用条件
having 带有函数计算的条件查询,也就是聚合函数的条件查询;
on 两个及两个以上表关联的时候, 连接条件必须写在on后面
where 起过滤的作用,一个表时where是直接进行条件筛选(除计算字段外);多表关联时where是对关联后的临时表进行条件筛选。
(关系图)
三、join关联中 on 和 where 的区别
1. join关联时内连接和外连接的区别
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