2007年5月25日 星期五

Group , Join

Group :
1. mysql_num_rows(user_group_34) = mysql_num_rows(efun_group) = 4
2. where only one rule , if wrong may make (Cartesian join)笛卡兒連接
=> 4*4 = 16 筆
SELECT G.s_name,U.memeber_id FROM user_group_34 U, efun_group G
WHERE U.group_id = G.id
GROUP By G.s_name

s_name member_id
group1 9
group2 9
group3 9
group4 9

Join
CROSS JOIN
 
兩個表格在結合時,不指定任何條件,如:
SELECT employee.realname, salary.amount FROM employee, salary
SELECT employee.realname, salary.amount FROM employee JOIN salary
SELECT employee.realname, salary.amount FROM employee CROSS JOIN salary
 在這個例子中,employee 原有 4 筆資料,而 salary 有 5 筆資料,在 JOIN 之後,結果將是兩者資料筆數的乘積:20。就等於是將兩個資料表中,所有可能的組合全部列出來一樣,其結果在實務上不見得有意義。這種結合可被視為兩個資料表的「笛卡兒乘積(Cartesian product)」。《執行結果》

INNER JOIN
 兩個表格在結合時,指定彼此之間的結合條件,如:
SELECT employee.realname, salary.amount FROM employee, salary
WHERE employee.employee_id = salary.employee_id
SELECT employee.realname, salary.amount FROM employee
JOIN salary ON employee.employee_id = salary.employee_id
SELECT employee.realname, salary.amount FROM employee
INNER JOIN salary ON employee.employee_id = salary.employee_id
 如此一來,只有符合結合條件(同時存在於彼此之間)的資料,才會被 JOIN 在一起。這是最常用的 JOIN 型式。《執行結果》

OUTER JOIN
 兩個表格在進行 INNER JOIN 時,只有彼此相符合的資料列才會被考慮到,除此之外,就完全被忽略了。相較於 INNER JOIN 的排他性,OUTER JOIN 則是「寬容」多了。
 在進行 LEFT OUTER JOIN 時,除了彼此相符合的資料列以外,左方的資料表中不相符的資料列也會被強迫輸出,如:
SELECT employee.realname, salary.amount FROM employee
LEFT OUTER JOIN salary ON employee.employee_id = salary.employee_id
SELECT employee.realname, salary.amount FROM employee
LEFT JOIN salary ON employee.employee_id = salary.employee_id
 像 Chuang 這種僅出現在 empolyee 裡,不存在於 saraly 中的資料列,在搭配 NULL 值之後,也能被列在結果之中了。善用這種特殊結果,我們可以順利找到只存在前一資料表,而不存在於後一資料表的資料列。《執行結果》

NATURAL JOIN
 NATURAL 又代表什麼?加上這個關鍵字之後,兩個表格在進行 JOIN 時,不必言明彼此的結合關係,兩者之間同名的欄位會被自動結合在一起。
 所以,以下兩段語法的執行結果相同:
SELECT employee.realname, salary.amount FROM employee
INNER JOIN salary ON employee.employee_id = salary.employee_id
SELECT employee.realname, salary.amount FROM employee
NATURAL JOIN salary
 以下兩段語法的執行結果也是相同的:
SELECT employee.realname, salary.amount FROM employee
LEFT JOIN salary ON employee.employee_id = salary.employee_id
SELECT employee.realname, salary.amount FROM employee
NATURAL LEFT JOIN salary

沒有留言:

網誌存檔

關於我自己

Aspire freedom , Hope to do Soming make self complete ~