9.3.3? 內連接(INNER JOIN)
內連接也稱為等同連接,返回的結果集是兩個表中所有相匹配的數據,而舍棄不匹配的數據。也就是說,在這種查詢中,DBMS只返回來自源表中的相關的行,即查詢的結果表包含的兩源表行,必須滿足ON子句中的搜索條件。作為對照,如果在源表中的行在另一表中沒有對應(相關)的行,則該行就被過濾掉,不會包括在結果表中。內連接使用比較運算符來完成。內連接可分為兩種。
1.等值連接
使用等于號(=)比較被連接列的列值,在查詢結果中列出被連接表中的所有列,包括其中的重復列。圖9.12給出了典型的等值內連接示意圖。
![]() |
圖9.12? 等值內連接 |
實例8? 使用INNER JOIN內連接查詢
從STUDENT表和TEACHER表中查詢學生姓名、所在系、所修的所有課程的課程號以及開課教師姓名。在9.3.2節已經通過WHERE子句實現了該實例,這里通過INNER JOIN內連接兩表來實現。實例代碼:
SELECT????? ?SNAME, S.DNAME, S.CNO, TNAME |
運行結果如圖9.13所示。
![]() |
圖9.13? 使用INNER JOIN實現的查詢結果 |
可以看到,通過INNER JOIN內連接兩表也得到了同樣的結果。
2.不等連接
在連接條件中,可以使用其他比較運算符,比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
實例9? 使用不等連接進行查詢
查詢學生修的非本系教師開設的課程信息,包括學生學號、姓名、所在系、課程號、成績、以及開課教師的姓名信息。實例代碼:
SELECT??? ?S.SNO, SNAME, S. DNAME, S.CNO, MARK, TNAME |
運行結果如圖9.14所示。
![]() |
圖9.14? 不等連接的查詢結果 |
說明?在默認情況下,DBMS將多表查詢按INNER JOIN來執行,除非指定OUTER JOIN。即,如果將上例中的INNER JOIN關鍵字替換為JOIN也會得到同樣的結果。
當然也可以使用WHERE子句實現上例。代碼如下。
SELECT ??S.SNO, SNAME, S. DNAME, S.CNO, MARK, TNAME |
運行結果如圖9.15所示。
當然,使用INNER JOIN也可以實現多表的內連接,但是INNER JOIN一次只能連接兩個表,要連接多表,必須進行多次連接。
![]() |
圖9.15? 使用WHERE子句實現的不等連接 |
實例10? 使用INNER JOIN實現多表的內連接
根據TEACHER表、COURSE表和STUDENT表,查詢所有學生的姓名、所在系、所修課程、考試時間、課程成績及授課教師姓名。該列與9.2.3節的實例完全相同,只是在9.2.3節采用WHERE子句的方式實現,這里采用INNER JOIN內連接的方式實現,代碼如下。
SELECT ??SNAME, STUDENT.DNAME, CNAME, CTEST, MARK, TNAME |
運行結果如圖9.16所示。
![]() |
圖9.16? 使用INNER JOIN實現內連接查詢結果 |