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

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

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

ดูแล้ว 82,805 ครั้ง




ในการใช้งานฐานข้อมูล ที่ต้องเจอบ่อยๆ คือการดึงข้อมูลจากตารางหลายๆ ตาราง
มาแสดง ภายใต้เงื่อนไขความสัมพันธ์ของข้อมูลในตารางนั้น
ตัวอย่างต่อไปนี้ เป็นแนวทาง เพื่อให้เข้าใจ การใช้งาน คำสั่ง sql อย่างง่าย
เกี่ยวกับการดึงข้อมูล จากตาราง หลายๆ ตารางมาแสดง
 

ตารางทดสอบ เรามีตารางสำหรับทดสอบ อยู่ 3 ตาราง ตามข้อมูล ด้านล่าง

tbl_order
tbl_customer
tbl_product
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
cus_id cus_name
1 Cus A
2 Cus B
3 Cus C
4 Cus D
5 Cus E
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
// คำสั่ง sql นี้ เป็นรูปแบบการดึงข้อมูลจากตาราง แบบที่ไม่ได้ใช้  inner join
// เราต้องการดูความสัมพันธ์ของตาราง tbl_order และ tbl_product
// เงื่อนไขคือ อยากรู้ว่า รายการสั่งซื้อ มีสินค้าชื่ออะไรบ้าง
SELECT
a.order_id,b.pro_id,b.pro_name
FROM tbl_order a, tbl_product b
WHERE a.pro_id=b.pro_id
ORDER BY a.order_id 

// คำสั่ง sql นี้ เป็นรูปแบบการดึงข้อมูลจากตาราง แบบที่ใช้  inner join
// เราต้องการดูความสัมพันธ์ของตาราง tbl_order และ tbl_product
// เงื่อนไขคือ อยากรู้ว่า รายการสั่งซื้อ มีสินค้าชื่ออะไรบ้าง (ผลที่ได้เหมือนตัวอย่างแรก)
SELECT
a.order_id,b.pro_id,b.pro_name
FROM tbl_order a 
INNER JOIN tbl_product b ON a.pro_id=b.pro_id
ORDER BY a.order_id

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






// ทีนี้มาดูว่า ถ้าต้องการใช้ inner join มากกว่า สอง ตาราง ต้องทำยังไง
// เราต้องการดูความสัมพันธ์ของตาราง tbl_order , tbl_customer และ tbl_product
// เงื่อนไขคือ อยากรู้ว่า รายการสั่งซื้อ มีลูกค้าชื่อว่าอะไรและมีสินค้าชื่ออะไรบ้าง
SELECT
a.order_id,c.cus_id,b.pro_id,c.cus_name,b.pro_name
FROM tbl_order a INNER JOIN (tbl_product b,tbl_customer c)
ON (a.pro_id=b.pro_id AND a.cus_id=c.cus_id)
ORDER BY a.order_id

SELECT
a.order_id,c.cus_id,b.pro_id,c.cus_name,b.pro_name
FROM tbl_order a 
INNER JOIN tbl_product b ON a.pro_id=b.pro_id 
INNER JOIN tbl_customer c ON a.cus_id=c.cus_id 
ORDER BY a.order_id

// เงื่อนไขถ้า อยากรู้ว่า รายการสั่งซื้อของลูกค้า cus_id = 5 มีอะไรบ้าง
SELECT
a.order_id,c.cus_id,b.pro_id,c.cus_name,b.pro_name
FROM tbl_order a INNER JOIN (tbl_product b,tbl_customer c)
ON (a.pro_id=b.pro_id AND a.cus_id=c.cus_id)
WHERE a.cus_id=5 
ORDER BY a.order_id

SELECT
a.order_id,c.cus_id,b.pro_id,c.cus_name,b.pro_name
FROM tbl_order a 
INNER JOIN tbl_product b ON a.pro_id=b.pro_id 
INNER JOIN tbl_customer c ON a.cus_id=c.cus_id 
WHERE a.cus_id=5 
ORDER BY a.order_id

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

SELECT
c.cus_id,c.cus_name,SUM(b.pro_price) amount
FROM tbl_order a 
INNER JOIN tbl_product b ON a.pro_id=b.pro_id 
INNER JOIN tbl_customer c ON a.cus_id=c.cus_id 
GROUP BY c.cus_id 
ORDER BY c.cus_id

