ก่อนเข้าตัวอย่างการใช้งาน LEFT JOIN มาดูรูปแบบของ join condition ทั้งสอง
รูปแบบกันก่อน
1 2 3 | ON conditional_expr และ USING (column_list) |
ON ใช้เปรียบเทียบ column แบบทั่วไป โดยชื่อ column จะเป็นชื่อเดียวกันหรือคนละ
ชื่อก็ได้ เช่น
1 2 3 4 | 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)
1 2 3 4 5 | 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 ตามความเข้าใจก็คือ การโฟกัสไปที่ตารางด้านซ้าย
1 | FROM tbl_customer a LEFT JOIN tbl_order b |
แบบนี้คือโฟกัสไปที่ตารางชื่อ tbl_customer
หมายเหตุ เผื่อใคร ไม่เข้าใจว่า a กับ b ที่ต่อท้ายชื่อตารางหมายถึงอะไร
ตัว a กับ b ใช้สำหรับเป็นชื่ออ้างอิงตาราง เรากำหนดเป็นตัวอะไรอักษร หรือคำ
ใดก็ได้ ตามความเหมาะสมและเข้าใจ เวลาเราเขียนคำสั่ง query เรียกดูข้อมูล
column ต่าง ๆ จะได้เขียนย่อ หรือเขียนสั้นลงกว่าเดิม
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //จาก 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_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 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_id
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 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_id
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 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