ในการใช้งานฐานข้อมูล ที่ต้องเจอบ่อยๆ คือการดึงข้อมูลจากตารางหลายๆ ตาราง
มาแสดง ภายใต้เงื่อนไขความสัมพันธ์ของข้อมูลในตารางนั้น
ตัวอย่างต่อไปนี้ เป็นแนวทาง เพื่อให้เข้าใจ การใช้งาน คำสั่ง 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_idSELECT 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_idSELECT 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_idSELECT 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_idSELECT 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_idSELECT 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
แบบนี้เป็นต้น รายละเอียดจะนำเสนอในลำดับต่อไป