内连接(INNER JOIN)
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 FROM??? ??STUDENT AS S INNER JOIN ?TEACHER AS T ON ???S. CNO = T. CNO ORDER BY??SNAME |
運行結果如圖9.13所示。
| ? |
| 圖9.13? 使用INNER JOIN實現的查詢結果 |
可以看到,通過INNER JOIN內連接兩表也得到了同樣的結果。
2.不等連接
在連接條件中,可以使用其他比較運算符,比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
實例9? 使用不等連接進行查詢
查詢學生修的非本系教師開設的課程信息,包括學生學號、姓名、所在系、課程號、成績、以及開課教師的姓名信息。實例代碼:
| SELECT??? ?S.SNO, SNAME, S. DNAME, S.CNO, MARK, TNAME FROM??? ??STUDENT AS S INNER JOIN ?TEACHER AS T ON ???S. DNAME<> T. DNAME AND???S. CNO =T. CNO ORDER BY??? ?SNAME |
運行結果如圖9.14所示。
| ? |
| 圖9.14? 不等連接的查詢結果 |
說明?在默認情況下,DBMS將多表查詢按INNER JOIN來執行,除非指定OUTER JOIN。即,如果將上例中的INNER JOIN關鍵字替換為JOIN也會得到同樣的結果。
當然也可以使用WHERE子句實現上例。代碼如下。
| SELECT ??S.SNO, SNAME, S. DNAME, S.CNO, MARK, TNAME FROM ??STUDENT AS S, TEACHER AS T WHERE??S.DNAME <> T.DNAME AND???S.CNO = T.CNO ORDER BY??? ?SNAME |
運行結果如圖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 FROM ??TEACHER INNER JOIN ?COURSE ON? ???TEACHER.CNO = COURSE.CNO INNER JOIN ?STUDENT ON? ???TEACHER.CNO = STUDENT.CNO ORDER BY??? ?SNAME |
運行結果如圖9.16所示。
| ? |
| 圖9.16? 使用INNER JOIN實現內連接查詢結果 |
總結
以上是生活随笔為你收集整理的内连接(INNER JOIN)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据挖掘的方法有哪些?
- 下一篇: 图像傅里叶变换频谱分析