ตะลุยโจทย์ประธานาธิบดี
ผมเขียนเกี่ยวกับ 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 - ตะลุยโจทย์ประธานาธิบดี
สำหรับตอนนี้เรามาลุยโจทย์ที่ผมเล่าให้ฟังเมื่อตอนที่แล้วกัน แต่ก่อนตะลุยโจทย์ก็ขอให้ทำการ Download sql แล้ว copy คำสั่งไปใส่ในเว็บ sqliteonline.com ก่อนเพื่อให้มีข้อมูลในการทำโจทย์ครับ แล้วก็ลองทำความเข้าใจแต่ละ Table โดยผมอธิบายว่าแต่ละ Table คือ Table ที่เกี่ยวข้องกับอะไร แต่ไม่ได้ลงว่ามี Column อะไรบ้าง ลองไป SELECT * ดูข้อมูลเล่นๆกันก่อนครับ พออ่านโจทย์แล้วจะได้มีไอเดีย
ADMINISTRATION
เก็บข้อมูลการขึ้นมาดำรงตำแหน่งประธานาธิบดีว่าปีนี้ใครขึ้นมาเป็นประธานาธิบดีโดยเขาเลือกตั้งทุก 4 ปี (ถ้าไม่เกิดกรณีไม่ปกติ) เขาเก็บเป็นครั้งๆเลยว่าครั้งนี้ใครเป็น
ADMIN_PR_VP
เก็บข้อมูลเกี่ยวกับว่าในสมัยนั้นใครเป็นประธานาธิบดี และ ใครเป็นรองประธานาธิบดี
ELECTION
เก็บข้อมูลเกี่ยวกับการเลือกตั้งแต่ละครั้งว่ามีใครเข้าร่วมบ้าง ผลการโหวตเป็นอย่างไร ใครชนะด้วยคะแนนโหวตเท่าไหร่
PRESIDENT
เก็บข้อมูลประธานาธิบดีท่านนั้นว่ามีอายุเท่าไหร่ อยู่พรรคไหน เกิดที่รัฐไหน
PRES_HOBBY
เก็บข้อมูลว่าประธานาธิบดีท่านนั้นมีงานอดิเรกอะไรบ้าง
PRES_MARRIAGE
เก็บข้อมูลว่าประธานาธิบดีแต่งงานกับใครบ้าง ตอนอายุเท่าไหร่ มีลูกกี่คน
STATE
เก็บข้อมูลรัฐของสหรัฐว่าเข้ามาตอนปีที่เท่าไหร่ เข้ามาอันดับที่เท่าไหร่
1. แสดงอายุของภรรยาประธานาธิบดีที่ขณะแต่งงานมีอายุน้อยที่สุด และมีอายุเท่าไหร่
อันนี้ไม่ยากเท่าไหร่ ง่ายจัดๆเลย
1 | SELECT MIN(SP_AGE) |
2. แสดงจํานวนของประธานาธิบดีที่ขณะแต่งงานมีอายุมากกว่าภรรยา 2 ปี
อันนี้อาจจะยากนิดนึงเพราะไม่เคยบอกว่ามันทำได้ แต่ถ้าลองเล่นกับการ + - * / ใน where ผมว่าทำได้ ซึ่งคำตอบก็คือ
1 | SELECT COUNT(*) |
3. หลังจากปี 1870 การเลือกตั้งครั้งใดที่มีผู้สมัครรับเลือกตั้งมากกว่า 2 คน
อันนี้ไม่ยากเลย ใช้ WHERE รวมกับ GROUP , HAVING
1 | SELECT ELECTION_YEAR |
4. แสดงรายชื่อของประธานาธิบดี จํานวนที่ดํารงตําแหน่ง สําหรับประธานาธิบดีที่ดํารงตําแหน่งนานที่สุด
อันนี้เริ่มซับซ้อนขึ้นมาละ แต่ไม่ยากเลย ก็แค่หาว่าการดำรงตำแหน่งนานที่สุดคือเท่าไหร่ แล้ว WHERE ด้วยค่านั้น ซึ่งเราเคยทำคล้ายๆแบบนี้ไปแล้ว ซึ่งนั่นคือการใช้ Sub query นั่นเอง (ส่วนใครจะใช้ ORDER BY ก็ได้นะครับ)
1 | -- ใช้ Sub query |
5. แสดงรายชื่อประธานาธิบดีที่แต่งงานอย่างน้อย 2 ครั้งและในการแต่งงานแต่ละครั้งมีบุตรอย่างน้อย 2 คน
อันนี้ก็ไม่ยากเลยใช้แค่ GROUP BY HAVINE เอาอยู่เลย
1 | SELECT PRES_NAME |
6. แสดงรายชื่อประธานาธิบดีที่ดํารงตําแหน่ง (สมัย) มากกว่าจํานวนครั้งการแต่งงาน
อันนี้เริ่ม Advance ขึ้นมาหน่อย แต่ไม่ยากครับ Sub query ช่วยเราได้
1 | SELECT * |
7. แสดงรายละเอียดของตาราง President สําหรับประธานาธิบดีที่เข้ารับตําแหน่งเป็นคนแรก หลังจากปีที่ประธานาธิบดี Reagan แต่งงานครั้งแรก
มาอันนี้ Advance หน่อย ซึ่งก็ดีเราจะได้เร้าใจกันหน่อย โจทย์ข้อนี้ผมก็อึ้งเหมือนกันว่าจะทำยังไง แต่ผมว่ามันทำได้แหละครับ อย่างแรกต้องหาก่อนว่าท่าน Regan เนี่ยแต่งงานตอนไหน แล้วไปหาว่าการเลือกตั้งหลังจากนั้นใครได้เป็นประธานาธิบดี แค่นี้เราก็จะได้คำตอบแล้ว ซึ่งวิธีของผมคือแบบนี้
1 | SELECT PRESIDENT.* -- Query นี้ก็ JOIN กันระหว่าง ADMINISTRATION กับ PRESIDENT แล้วเพื่อเอา |
8. แสดงรายชื่อประธานาธิบดีที่ไม่เคยชนะและไม่เคยแพ้การเลือกตั้ง
เฮ้ยโจทย์ข้อนี้น่าสนใจ ไม่เคยแพ้ ไม่เคยชนะ แต่มาเป็นประธานาธิบดี เออเว้ย ลองทำดูหน่อย ก็คิดง่ายๆว่าถ้าไม่เคยชนะและไม่เคยแพ้ แสดงว่าต้องไม่มีข้อมูลใน Table : ELECTION แน่นอน งั้นก็ใช้ Sub query จัดเลยดิ
1 | SELECT * |
9. แสดงชื่อรัฐ สมัยการปกครอง ปีที่เข้าร่วมเป็นรัฐหนึ่งในประเทศสหรัฐอเมริกา สําหรับรัฐที่เข้ามาในสมัยการปกครองเดียวกันแต่ต่างปีที่เข้าร่วม
เจอข้อนี้ไปผมก็ช็อกเลย ทำยังไงดีวะ แต่คร่าวๆน่าจะใช้ sub query แล้วแหละ แล้วก็ถ้าเข้ามาปีเดียวกันมันต้องมีค่าเฉลี่ยนใน Group นั้นเท่ากันใช่มะ อ้าวงี้ก็สวยดิ ผมคิดออกละ คุณล่ะครับคิดออกยัง
1 | SELECT * |
10. แสดงชื่อและปีเกิดของประธานาธิบดีผู้ที่มีจํานวนครั้งการแพ้และชนะเลือกตั้งเท่ากัน
ข้อนี้เป็นข้อสุดท้ายละครับที่จะตะลุยโจทย์กัน ซึ่งผมก็ติด Stun นานอยู่เหมือนกัน แต่จริงๆไม่ยากเท่าไหร่เลย ใช้ Correlated subquery หาก็จบนี่
1 | SELECT p1.PRES_NAME , p1.BIRTH_YR |
จบละจริงๆไม่มีตอนต่อไปเกี่ยวกับเรื่องนี้แล้ว
จริงๆมีโจทย์อีกหลายข้อเลยโดยสามารถไป Download (ตัวโจทย์นี้ผมไปเจอมาใน Internet มันเป็นภาษาไทย ผมเลยคิดว่ามันน่าจะง่ายกว่าเอาโจทย์จากสมุดที่อาจารย์ผมให้มามาโชว์) มาลองทำได้ รับรองว่าด้วยความรู้จาก 5 ตอนที่อธิบายไปสามารถเอาไปทำโจทย์ได้ทุกข้อแน่นอน
เพลงประกอบการเขียน Code
ช่วงนี้กระแส 2021 ราตรีมันดังมาก เรื่องการ Remake หรือเรียกว่า Cover ดี พอนึกถึงเพลงที่เอามาทำใหม่แล้วประทับใจคือเพลง “ค่อยค่อยพูด” เวอร์ชั่นพี่อี๊ด ที่มาเล่นในรายการตำนานหมู่สู้ฟัด ซึ่งพี่อี๊ดแกเอามาเพลงมาทำทำนองใหม่ เปลี่ยนอารมณ์เพลงใหม่หมด เล่นเอาเป็นเพลงสบายๆไปซะงั้นเลย แล้วมารู้ทีหลังด้วยว่าแกทำคนเดียว
เวอร์ชันต้นฉบับของ Y NOT 7