第五章

查詢多個資料表(Joins and Subqueries)

Join

1.決定從那些資料表中,取得那些欄位

2.確定需要加入資料表的公共列

3.寫“Join條件”,將資料表聯結在一起

•連接條件是在where子句連接在一起,從兩個不同的表的兩列條件

–如果名稱相同,每列必須與表名前綴,以避免混淆

•select column_name [ , … ] from table_name1 inner join table_name2 on join_condition [ where condition ]

錯誤應用

•加入沒有任何連接條件被稱為 Cartesian product,因為沒有任何邏輯對應行加入,結果通常是無法使用

–在一個資料表中的每一行加入與所有其他表的每一行

•在聯接時,使用兩個含糊不清的兩個資料表中的欄位名稱,,•通常會查詢失敗

規則

•可以加入where的條件,來查詢Join的結果

•在where 中不需要相同欄位名稱,但是同屬性

•在where子句中的列不必在SELECT子句中的列表

•NULL值是無法被Join的

•在ANSI中最多可以支援92個join

•可以使用別名來代替table name

•可以加入「group by」和「having」來群組化Join的結果

•可以在Join中名入「order by」來排序

•from 子句必須列出查詢中所涉及的所有表,查詢是否返回資料表

–你不必從連接中涉及的每一個表的一列顯示

•至少要有N-1的Join條件

Subqueries

•select outer_query_column_list from table where value { = | in } (select column_name from table)

•有時需要查詢從一個表中的信息,以便查詢另一個表

•大部份Subqueries的寫法都可以轉換成Join

•如果select 的結果是一個值可以使用「=」,多個值的話就是使用「in」,不然只可以得到最後一個值

•最多可以有16層

•Subqueries大部份使用在需要Aggregates的情況

•但Aggregates的值不可以是多個

•select title_id, price from titles where price > (select avg(price) from titles)

•有時比Join,實現同樣的目的更容易了解

•可以執行那些本來無法使用Join方法的任務 (例如:Aggregate)