SQL中on和where的区别及分析总结

    科技2023-10-05  103

    一、基础

    连接操作 当我们在数据库中进行查询操作时常会通过连接两张或者多张表。下面以连接两表为例叙述。 数据库在通过连接两张表来返回我们需要的记录时,常常是根据过滤条件,连接两张表,生成一个临时表呈现给用户。

    连接操作分为inner join、left outer join和right outer join 在多表查询过程中,使用on、where来规定过滤的条件。

    join的过程理解:先对两表做笛卡尔积,on后面的条件对笛卡尔积结果进行过滤并且生成一张临时表。如果没有where则直接返回该临时表作为结果。如果有where则会根据where设置的过滤条件,对前面得到的临时表进行进一步过滤,再求得查询结果。

    join的比较: 内连接(inner join),只有两表存在匹配才会返回对应的行。笛卡尔积中没有匹配的行会被删去。 左外连接(left join),始终会保留左边表的所有行,若右边表不存在对应匹配的位置填null

    二、实例测试

    建立两张表以用于测试,分别为学生表student和学生选课表 SC(sno学号、Cno课程号)

    现在希望连接两表但是,过滤掉学号Sno为2015122的学生的记录。分别对内连接和外连接中使用on 或 where过滤的结果进行比较 2.1. test inner join:

    1.on SELECT *from student stu INNER JOIN sc on stu.sno=sc.Sno AND stu.sno!=201215122 AND sc.Sno!=201215122; 2.on连接,用where过滤 SELECT *from student stu INNER JOIN sc on stu.sno=sc.Sno WHERE stu.sno!=201215122 AND sc.Sno!=201215122;

    这两句运行几结果均为: 由此可见:在内连接中使用on和where可以实现相同的过滤效果。

    2.2 test left (outer) join:

    1.on左连接并过滤 SELECT *FROM student stu LEFT JOIN sc on stu.sno=sc.sno AND stu.sno!=201215122 AND sc.sno!=201215122;

    结果:出现了sno=201215122的记录,是我们不希望看到的

    2.on连接,用where设置过滤条件 SELECT *FROM student stu LEFT JOIN sc on stu.sno=sc.sno WHERE stu.sno!=201215122 AND sc.sno!=201215122;

    三、思考与分析 on 和where都可以用于过滤,其中on 比 where先执行 对于inner join. 使用on或where来过滤没有区别,这是因为inner join不存在left join的特性,前者直接用求笛卡尔积再利用on的过滤条件生成临时表。后者在on得到的通过学号匹配的临时表后,再用when进行进一步过滤。

    对于left join. 使用on: 由于left join特殊性,on的过滤条件对左边的表(驱动表)是不起作用的,因为无论如何左边的悬浮元组都会保留,on的条件只对右边的表起作用。从结果可以看到sno=201215122的Sno(1)、Cno、Grade都被过滤掉了。因为是left join 所以都填null。尽管如此还是出现了该条记录,这是我们不希望看到的。

    使用where: on首先通过学号连接两表,得到一张临时的表,接着where子句会对这个临时的表进一步过滤,因此最终结果不会出现sno=201215122的记录。

    sum: on 后面跟的是生成临时表的条件,而where后面跟的是对临时表进行进一步过滤的条件!

    四、one more think…

    结合课程学习和查资料过程中的启发,给出一个可能的优化

    SELECT *from (SELECT* from student where student.sno!=201215122) stu inner join (SELECT *from sc WHERE sc.sno!=201215122) sc on stu.sno=sc.sno

    在根据两表学号连接之前,先利用两个子查询将两表中需剔除的记录剔除,得到的表命名为stu、sc。可以减小表的规模。接着再将stu和sc做笛卡尔积。

    tips:在做连接之前设法减小表的规模,在数据量很庞大时可以节省很多运算时间,提高查询效率。

    最近在学习数据库,写博客记录学习过程中遇到的一些疑惑和解决后的总结思考。因为现在还是学生,知识体系可能还不完善,如果有什么错漏欢迎及时指出~ 如果有补充的也希望各位大佬评论补充,这样帮助更多有疑惑的同学。当然啦 如果文章帮到你,希望能求个一键三连哈哈。谢谢~

    Processed: 0.018, SQL: 8