SQL中on和where的使用及其差异
在编写SQL脚本中,多表连接查询操作需要使用到on和where条件,但是经常会混淆两者的用法,从而造成取数错误。为此,使用测试数据进行总结如下:
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 ;
最终的记录数等于主表的记录数。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 WHERE A1.Brand_Id=‘501B03‘ 13 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 WHERE A1.Brand_Id=‘501B03‘ 13 AND A2.Type_Id=10 14 ;
进一步说明,where条件是对连接产生的查询结果集的二次筛选。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 AND A1.Brand_Id=‘501B03‘ 13 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 AND A2.Type_Id=10 13 ;
总结如下:这里添加了对被连接表的On条件,这个条件也不会影响主表在最后结果集中的记录,它的作用主要是对被连接表首先进行一次筛选,它会让符合这个条件的被连接表中的记录去参与与主表的连接操作,其他不符合on条件的记录根本就没有机会参与与主表的连接。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 AND A1.Brand_Id=‘501B03‘ 13 AND A2.Type_Id=10 14 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 ;
这样可以看到,最后查询结果集的记录数不再是14条记录,而是15条,这说明了一点,最后的结果集中的记录数并不是和主表中记录数一致的,而是由主表和被连接表根据连接条件共同确定的,还可以说明的一点是,不论on条件是什么样,多简单多复杂,只要没有where条件,最后的查询结果集中的记录数不会少于主表记录数。对于这个例子,主表中的14条记录都会进入结果表,由于主表中的连接条件只有User_Id相等,因此,对于A2表中的User_Id=989832由于存在两条记录,因此都会与A1表User_Id=989832的那一条记录相连,因此产生了两条连接结果记录,所以使得最后的结果集增至15条记录。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 ;
上面给A1和A2表的连接条件增加了一个Month_Id相等的条件,这样只有满足这一条件的A2表记录才会参与连接,这样就对A2表中的User_Id=989832剔除了一条记录,所以最后连接只产生了14条记录。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。