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

เขียนเมื่อ 10 ปีก่อน โดย Ninenik Narkdee
sql left join

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ sql left join

ดูแล้ว 40,325 ครั้ง




ก่อนเข้าตัวอย่างการใช้งาน 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_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





   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 27-10-2020


การอ้างอิงตาราง จากเนื้อหาในบทความข้างต้น เป็นรูปแบบเก่า รองรับคำสั่งสำหรับ MySQL
สามารถปรับให้รองรับ SQL มาตรฐาน โดยแทน การใช้ comma ด้วยรูปแบบคำสั่งการ JOIN ตาราง
เป็นดังนี้แทน 
 
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


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







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

  • 18 Sep
    2014
    การใช้งาน SQL INNER JOIN  อ่าน 82,805
    ในการใช้งานฐานข้อมูล ที่ต้องเจอบ่อยๆ คือการดึงข้อมูลจากตารางหลายๆ ตาราง ม



Tags:: left join sql







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





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