ก่อนเข้าตัวอย่างการใช้งาน 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,b.order_id,b.pro_id,c.pro_name FROM tbl_customer a LEFT JOIN tbl_order b ON a.cus_id=b.cus_id LEFT JOIN tbl_product c ON 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_idSELECT 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 ON a.cus_id=b.cus_id LEFT JOIN tbl_product c ON 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_idSELECT 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 ON a.cus_id=b.cus_id LEFT JOIN tbl_product c ON 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_idSELECT 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 ON a.cus_id=b.cus_id LEFT JOIN tbl_product c ON b.pro_id=c.pro_id GROUP BY a.cus_id ORDER BY a.cus_id