首先我们要明确:on和where后都表示查询的条件
1.on只能用于连接查询(内连接、外连接、交叉连接),在其他情况下使用on会报错
select * from stu on id=1
上面这样写就是不行的,只能用where进行条件查询。
2.在进行连接查询时会产生一张中间表也可以叫做临时表,on是在生成中间表时使用的条件;而where是在中间表生成后对中间表进行过滤使用的条件。
比如说:
id | name |
1 | Rose |
2 | Tom |
3 | Amy |
id | name |
2 | xiaoming |
5 | xiaohong |
select* from stu1 left join stu2 on stu1.id = stu2.id and stu1.id = 2;
select* from stu1 left join stu2 on stu1.id = stu2.id where stu1.id = 2;
此时运行结果是这样的。
id | name | id | name |
1 | Rose | null | null |
2 | Tom | 2 | xiaoming |
3 | Amy | null | null |
id | name | id | name |
2 | Tom | 2 | xiaoming |
这时我们发现where之后的结果是进行条件查询的结果。
3.在进行外连接是必须使用on,不然会报错。
select *from stu1 left join stu2 on stu1.id = stu2.id
4.在进行内连接时on和where都可以使用。
select *from stu1 inner join stu2 on stu1.id = stu2.id
select *from stu1 inner join stu2 where stu1.id = stu2.id
5.on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。
在两表联接查询时用on,在一个表的时候,就只有where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢。
在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什幺时候起作用,然后再决定放在那里。