ทำไมไม่ใช้ SELECT * ตลอดไปเลย?
บทที่แล้วเราใช้ SELECT * ดึงทุกคอลัมน์ ซึ่งดีสำหรับ “ส่องดู” ตารางครั้งแรก แต่ในการทำงานจริงมีปัญหา
- ตารางจริงมีคอลัมน์เยอะมาก ตารางลูกค้าของบริษัทใหญ่อาจมี 100+ คอลัมน์ ถ้าดึงมาหมด จะหาข้อมูลที่ต้องการไม่เจอ
- ช้าและแพง ฐานข้อมูลบน cloud อย่าง BigQuery คิดเงินตามปริมาณข้อมูลที่อ่าน ดึงเฉพาะคอลัมน์ที่ใช้ = ประหยัดเงินบริษัทจริงๆ
- สื่อสารชัด คนที่มาอ่านโค้ดต่อจะรู้ทันทีว่าเราใช้ข้อมูลอะไรบ้าง
ถ้าหัวหน้าขอแค่ “ชื่อเมนูกับราคา” เราก็ควรดึงมาแค่สองคอลัมน์นั้น
เลือกคอลัมน์เดียว
แทนที่ * ด้วยชื่อคอลัมน์ที่ต้องการ
เลือกหลายคอลัมน์: คั่นด้วยจุลภาค
ใส่ชื่อคอลัมน์เรียงกัน แล้วคั่นแต่ละตัวด้วยเครื่องหมาย ,
ลำดับคอลัมน์ = ลำดับที่คุณเขียน
ในตาราง products คอลัมน์ product_name มาก่อน price แต่เราสลับได้ตามใจ
ผลลัพธ์จะแสดง price เป็นคอลัมน์แรก เพราะเราเขียนไว้ก่อน
จัดโค้ดให้อ่านง่าย
SQL ไม่สนใจการเว้นวรรคหรือขึ้นบรรทัดใหม่ สองแบบนี้ทำงานเหมือนกันทุกประการ
SELECT product_name, category, price, cost FROM products;
แบบที่สองอ่านง่ายกว่ามากเมื่อมีหลายคอลัมน์ คนทำงานจริงนิยม ขึ้นบรรทัดใหม่ทุกครั้งที่เริ่มคำสั่งหลัก (SELECT, FROM และคำสั่งอื่นๆ ที่จะได้เรียนต่อไป) และย่อหน้ารายการคอลัมน์เข้าไป
Comment: โน้ตที่ SQL ไม่อ่าน
ข้อความที่ขึ้นต้นด้วย -- คือ comment SQL จะข้ามไปจนจบบรรทัดนั้น ใช้เขียนอธิบายว่าโค้ดทำอะไร
Error ที่มือใหม่เจอบ่อย
1. สะกดชื่อคอลัมน์ผิด — SQL จะหาคอลัมน์นั้นไม่เจอ แต่มักใจดีแนะนำชื่อที่ใกล้เคียงให้
2. ลืมจุลภาค — อันนี้อันตรายกว่า เพราะ ไม่ error ลองรันดูแล้วสังเกตชื่อคอลัมน์ที่สอง
เราตั้งใจจะได้ 2 คอลัมน์ แต่ได้มาแค่คอลัมน์เดียว ชื่อว่า price ที่ข้างในเป็นชื่อเมนู! เพราะ SQL เข้าใจว่าเราสั่ง “เอา product_name มา แล้วตั้งชื่อใหม่ว่า price” — คุณจะได้ฝึกจับบั๊กนี้ในแบบฝึกหัดข้อสุดท้าย
ถึงตาคุณแล้ว
แบบฝึกหัดที่ 1· เมนูและราคา ทีมทำป้ายเมนูขอรายการ ชื่อเมนู และ ราคา ของทุกเมนู
ให้แสดงคอลัมน์ product_name และ price จากตาราง products (เรียงคอลัมน์ตามนี้)
แบบฝึกหัดที่ 2· รายชื่อสมาชิก ทีมการตลาดอยากส่งจดหมายขอบคุณสมาชิก ขอ ชื่อ นามสกุล และระดับสมาชิก ของลูกค้าทุกคน
แสดง first_name, last_name, member_tier จากตาราง customers
แบบฝึกหัดที่ 3· สลับลำดับคอลัมน์ ฝ่ายขยายสาขาอยากดูรายชื่อสาขา โดยให้ จังหวัดขึ้นก่อน แล้วตามด้วย ชื่อสาขา
แสดง province และ branch_name จากตาราง branches ตามลำดับนี้
แบบฝึกหัดที่ 4· จับบั๊กที่ไม่มี error เพื่อนเขียนโค้ดนี้เพื่อดู ชื่อเมนู หมวดหมู่ และราคา โค้ดรันผ่าน ไม่มี error เลย แต่ผลลัพธ์ดูแปลกๆ
กด รัน แล้วสังเกตผลลัพธ์ จากนั้นแก้ให้ได้ 3 คอลัมน์ product_name, category, price ตามที่ตั้งใจ
สรุป
SELECT คอลัมน์1, คอลัมน์2 FROM ตาราง; เลือกเฉพาะคอลัมน์ที่ต้องการ
- คั่นคอลัมน์ด้วย
, และไม่ต้องมี , หลังคอลัมน์สุดท้าย
- ลำดับคอลัมน์ในผลลัพธ์ = ลำดับที่เขียนหลัง
SELECT
- ขึ้นบรรทัดใหม่ให้อ่านง่าย และใช้
-- เขียน comment
- ดูผลลัพธ์ทุกครั้งว่าสมเหตุสมผลไหม เพราะบางบั๊กไม่มี error เตือน
บทถัดไปเราจะ กรองแถว ให้เหลือเฉพาะข้อมูลที่ต้องการ เช่น “เฉพาะเมนูหมวดชา” หรือ “เฉพาะออเดอร์จาก Grab”