分析:此查詢中涉及到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的執行效率。在數據庫的開發和維護過程當中,多表聯接查詢的優化設計能夠提升系統性能,對於數據量大的數據庫系統尤其重要。以上介紹的 幾種優化策略使多表聯接查詢在時間和空間上提升了系統的性能,在必定程度上提升了查詢效率。 數據庫