// เงื่อนไขถ้า อยากรู้ว่า ลูกค้าคนไหน มียอดสั่งซื้อตั้งแต่ 1000 บาทขึ้นไป
SELECT
c.cus_id,c.cus_name,SUM(b.pro_price) amount
FROM tbl_order a INNER JOIN (tbl_product b,tbl_customer c)
ON (a.pro_id=b.pro_id AND a.cus_id=c.cus_id)
GROUP BY c.cus_id 
HAVING  SUM(b.pro_price)>=1000
ORDER BY c.cus_id

SELECT
c.cus_id,c.cus_name,SUM(b.pro_price) amount
FROM tbl_order a 
INNER JOIN tbl_product b ON a.pro_id=b.pro_id 
INNER JOIN tbl_customer c ON a.cus_id=c.cus_id 
GROUP BY c.cus_id 
HAVING  SUM(b.pro_price)>=1000
ORDER BY c.cus_id

// เงื่อนไขถ้า อยากรู้ว่า สินค้าแต่ละรายการขายได้จำนวนเท่าไหร่
SELECT
b.pro_id,b.pro_name,COUNT(a.order_id) quantity
FROM tbl_order a INNER JOIN (tbl_product b,tbl_customer c)
ON (a.pro_id=b.pro_id AND a.cus_id=c.cus_id)
GROUP BY b.pro_id
ORDER BY b.pro_id

SELECT
b.pro_id,b.pro_name,COUNT(a.order_id) quantity
FROM tbl_order a 
INNER JOIN tbl_product b ON a.pro_id=b.pro_id 
INNER JOIN tbl_customer c ON a.cus_id=c.cus_id 
GROUP BY b.pro_id
ORDER BY b.pro_id



จากรูปแบบการใช้งานข้างต้น เราจะเห็นว่า cus_id = 4 หรือ ลูกค้าที่ชื่อ Cus 4
จะไม่มีข้อมูลใดๆ เลยในกรณีการใช้งาน inner join
เช่นเดียวกับ สินค้า pro_id = 1 หรือ สินค้าชื่อ Pro 111 ก็จะไม่มีข้อมูลแสดงเช่นกัน
ซึ่งหากเราไม่สนใจ รายการที่ไม่มีข้อมูล การใช้ inner join ก็เป็นวิธีที่เหมาะสม
 
แต่ถ้าเราต้องการรู้ว่า คนไหน ไม่มีรายการสั่งซื้อเลย หรือเท่ากับ 0
หรือ อยากรู้ว่า สินค้าไหน ไม่มีคนสั่งซื้อเลย แบบนี้เป็นต้น เราจะต้องใช้รูป
แบบการ join table รูปแบบอื่นแทน ยกตัวอย่างเช่นใช้ LEFT JOIN ,RIGHT JOIN 
แบบนี้เป็นต้น รายละเอียดจะนำเสนอในลำดับต่อไป



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


การอ้างอิงตาราง จากเนื้อหาในบทความข้างต้น เป็นรูปแบบเก่า รองรับคำสั่งสำหรับ MySQL
สามารถปรับให้รองรับ SQL มาตรฐาน โดยแทน การใช้ comma ด้วยรูปแบบคำสั่งการ JOIN ตาราง
เป็นดังนี้แทน 
 
SELECT
a.order_id,c.cus_id,b.pro_id,c.cus_name,b.pro_name
FROM tbl_order a INNER JOIN (tbl_product b,tbl_customer c)
ON (a.pro_id=b.pro_id AND a.cus_id=c.cus_id)
ORDER BY a.order_id
 
แบบมาตรฐาน
 
SELECT
a.order_id,c.cus_id,b.pro_id,c.cus_name,b.pro_name
FROM tbl_order a 
INNER JOIN tbl_product b ON a.pro_id=b.pro_id 
INNER JOIN tbl_customer c ON a.cus_id=c.cus_id
ORDER BY a.order_id


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







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

  • 19 Sep
    2014
    การใช้งาน SQL LEFT JOIN  อ่าน 40,324
    ก่อนเข้าตัวอย่างการใช้งาน LEFT JOIN มาดูรูปแบบของ join condition ทั้งสอง



Tags:: inner join sql







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





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

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


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


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







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