假設一個數據庫中有兩張表,一張是學生表StudentInfo,一張是班級表ClassInfo,兩張表之間用ClassId字段進行關聯。 如果用內連接,正常的寫法是這樣的: Select StudentInfo.*,ClassInfo.* from StudentInfo join ClassInfo on StudentInfo.ClassId=ClassInfo.ClassId 用這種寫法不會出現笛卡爾積,但是內連接是允許省略連接條件的,也就是可以省略掉on后面的內容,所以如果寫成這樣: Select StudentInfo.*,ClassInfo.* from StudentInfo,ClassInfo 也是可以通過編譯的,但是這樣一來就產生了一個笛卡爾積(關於笛卡爾積的內容見文章最后注解)。 但是因為怕產生笛卡爾積而拒絕使用內鏈接是不正確的,只要不省略掉連接條件,是不會產生笛卡爾積的。 具體采用內連接還是外連接要看具體問題的需要。內連接的特性是只顯示符合連接條件的記錄,以剛才的語句為例,查詢結果只顯示學生表和班級表中ClassId相等的記錄。舉例來說,如果有條學生記錄的ClassId字段為空,那么用內鏈接將不會顯示這條學生記錄,因為在班級表里面是找不到對應的ClassId的。 而外連接就不一樣,以左外連接為例(右外連接類似),它除了顯示符合連接條件的記錄以外,還會顯示所有左表中的記錄(右外連接就是所有右表中的記錄)。還是以剛才的例子說明,如果學生表中有條學生記錄的ClassId字段為空,用學生表左外連接班級表,那么是會顯示這條學生記錄的。 所以如果要求只顯示已有分班的學生記錄,那么就應該用內連接查詢;如果要求查詢所有學生記錄,那么就應該采用外連接查詢。
笛卡爾積: |