自然連接(NATURAL JOIN)是一種特殊的等價連接,它將表中具有相同名稱的列自動進行記錄匹配。自然連接不必指定任何同等連接條件。圖9.9給出了典型的自然連接示意圖。
![]() |
圖9.9? 自然連接 |
自然連接自動判斷相同名稱的列,而后形成匹配。缺點是,雖然可以指定查詢結果包括哪些列,但不能人為地指定哪些列被匹配。另外,自然連接的一個特點是連接后的結果表中匹配的列只有一個,如圖9.9所示,在自然連接后的表中,只有一列C。
實例6? 使用NATURAL JOIN進行查詢
從STUDENT表和TEACHER表中查詢學生姓名、所在系、所修的本系教師開設的課程的課程號以及開課教師姓名。這時候就可以采用NATURAL JOIN對兩個表進行自然連接。實例代碼:
SELECT ??SNAME, DNAME, CNO, TNAME |
當DBMS執行查詢時,將把來自STUDENT表的行與來自TEACHER表中的行通過CNO和DNAME列進行匹配連接。即只有兩個表中的CNO和DNAME列的值都相等的行,才連接起來,作為結果表中的行,而CNO和DNAME列在結果表中只出現一次,因此在查詢時就不需指明TEACHER.DNAME或是STUDENT.DNAME。
注意?有些DBMS產品,如SQL Server,不支持NATURAL JOIN連接符,因此這里無法給出該實例代碼的運行結果。
事實上,使用NATURAL JOIN運算符進行自然連接,與檢查兩個源表中同名列值相等的WHERE子句是等價的。因此,上例的實現也可表示如下。
SELECT ??SNAME, S.DNAME, S.CNO, TNAME |
運行結果如圖9.10所示:
![]() |
圖9.10? 另一種自然連接的查詢結果 |
與自然連接不同,采用這種方式進行表的連接,雖然兩表的CNO和DNAME列相等,但它們在結果表中出現了兩次,因此在SELECT語句中,如果要查詢這兩個字段,必須指明是哪個表的字段。
事實上,使用基于WHERE子句的等值連接要比使用NATURAL JOIN運算符進行自然連接要靈活得多。正如前面介紹的,使用NATURAL JOIN運算符自動判斷出具有相同名稱的列,而后形成匹配,不能人為地指定哪些列被匹配。當自然連接STUDENT表和TEACHER表時,CNO和DNAME列同時被匹配,而不能只匹配一列。而使用WHERE子句則可以實現任意列的匹配。
實例7? 使用WHERE子句進行等值連接查詢
從STUDENT表和TEACHER表中查詢學生姓名、所在系、所修的所有課程的課程號以及開課教師姓名。這時,STUDENT表和TEACHER表只需將CNO字段匹配即可。實例代碼:
SELECT ??SNAME, S.DNAME, S.CNO, TNAME |
運行結果如圖9.11所示。
![]() |
圖9.11? STUDENT表和TEACHER表匹配CNO字段的查詢結果 |
在這種情況下,就不可能使用NATURAL JOIN運算符實現。