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

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

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





ก่อนเข้าตัวอย่างการใช้งาน 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  อ่าน 80,080
    ในการใช้งานฐานข้อมูล ที่ต้องเจอบ่อยๆ คือการดึงข้อมูลจากตารางหลายๆ ตาราง ม



Tags:: sql left join







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











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