連接查詢與集合查詢 在對數據庫的查詢過程中,有些時候檢索一張表中的數據記錄往往不能滿足開發人員或者客戶的需要。例如,查詢學生的選課成績信息。而學生選課信息和課程成績信息分別在兩個不同的數據表中。其中,在課程信息表(T_curriculum)中包括課程的編號、課程的名字、課程的學分、課時以及授課的教師等學生選課信息,而學生的編號、選課的課程編號以及課程成績等信息在成績信息表(T_result)中,此時為了在查詢的結果中顯示學生選課信息和所選課程的相關信息,就需要同時檢索課程信息表(T_curriculum)和成績信息表(T_result)。這就需要進行連接查詢的操作。 1.內連接查詢 等值連接 等值連接是指將指定的連接條件通過使用等號運算符(=)連接起來,並返回符合連接條件的數據行。其語法格式如下: SELECT 表名1.字段, 表名2.字段 …. FROM 表名1,表名2 WHERE 表名1.字段1=表名2.字段2 其中,SELECT 語句中表名1.字段和表名2.字段表示指定數據表1和數據表2中要查詢的列;FROM語句中表名1和表名2表示指定連接的數據表的名字;WHERE子句中表名1.字段1=表名2.字段2表示用於指定連接條件的列。這裡的字段1中的列和字段2中的列必須是兩個表之間相互關聯的列。 非等值連接 非等值連接是指使用除等號運算符(=)以外的其他運算符將指定條件連接起來而執行的查詢操作。其他運算符包括、>=(大於等於)、<=(小於等於)、>(大於)、<(小於)、!=(不等於)等,還可以使用BETWEEN…AND運算符。 SELECT R.stuID,S.stuName,C.curID, C.curName,R.result FROM T_result R,T_curriculum C,T_student S WHERE R.curID=C.curID AND R.result>80 使用ON子句建立相等連接 在SQL語句中除了WHERE子句中使用等號運算符(=)實現等值連接的操作之外,還可以使用ON子句建立相等連接條件。其語法規則如下: SELECT 表名1.字段, 表名2.字段 …. FROM 表名1 JOIN 表名2 ON 表名1.字段1=表名2.字段 其中關鍵字JOIN表示將表1和表2連接起來,ON子句用來指定連接條件的列。 使用USING子句建立相等連接 在進行連接操作時,有時只希望將兩張表中相互關聯的列建立一個等值連接。此時,可以使用USING子句建立相等連接來簡化使用等號運算符(=)建立的等值連接操作。其語法規范如下: SELECT 表名1.字段, 表名2.字段 …. FROM 表名1 JOIN 表名2 USING (字段1) 其中關鍵字JOIN表示將表1和表2連接起來,USING子句中使用括號將字段1括起來,字段1就是兩個表中建立等值連接相互關聯的列。 2.交叉連接 交叉連接返回的結果是一個笛卡爾積。所謂笛卡爾積實際就是兩個集合相乘的結果。假設集合A中有n個元素,集合B中有m個元素,如果最後返回的結果是n*m,那麼這個結果就是集合A和集合B的笛卡爾積。 SELECT R.stuID,C.curID FROM T_result R,T_curriculum C 或FROM T_result R cross join T_curriculum C 3.自連接查詢 前面講到的連接都是在表與表之間進行的。連接查詢除了可以在不同的表之間進行,也可以對同一張表實現連接操作,這種連接查詢的方式稱為自連接。所謂自連接,就是指一個數據表與其自身進行連接。其語法規則如下: SELECT A.字段, A.字段 …. FROM 表名1 A,表名1 B WHERE A.字段=B.字段 由於連接的是同一張表,所以在FROM語句中需要為表定義不同的別名,這裡為表1分別定義了表的別名為A和B。SELECT語句中可以使用A.字段的形式也可以使用B.字段的形式查詢需要的記錄。這裡的SELECT 語句中使用的是A.字段的形式。 例如,在課程信息表中選擇學分數比操作系統的學分數多的課程信息。 SELECT C2.curID,C2.curName,C2.credit FROM T_curriculum C1,T_curriculum C2 WHERE C1.curName = '操作系統' AND C1.credit<C2.credit 4.外連接查詢 在前面講述的連接操作中,返回的結果都是滿足連接條件的記錄。有些時候,開發人員或者用戶對於不滿足連接條件的部分記錄也感興趣,這個時候就需要使用外連接查詢。外連接查詢不僅可以返回滿足連接條件的記錄,對於一個數據表中在另一個數據表中不匹配的記錄也可以返回。外連接查詢主要包括三種:左外連接、右外連接和全外連接。 左外連接 左外連接中查詢的結果中不僅將顯示滿足連接條件的記錄,而且還包括左側表中不滿足查詢條件的記錄。在Oracle數據庫中,可以使用加號運算符(+)來表示左外連接。當該加號運算符(+)出現在連接條件的左邊時,就稱之為左外連接。其語法格式如下: SELECT 表名1.字段, 表名2.字段 …. FROM 表名1,表名2 WHERE 表名1.字段1(+)=表名2.字段2 其中,SELECT 語句中表名1.字段和表名2.字段表示指定數據表1和數據表2中要查詢的列;FROM語句中表名1和表名2表示指定連接的數據表的名字;WHERE子句中表名1.字段1(+)=表名2.字段2表示左外連接。此時,表名1.字段1所在的列的值將會被全部查詢出來。 在MySQL數據庫和Microsoft SQL Server數據庫中可以使用LEFT[OUTER] JOIN關鍵字實現,其中OUTER關鍵字是可選的。使用LEFT[OUTER] JOIN關鍵字實現左外連接的語法規則如下: SELECT 表名1.字段, 表名2.字段 …. FROM 表名1 LEFT JOIN表名2 ON 表名1.字段1=表名2.字段2 這裡使用LEFT JOIN關鍵字代替SQL語句中FROM語句裡的逗號,使用ON子句代替標准SQL語句中的WHERE子句,並將SQL語句中表示左外連接的加號運算符(+)去除。 右外連接 在Oracle數據庫中,當該加號運算符(+)出現在連接條件的右邊時,就稱之為右外連接。其語法格式如下: SELECT 表名1.字段, 表名2.字段 …. FROM 表名1,表名2 WHERE 表名1.字段1=表名2.字段2(+) 在MySQL和Microsoft SQL Server數據庫中可以使用RIGHT [OUTER] JOIN關鍵字實現,其中OUTER關鍵字是可選的。使用RIGHT [OUTER] JOIN關鍵字實現左外連接的語法規則如下: SELECT 表名1.字段, 表名2.字段 …. FROM 表名1 RIGHT JOIN表名2 ON 表名1.字段1=表名2.字段2 全外連接 全外連接中查詢的結果中不僅將顯示左側表中不滿足連接條件的記錄,而且還會顯示右側表中不滿足查詢條件的記錄。全外連接可以認為是左外連接與右外連接的合集(不包括重復行)。 全外連接可以使用FULL [OUTER] JOIN關鍵字實現,其中OUTER關鍵字是可選的。使用FULL [OUTER] JOIN關鍵字實現左外連接的語法規則如下: SELECT 表名1.字段, 表名2.字段 …. FROM 表名1 FULL JOIN表名2 ON 表名1.字段1=表名2.字段2 5.集合查詢 在SQL的連接查詢語句中,還有一種查詢方式就是結合查詢。集合查詢主要包括三種:並操作、交操作和差操作。其中交操作和差操作並不是對目前主流的所有的數據庫的適用。 並操作(UNION) 執行並操作使用的關鍵字是UNION。並操作返回的結果集是包括了兩個查詢語句中查詢出來的所有不同的行,不包含重復行。其語法格式如下: SELECT 語句1 UNION SELECT 語句2 其中語句1和語句2表示的是兩個用於查詢的SELECT語句。UNION關鍵字表示對這兩個查詢語句查詢出來的結果進行並操作。這裡需要保證SELECT 語句1和SELECT 語句2中查詢出的列數必須相同,而且對應的列的數據類型必須一致。 交操作(INTERSECT) 執行交操作使用的關鍵字是INTERSECT。交操作返回的結果集包括了連接查詢結果的公共行。交操作中不會出現重復行。其語法格式如下: SELECT 語句1 INTERSECT SELECT 語句2 其中語句1和語句2表示的是兩個用於查詢的SELECT語句。INTERSECT關鍵字表示對這兩個查詢語句查詢出來的結果進行交操作。這裡需要保證SELECT 語句1和SELECT 語句2中查詢出的列數必須相同,而且對應的列的數據類型必須一致。 差操作(MINUS) 執執行交操作使用的關鍵字是MINUS。差操作返回的記錄結果集是只在第一個SELECT語句中出現存在,但不存在於第二個SELECT語句的查詢結果中。在其語法格式如下: SELECT 語句1 MINUS SELECT 語句2