第五章
查詢多個資料表(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)