《SQL學習指南》中的第5章 1.連接: 在某種機制下,需要將多個表中的數據進行整合到一起,即同一個查詢的結果集中包含來自兩個或者兩個以上的表,這種機制被稱為連接(join). 1.1 ANSI連接語法 本文采用的都是符合SQL92版本的ANSI SQL標準,所有的主流資料庫都採用了SQL92的連接 ...
《SQL學習指南》中的第5章 1.連接: 在某種機制下,需要將多個表中的數據進行整合到一起,即同一個查詢的結果集中包含來自兩個或者兩個以上的表,這種機制被稱為連接(join). 1.1 ANSI連接語法 本文采用的都是符合SQL92版本的ANSI SQL標準,所有的主流資料庫都採用了SQL92的連接語法。由於這些資料庫都出現SQL92標準發佈之前,同時存在一些舊的連接語法,如下所示: 例子1: SELECT e.fname, e.lname, d.`name` FROM employee e , department d WHERE e.dept_id = d.dept_id; 推薦使用SQL92標準 的連接方式,不推薦使用上面的連接方式,主要原因是: 1)連接條件和過濾條件被分隔到兩個子句中(ON子句和WHERE子句),使得查詢語句更利於理解; 2)每兩個表的連接條件都在ON子句中列出,容易找出連接條件; 3)SQL92標準可以在各種資料庫中通用,而舊的語法在不同的數據中的表現可能略有不同;
1.2 笛卡爾積 例子 1: 直接使用from連接employee 和 department表 方式一: SELECT e.fname, e.lname, d.`name` FROM employee e JOIN department 一個有18個雇員和3個部門,會產生54行數據,由於查詢沒有明確的指定兩個表是如何連接的造成的,這時會預設兩張表置換。這樣的連接被稱為交叉連接(cross join). 1.3 內連接 1)兩表連接 例子1: 查詢每個雇員所屬的部門信息 SELECT e.fname, e.lname, d.`name` FROM employee e JOIN department d ON e.dept_id = d.dept_id 結果如圖所示

此時通過描述上面兩個表是通過何種方式關聯的,是通過dept_id來關聯兩個表的。 如果在一個表中的dept_id列中存在某個值,但該值在另一張表的dept_id列中不存在,那麼此時相關的行的連接會失敗,在結果集中的相關行的連接會失敗,在結果集中將會排除包含該值的行,這種類型的連接被稱為內連接 若想要包含某個表中的所有行,並不需要考慮該表的每一行都與另一張表匹配,那麼可以使用外連接 2)多表內連接 -- 例子2.查詢Woburn支行中所有熟練櫃員(在2007年以前入職的櫃員)開設的賬戶 SELECT a.account_id, a.product_cd,a.open_date FROM account a INNER JOIN employee e ON a.open_emp_id = e.emp_id INNER JOIN branch b ON e.assigned_branch_id = b.branch_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch'; 結果如圖所示:

現在FROM子句中包含3個表,兩種連接類型和兩個ON子句,看上去連接的順序是account表,employee表,然後branch表,那麼如果交換employ表和account表的連接順序會出現什麼情況呢? SELECT a.account_id, a.product_cd,a.open_date FROM employee e INNER JOIN account a ON a.open_emp_id = e.emp_id INNER JOIN branch b ON e.assigned_branch_id = b.branch_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch'; 結果如圖所示---無改變




