
註:第2種寫法比較簡單
select a.*,b.* from T1 as a left join T2 as b on a.A=b.C
三個資料表結合:
SELECT A.`g_name` , A.`g_area` , C.`date1` FROM ".$xoopsDB->prefix("tour_dir")." AS A
LEFT JOIN ".$xoopsDB->prefix("tour_orderm")." AS B ON A.group_sn = B.customer_sn
LEFT JOIN ".$xoopsDB->prefix("tour_orders")." AS C ON B.serno = C.serno
WHERE A.`g_area` LIKE '$g_area'
ORDER BY C.`date1` ASC
//刪除的用法
delete A,B,C,D,E,F from xoops2016a_tour_dir as A
LEFT JOIN xoops2016a_tour_orderm as B ON A.group_sn=B.customer_sn
LEFT JOIN xoops2016a_tour_orders as C ON B.serno=C.serno
LEFT JOIN xoops2016a_tour_accent as D ON A.group_sn=D.up_mark_sn
LEFT JOIN xoops2016a_tour_schedule as E ON A.group_sn=E.group_sn
LEFT JOIN xoops2016a_tour_ws_price as F ON A.group_sn=F.ws_price_group_sn
where A.group_sn=53
//更新的用法
update Table1 t1
join Table2 t2 on t1.ID=t2.t1ID
join Table3 t3 on t2.ID=t3.t2ID
set t1.Value=12345
where t3.ID=54321
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
SELECT A.`group_sn` , A.`g_no` , B.`ws_price_count` , B.`ws_price_title`,D.`date1`
FROM ".$xoopsDB->prefix("tour_dir ")." AS A
LEFT JOIN ".$xoopsDB->prefix("tour_ws_price ")." AS B ON A.`group_sn` = B.`ws_price_group_sn`
LEFT JOIN ".$xoopsDB->prefix("tour_orderm ")." AS C ON A.`group_sn` = C.`customer_sn`
LEFT JOIN ".$xoopsDB->prefix("tour_orders ")." AS D ON C.`serno` = D.`serno`
WHERE A.`g_name` LIKE '%{$tour_name}%'
AND TO_DAYS(D.`date1`)- TO_DAYS(NOW()) > 3
AND A.`g_del` != '1'
AND B.`ws_price_title` LIKE '成人%'
ORDER BY B.`ws_price_count` ASC , A.`g_no` ASC
轉載自 http://chensh.loxa.edu.tw/php/B_9.php 感謝分享!















最近幫客戶架的網站都可以收到信:
我本身也是使用gmail,因此實在不了解原因出在那裡。