数据库连接操作中的on条件与where条件

子查询与连接查询:
子查询:又称嵌套查询,是指在父查询的where条件语句中再插入一个子查询语句,实际执行顺序是先执行子查询,再执行父查询。子查询的适用场景:根据已知得出未知。
连接查询:若一个查询同时涉及两个或两个以上的表,则称之为连接查询,包括:自连接,自然连接,内连接,左外连接,右外连接,全外连接,联合。
关系:连接查询都可以用子查询完成,反之不然。

关系数据库表的连接方式可分为:等值连接,不等值连接;
还可以分为:内连接,外连接,自连接,自然连接,联合;
自连接:连接表本身以作为两个表,此时需要给表取别名。
自然连接:把连接查询结果中重复的属性列去掉的连接查询。
内连接:包含两种形式,隐式的内连接查询和显式的内连接,返回连接表中符合连接条件和过滤条件的数据行。
隐式的内连接,没有inner join,形成的中间表为两个表的笛卡尔积;
select * from table1 t1, table2 t2 where t1.id = t2.id;
显示的内连接,有inner join,形成的中间表为两个表经过on条件过滤后的笛卡尔积;
select * from table1 t1 inner join table2 t2 on t1.id = t2.id;
外连接:可分为左外连接,右外连接,全外连接,外连接不但返回符合连接和过滤条件的数据行,还返回不符合条件的一些行。
左连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,找不到匹配的,用null填充;
select * from table1 t1 left join table2 t2 on t1.id = t2.id;
右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,找不到匹配的,用null填充;
select * from table2 t2 left join table1 t1 on t1.id = t2.id;
全外连接:返回左表和右表中的所有行,当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值。
select * from table1 t1 full join table2 t2 on t1.id = t2.id;
联合:将两个或多个查询的结果集合并为一个结果集。要求待合并的结果集的列数,列的顺序、以及每列的数据类型必须兼容
select c1, c2, c3 from t1 union select c1, c2, c3  from t2;

on and与on where的区别:
1、在使用left join, right join, full join时,on条件和where条件的区别如下:  
1)on条件是在生成临时表时使用的条件。它不管on中的条件是否为真,都会返回基表中的记录(实际上左连接中如果and语句是对左表进行过滤的,那么不管真假都不起任何作用;如果是对右表过滤的,那么左表所有记录都返回,右表筛选以后再与左表连接返回)。
2)where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经完成连接操作了并且生成了确定的临时表,条件不为真时就全部过滤掉。
3)on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。
2、在使用inner join时,不管是对左表还是右表进行筛选,实际都是在生成临时表以后再进行过滤的,而且对左表和右表都起作用,此时on and与on where没有区别。
3、为了避免on与where的混乱,建议on只进行连接操作,where只过滤中间表的记录。

猜你喜欢

转载自my.oschina.net/MasterLi161307040026/blog/1814381