PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum


การใช้งาน SQL LEFT JOIN

19 September 2014 By
left join sql


ก่อนเข้าตัวอย่างการใช้งาน LEFT JOIN มาดูรูปแบบของ join condition ทั้งสอง
รูปแบบกันก่อน 
 
ON conditional_expr
และ
USING (column_list)
 
ON ใช้เปรียบเทียบ column แบบทั่วไป โดยชื่อ column จะเป็นชื่อเดียวกันหรือคนละ
ชื่อก็ได้ เช่น
 
SELECT
a.cus_id,a.cus_name,b.cusID,b.order_id,b.pro_id
FROM tbl_customer a LEFT JOIN tbl_order b
ON a.cus_id=b.cusID
 
โดยที่ cus_id ของตาราง tbl_customer มีค่าเดียวกันกับ cusID ของตาราง tbl_order
แต่มีการกำหนดชื่อ column ไม่เหมือนกัน
อย่างไรก็ตาม กรณีที่ชื่อ column ที่กำหนดเหมือนกัน ก็สามารถใช้ ON ได้
 
ส่วนสำหรับการใช้งาน  USING (column_list)
จะเหมาะสำหรับกรณี สองตารง มีการกำหนด ชื่อ column เหมือนกัน ดังนั้นการ
เปรียบเทียบค่า เช่น ON a.cus_id = b.cus_id เราสามารถแทนได้ด้วย USING(cus_id)
 
SELECT
a.cus_id,a.cus_name,b.cus_id,b.order_id,b.pro_id
FROM tbl_customer a LEFT JOIN tbl_order b
USING(cus_id)
 
 
ตารางฐานข้อมูลประกอบการอธิบาย
 
tbl_customer
tbl_order
tbl_product
cus_id cus_name
1 Cus A
2 Cus B
3 Cus C
4 Cus D
5 Cus E
order_id cus_id pro_id
1 1 3
2 2 3
3 1 4
4 3 5
5 1 5
6 3 5
7 5 2
8 5 4
9 3 2
10 5 5
pro_id pro_name pro_price
1 Pro 111 100
2 Pro 222 200
3 Pro 333 100
4 Pro 444 250
5 Pro 555 400
 
การใช้งาน LEFT jOIN ตามความเข้าใจก็คือ การโฟกัสไปที่ตารางด้านซ้าย
 
FROM tbl_customer a LEFT JOIN tbl_order b

 
แบบนี้คือโฟกัสไปที่ตารางชื่อ tbl_customer
 
หมายเหตุ เผื่อใคร ไม่เข้าใจว่า a กับ b ที่ต่อท้ายชื่อตารางหมายถึงอะไร 
ตัว a กับ b ใช้สำหรับเป็นชื่ออ้างอิงตาราง เรากำหนดเป็นตัวอะไรอักษร หรือคำ
ใดก็ได้ ตามความเหมาะสมและเข้าใจ เวลาเราเขียนคำสั่ง query เรียกดูข้อมูล
column ต่าง ๆ จะได้เขียนย่อ หรือเขียนสั้นลงกว่าเดิม
 
//จาก

SELECT
tbl_customer.cus_id,tbl_customer.cus_name,
tbl_order.cus_id,tbl_order.order_id,tbl_order.pro_id
FROM tbl_customer LEFT JOIN tbl_order

// ใช้เป็น

SELECT
a.cus_id,a.cus_name,b.cus_id,b.order_id,b.pro_id
FROM tbl_customer a LEFT JOIN tbl_order b
 
 
การโฟกัสไปที่ตารางชื่อ tbl_customer หมายถึง ข้อมูลที่อยู่ในตาราง 
tbl_customer จะถูกนำมาแสดงทั้งหมด ทั้งที่จะสัมพันธ์หรือไม่สัมพันธ์ กับตาราง
tbl_order หรือไม่ก็ตาม

// เงื่อนไข เราต้องการดึง ข้อมูล ดูว่าลูกค้าแต่ละคนในตาราง tbl_custoemr
// มีรายการสั่งซื้อสินค้า tbl_order อะไรบ้าง
SELECT
a.cus_id,a.cus_name,b.order_id,b.pro_id
FROM tbl_customer a LEFT JOIN tbl_order b
USING(cus_id)

