JOIN
ผมเขียนเกี่ยวกับ SQL ไว้ 6 ตอน คุณสามารถกด Link ด้านล่างเพื่ออ่านที่เกี่ยวกับ SQL ตอนต่างๆได้เลย
- Basic SQL Part 1 - เริ่มต้นกับ SQL ด้วยวิธีธรรมดา ไม่ยาก ไม่ง่าย
- Basic SQL Part 2 - หาข้อมูลที่ต้องการด้วย WHERE และเรียงด้วย ORDER BY
- Basic SQL Part 3 - GROUP BY , Build in function , HAVING
- Basic SQL Part 4 - JOIN
- Basic SQL Part 5 - Sub query
- Basic SQL Part 6 - ตะลุยโจทย์ประธานาธิบดี
ตอนนี้เรามาพูดถึง KEYWORD สำคัญของ SQL ซึ่งนั่นก็คือ JOIN นั่นเอง ซึ่งนั่นทำให้เราสามารถเชื่อมต่อข้อมูลหลายๆตารางมาใช้งานร่วมกันได้
เพิ่มตารางใหม่เข้าไปใน Database
ส่วนต่อจากนี้คือการเพิ่มข้อมูลลง Database โดยจะมีข้อมูลตารางดังต่อไปนี้
- PRESIDENT เก็บข้อมูลเกี่ยวกับประธานาธิบดีท่านนั้นว่าอยู่พรรคไหน เกิดปีอะไร ชื่ออะไร ตายเมื่ออายุเท่าไหร่ เป็นคนรัฐไหน
- PRES_HOBBY เก็บข้อมูลเกี่ยวงานอดิเรกของประธานาธิบดี
- PRES_MARRIAGE เก็บข้อมูลเกี่ยวกับการแต่งงานของประธานาธิบดีว่าแต่งงานกับใคร ตอนอายุเท่าไหร่ มีลูกด้วยกันกี่คน
1 | CREATE TABLE IF NOT EXISTS PRES_HOBBY ( |
เริ่มกันเลย Join กันเลย
ขอบอกเลยว่าการ Join นั้นง่ายมากๆ ถ้าสมมุติเราอยาก Join ข้อมูลระหว่างตาราง PRESIDENT กับ PRES_HOBBY เราสามารถเขียนคำสั่ง SQL ได้ดังนี้
1 | SELECT * |
ซึ่งผลลัพธ์ที่ได้จะประมาณนี้
ซึ่งถ้าคุณสังเกตดีๆจะพบว่า PRES_NAME ที่แสดงชื่อมันไม่ตรงกัน ซึ่งมันเริ่มแปลกๆแล้วใช่ไหม ถ้าคุณลอง count(*) ตาราง PRESIDENT , ตาราง PRES_HOBBY และ การ JOIN ระหว่างตาราง PRESIDENT กับ PRES_HOBBY มันจะได้ผลลัพธ์ดังนี้
1 | SELECT COUNT(*) -- 39 |
หากสังเกตดีๆจะพบว่า 2301 = 39 x 59 นั่นเอง แปลว่าการ JOIN แบบนี้คือการเอาแต่ละ ROW ของ 2 TABLE มาเชื่อมกันทั้งหมดจึงเกิดทุกความเป็นไปได้ขึ้นมา
อ้าวแล้วถ้าอยาก JOIN เฉพาะข้อมูลที่ถูกต้องล่ะทำยังไง คำตอบไม่ยากครับ เราต้องมีเงื่อนไขการ JOIN ครับ ซึ่งมันไม่ยากเลย หากเราดูข้อมูลทั้ง 2 TABLE จะพบว่า COLUMN : PRES_NAME เนี่ยแหละเป็นตัวบอกว่าต้องเอา ROW นี้ของ Table PRESIDENT ควรไปต่อกับ ROW นี้ของ Table PRES_HOBBY ดังนั้นเราจึงสามารถเพิ่มเงื่อนไขเข้าไปตรง WHERE แบบนี้
1 | SELECT * |
คราวนี้จะมีคำถามว่าอ้าวแล้วจะรู้ได้ไงว่าจะเอา COLUMN ไหนไป WHERE กับ COLUMN ไหนนั้น จริงๆคนที่เก็บข้อมูลเขาจะทำสิ่งที่เรียกว่า Relation ไว้ใน Database บอกว่า Table นี้กับ Table นี้มี Column ไหนที่ใช้ JOIN กันได้ หรือถ้าเขาไม่เขียนใน Database เขาจะเขียนไว้ใน Manual ของการเก็บข้อมูลนี้ว่า JOIN กันด้วย COLUMN ไหนกับ COLUMN ไหน หรือ แบบแย่สุดคือเขาจะไม่มี MANUAL เราต้องไปดูเองแต่โดยปกติเขาจะตั้งชื่อ COLUMN ที่ JOIN กันได้เป็นชื่อเดียวกัน เพื่อให้เราพอเดาได้ว่า COLUMN นี้กับ COLUMN นี้ JOIN กันได้
ต่อมา ถ้าอยากรู้ว่าเพิ่มว่า ประธานาธิบดีคนไหนชอบตีกอล์ฟและอยู่พรรค Republican บ้างก็สามารถหาได้ด้วยคำสั่ง
1 | SELECT * |
แต่พอเรามาดูจะเห็นว่า WHERE มันเริ่มเยอะและเริ่มงงว่า WHERE ไหนใช้เพื่อการ JOIN WHERE ไหนใช้เพื่อเป็นเงื่อนไขในการค้นหา เพื่อให้ง่ายแก่การเขียนจึงมี KEYWORD เพื่อใช้ง่ายต่อการ JOIN ขึ้นมานั่นคือ JOIN และ ON โดยจาก SQL ตัวที่แล้วเราสามารถเปลี่ยนเป็น SQL ดังนี้
1 | SELECT * |
คำถามต่อมาถ้า JOIN มากกว่า 2 ตารางล่ะ ทำได้ไหม คำตอบคือได้ครับ เดี๋ยวเราจะ JOIN ทั้ง 3 table เลยคือ PRESIDENT, PRES_MARRIAGE, PRES_HOBBY
1 | SELECT * |
ชนิดการ JOIN
คราวนี้เรามาดูชนิดของการ JOIN กันครับ โดยเราจะมาดูวิธีการทำงานของมันกัน โดยเราจะ JOIN 2 Table เข้าด้วยกันคือ PRESIDENT กับ PRES_MARRIAGE โดยใช้เงื่อนไขการ JOIN คือ PRESNAME
INNER JOIN
INNER JOIN ก็คือเอาผลลัพธ์เฉพาะที่ JOIN กันได้เท่านั้น
1 | SELECT * |
การทำงานก็จะดังภาพคือไล่ทีละ ROW ของตาราง PRESIDENT ไปหาคู่ JOIN ที่ ROW ในตาราง PRES_MARRIAGE ถ้าเจอก็เอาข้อมูลมาต่อกันเป็นผลลัพธ์ด้านล่างจะเห็นว่าจะไม่มีผลลัพธ์ของ ROW : “Buchanan J” จากตาราง PRESIDENT
LEFT JOIN
LEFT JOIN เอาทางซ้ายหมด กับ ที่ JOIN ติด
เอาตารางทางซ้ายไปไล่ JOIN ถ้า JOIN ติดก็เอาผลลัพธ์ที่ JOIN ติด ถ้า JOIN ไม่ติดเอาข้อมูลจากตารางที่อยู่ทางซ้ายมาส่วนข้อมูลที่ JOIN ไม่ติดให้ใส่ค่า NULL ไปแทน ตัวอย่างจะเป็นดังภาพ
1 | SELECT * |
จะเห็นว่า ROW : “Buchanan J” จะโผล่มาในผลลัพธ์ด้วยแต่ข้อมูลเป็นมาจากตาราง PRES_MARIAGE เป็นค่า NULL หมด
RIGHT JOIN (ตัว WEB ไม่ Support นะครับ แต่จริงๆสลับไปใช้ LEFT JOIN ก็ได้)
RIGHT JOIN เอาทางขวาทั้งหมด กับ ที่ JOIN ติด
อันนี้คล้ายๆกับ LEFT JOIN เลย แต่เปลี่ยนเป็นเอาทางขวาหมด อันไหนที่ JOIN ไม่ติดที่อยู่กับตารางทางซ้ายจะมีค่าเป็น NULL
1 | SELECT * |
จะเห็น ROW ที่ JOIN ไม่ติด ข้อมูลตารางที่อยู่ด้านซ้ายจะมีค่าเป็น NULL
FULL JOIN (ตัว WEB ไม่ Support นะครับ)
1 | SELECT * |
FULL JOIN เอาทั้งซ้าย ทั้งขวา และที่ JOIN ติด
อันนี้คือเอาทั้งหมดเลยสมชื่อ FULL ผลลัพธ์ก็จะได้ดังภาพ
สรุปเกี่ยวกับ Type การ JOIN
สำหรับเรื่อง Type การ JOIN อาจจะมีหลายอันแต่จริงๆเวลาทำงานผมเคยใช้อยู่แค่ 2 TYPE คือ INNER JOIN กับ LEFT JOIN เท่านั้น RIGHT JOIN นี่ไม่เคยคิดจะใช้เพราะว่ามันแค่สลับตารางขึ้นก่อนก็เป็น LEFT JOIN ละ เลยไม่มีเหตุผลที่จะต้องใช้ ส่วน FULL JOIN นี่ยิ่งแล้วใหญ่ไม่เคยมีงานไหนที่ต้องการผลลัพธ์แบบนั้นเลย
แล้วเราจะใช้ LEFT JOIN ตอนไหนล่ะ จริงๆมันจะมีโจทย์บางอย่างที่ต้องการข้อมูลของตารางซ้ายทั้งหมด ส่วนตารางขวาเป็นข้อมูลประกอบ ไม่มีก็ให้แสดง NULL ได้ เช่น แสดงข้อมูลประธานาธิบดี และ ภรรยาทั้งหมดก็จะได้ SQL ประมาณนี้
1 | SELECT PRESIDENT.PRESIDENT, PRES_MARRIAGE.SPOUSE_NAME |
จบเรื่อง JOIN
สำหรับตอนนี้เราก็ได้เรียนรู้เกี่ยวกับการ JOIN ระหว่างตารางกันไปแล้วนะครับ จะเห็นว่าไม่ยากเลย ถ้าเข้าใจ Concept ตรงนี้จะ JOIN กี่ตารางก็ทำได้เลยครับ สำหรับตอนนี้ขอจบเพียงเท่านี้ สวัสดีครับ
เพลงประกอบการเขียน Blog
เพลงที่โคตรเก่าแต่เนื้อเพลงนี่อย่างโดน ตอนฟังครั้งแรก นี่แบบอะไรวะ พอมีประสบการณ์ชอบคนมีแฟนแล้วนี่เข้าใจเพลงนี้เลย คือแบบ “หมาคาบไปแดก” จริงๆ คือทั้งเพลงคือความคิดของเราเลยแบบ ฝันให้เขาเลิกกัน ให้ผู้ชายนอกใจ เขาจะได้โสด แต่แม่งแค่ฝันไง เขารักกันจะตายห่า จะแต่งงานกันอยู่ละ