分析:此查询中涉及到sno、cname和score三个字段,分别在s、c和sc中,若要使用s、c和sc的联接,
SQL语句为:SELECT sno,score FROM s,c,sc WHERE s.sno=sc.sno and c.cno=sc.cno and cname=‘数据库应用’
则此查询是多表联接查询,并且联接的三表中,两两都要做笛卡儿积操作,所以会增加检索的时间。
分析:此查询中涉及到sno、cname和score三个字段,分别在c表和sc表中就可以全部找到,按照联接表时联少不联多的原则,可以只用c和sc表。
SQL语句改为:SELECT sno,score FROM c,sc WHERE c.cno=sc.cno and cname=‘数据库应用’
2.2.2 联接表时在联少不联多的基础上要能实现联接 在做多表联接查询时,使联接的表的个数尽量少,但是不能一味的追求表的个数,如果表的使用不能达到我们要查询的数据,或者不能实现联接,那也是不成功的。
例3:查询选修了“数据库应用”课程的学生的姓名。
分析:此查询中涉及到sname和cname两个字 段,分别在s表和c表中,若要使用s和c的联接,SQL语句为:SELECT sname,cname FROM s,c WHERE cname=‘数据库应用’则此查询是多表联接查询,但两个表没有公共属性,所以实现不了联接,这样此操作就变成了单纯的笛卡儿积操作,在此联接中会查询 出不符合条件的记录,失去了查询的意义。
分析:此查询中涉及到sname和cname两个字段,分别在s表和c表中,但是s表和c表没有公共属性,不能实现联接,所以必须借助sc表,所以此查询是s表、c表和sc表三表的联接。
SQL语句改为:SELECT sname,cname FROM s,c,sc WHERE s.sno=sc.sno and c.cno=sc.cno and cname=‘数据库应用’
2.3 先筛选后联接
当查询多个数据表时,要先过滤后联接。
例5:查询所有成绩大于70分的学生的信息。
分析:要做s表和sc表两表联接,并筛选出符合条件的记录。
SQL语句为:SELECT*FROM s,sc WHERE s.sno=sc.sno and score>70
此查询语句首先将两个数据表按照学号进行联接,然后再将符合条件的记录筛选。由于两个数据表进行联接时有些记录是以后要筛选掉的,且多个数据表联接是笛卡尔积运算,消耗的时间会随着记录个数的增加很快地增长。
SQL语句改为:SELECT*FROM s,sc WHERE score>70 and s.sno=sc.sno
此联接查询语句克服了以上缺点,首先筛选出符合条件的记录,减少了进行联接的记录个数,然后再执行联接查询,大大提高了查询效率。
3 结束语
查询优化要抓住关键问题,对于数据库应用程序来说,重 点在于如何提高SQL的执行效率。在数据库的开发和维护过程中,多表联接查询的优化设计可以提高系统性能,对于数据量大的数据库系统尤为重要。以上介绍的 几种优化策略使多表联接查询在时间和空间上提高了系统的性能,在一定程度上提高了查询效率。












原文:http://my.oschina.net/u/2249726/blog/419470