จะเห็นว่า ลูกค้าที่มี cus_id=4 ซึ่งไม่มีรายการสั่งซื้อใดๆ เลย 
ค่าในตาราง tbl_order เท่ากับ nulll หรือค่าว่าง
ก็จะแสดงข้อมูลลูกค้า ซึ่งต่างจากการใช้งาน inner join ที่ไม่แสดงลูกค้า cus_id=4
ทั่้งนี้ก็เป็นเพราะ การใช้งาน left join จะโฟกัสไปที่ตารางด้านซ้ายนั่นเอง
// ดังนั้นการใช้งาน left join คือการดึงข้อมูลจากสองตาราง โดยโฟกัสไปที่ตารางด้านซ้าย
// จากผลลัพธ์ เนื่องจากตาราง tbl_order ไม่มีรายการสั่งซื้อของลูกค้า cus_id=4
// ผลของคำสั่ง left join จึงทำให้ค่าของข้อมูลในตาราง tbl_order เท่ากับ nulll หรือค่าว่าง
// ถ้าเปรียบเทียบ สอง ตาราง การใช้งาน left join ข้อมูลที่ได้ 
// จากตาราง A และ B คือ ตำแหน่ง A และ C หรือ 
// ก็คือตำแหน่ง A ทั้งหมด กับตำแหน่ง B บางส่วน
// นั่นก็คือข้อมูลตาราง A ต้องมีทั้งหมด ข้อมูลตาราง B จะมีเป็นบางส่วนหรือทั้งหมดก็ได้
// ขึ้นกับข้อมูล 
A
B
C






// ลองมาดูแบบ 3 ตาราง  tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
// เราโฟกัสไปที่ตาราง จากซ้าย ไปขวา ก็คือ   tbl_customer และ tbl_order 
// เงื่อนไข เราต้องการดึง ข้อมูล ดูว่าลูกค้าแต่ละคน
// มีรายการสั่งซื้อสินค้าอะไรบ้าง โดยแสดงชื่อสินค้าด้วย
// ผลที่ได้จะเหมือนกับตัวอย่างด้านบน แต่มีชื่อของสินค้า จากการเพิ่มตารางเข้ามา
SELECT
a.cus_id,a.cus_name,b.order_id,b.pro_id,c.pro_name
FROM tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
ON (a.cus_id=b.cus_id AND b.pro_id=c.pro_id)

// ดูตัวอย่างเพิ่มเติม
// เงื่อนไขคือ อยากรู้ว่า ลูกค้าแต่ละคนซื้อไปคนละกี่รายการ และมียอดสั่งซื้อคนละเท่าไหร่
SELECT
a.cus_id,a.cus_name,COUNT(b.order_id) quantity,SUM(c.pro_price) amount
FROM tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
ON (a.cus_id=b.cus_id AND b.pro_id=c.pro_id)
GROUP BY a.cus_id
ORDER BY a.cus_id

// ถ้าอยากให้รายการที่ null แสดงค่าเท่ากับ 0 ให้ใช้      
SELECT
a.cus_id,a.cus_name,COUNT(b.order_id) quantity,
IFNULL(SUM(c.pro_price),0) amount
FROM tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
ON (a.cus_id=b.cus_id AND b.pro_id=c.pro_id)
GROUP BY a.cus_id
ORDER BY a.cus_id

// ถ้าอยากให้รายการที่ null แสดงค่าเท่ากับ 0 และเป็นประเภทตัวเลข ให้ใช้
SELECT
a.cus_id,a.cus_name,COUNT(b.order_id) quantity,
IFNULL(CAST(SUM(c.pro_price) as UNSIGNED),0) amount
FROM tbl_customer a LEFT JOIN (tbl_order b,tbl_product c)
ON (a.cus_id=b.cus_id AND b.pro_id=c.pro_id)
GROUP BY a.cus_id
ORDER BY a.cus_id











เนื้อหาที่เกี่ยวข้อง



Tags:: left join sql






อย่าลืมกด Like กด Share เป็นกำลังใจ ในการสร้างบทความใหม่ๆ น่ะครับ


URL สำหรับอ้างอิง