SELECT, WHERE, ORDER BY
ประมาณ 25 นาที
เป้าหมายของบท
- เลือกและตั้งชื่อคอลัมน์ที่ต้องการด้วย SELECT
- กรองแถวด้วย WHERE (comparison, AND/OR, IN, BETWEEN, LIKE, IS NULL)
- เรียงและตัดผลลัพธ์ด้วย ORDER BY หลายคอลัมน์และ LIMIT
ดึงข้อมูลด้วย SELECT
คำสั่งพื้นฐานที่สุดของ SQL คือบอกว่า “อยากได้คอลัมน์ไหน จากตารางไหน”
SELECT product_name, price FROM products
SELECT *ดึงทุกคอลัมน์ — สะดวกตอนสำรวจข้อมูลครั้งแรก แต่ในงานจริงควรระบุคอลัมน์ที่ใช้จริงเพื่อให้ผลลัพธ์อ่านง่ายและ query เร็วขึ้น- ตั้งชื่อคอลัมน์ผลลัพธ์ใหม่ได้ด้วย
ASเช่นSELECT COUNT(*) AS n_orders
Dataset ของสายนี้มี 5 ตาราง: customers, products, orders, order_items, events (ดูรายละเอียดคอลัมน์แต่ละตารางได้จากบท “Data Analyst ทำอะไร”)
กรองแถวด้วย WHERE
WHERE เลือกเฉพาะแถวที่ตรงเงื่อนไข ตัวดำเนินการที่ใช้บ่อย:
| ตัวดำเนินการ | ความหมาย | ตัวอย่าง |
|---|---|---|
=, <>, >, <, >=, <= |
เปรียบเทียบตรงๆ | price > 1000 |
AND, OR |
รวมหลายเงื่อนไข | category='Books' AND price<500 |
IN (...) |
ตรงกับค่าใดค่าหนึ่งในลิสต์ | status IN ('cancelled','returned') |
BETWEEN a AND b |
อยู่ในช่วง (รวมขอบทั้งสองด้าน) | price BETWEEN 500 AND 1000 |
LIKE |
จับคู่รูปแบบข้อความ (% แทนตัวอักษรกี่ตัวก็ได้) |
email LIKE '%@example.com' |
IS NULL / IS NOT NULL |
เช็กว่าเป็นค่าว่างไหม | discount_pct IS NULL |
สิ่งที่มักพลาด:
- การเทียบสตริงสนใจตัวพิมพ์เล็ก-ใหญ่
'Books'กับ'books'ถือว่าต่างกัน ANDทำงานก่อนORเสมอ (เหมือน×ทำก่อน+ในเลขคณิต) ถ้าผสมกันควรใส่วงเล็บให้ชัดเจนว่าต้องการอะไร= NULLไม่มีทางเป็นจริง เพราะ NULL แปลว่า “ไม่รู้ค่า” ต้องใช้IS NULLแทน
เรียงและตัดผลลัพธ์ด้วย ORDER BY และ LIMIT
SELECT product_name, price FROM products
ORDER BY price DESC
LIMIT 5
- ค่าเริ่มต้นของ
ORDER BYคือASC(น้อยไปมาก) ใส่DESCเพื่อเรียงมากไปน้อย - เรียงได้หลายคอลัมน์:
ORDER BY a, bเรียงตามaก่อน ถ้าaเท่ากันจึงค่อยดูbเป็นตัวตัดสิน (tie-break) LIMIT nตัดผลลัพธ์เหลือnแถวแรกตามลำดับที่เรียงไว้ — ถ้าไม่มี ORDER BY ก่อน LIMIT ผลลัพธ์จะไม่แน่นอนว่าได้แถวไหนบ้าง- เวลาต้องการ “N อันดับแรก” แบบเป๊ะๆ (เช่นในแบบฝึกที่ต้องตรวจคำตอบอัตโนมัติ) ควรมีคอลัมน์ตัดสินเสมอเมื่อค่าที่เรียงอาจซ้ำกันได้ ไม่งั้นจะได้คนละแถวกันในแต่ละครั้งที่รัน
ตัวอย่างแก้โจทย์
กด "ขั้นต่อไป" ทีละขั้น ลองรันและแก้โค้ดในแต่ละขั้นได้
5 สินค้าราคาถูกที่สุดในหมวด Books
ร้านอยากรู้ว่าหมวด Books มีสินค้าอะไรบ้างที่ราคาถูก เผื่อเอาไปทำโปรโมชัน "ซื้อหนังสือราคาย่อมเยา"
ดูโครงตารางก่อน — เช็กว่า
productsมีคอลัมน์อะไรบ้าง
ออเดอร์ที่ยกเลิกหรือคืนสินค้าในเดือน มี.ค. 2025
ทีมบริการลูกค้าอยากดูออเดอร์ที่มีปัญหา (ยกเลิกหรือคืนสินค้า) ในเดือนมีนาคม 2025 เพื่อตามไปสอบถามลูกค้า
ดูค่าที่เป็นไปได้ของ status ก่อน จะได้รู้ว่าต้องกรองคำว่าอะไร
เติมช่องว่าง
แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ
หา 5 ลูกค้าล่าสุดที่สมัคร ถ้าวันที่สมัครซ้ำกัน ให้เอาคนที่ customer_id มากกว่าไว้ก่อน
เติม ___ ให้ครบ
แบบฝึกท้ายบท
บทนี้จะนับว่าเสร็จเมื่อผ่านข้อพื้นฐานและประยุกต์ครบ ข้อท้าทายได้ดาวเพิ่ม
🟢 พื้นฐาน
สินค้าหมวด Electronics ที่ราคาไม่เกิน 2000 บาท (แสดงชื่อสินค้าและราคา)
ออเดอร์ที่จ่ายด้วย promptpay และเกิดก่อนวันที่ 1 ก.พ. 2024
นับจำนวนลูกค้าที่อยู่เมือง Phuket (ตั้งชื่อคอลัมน์ว่า n_phuket)
ช่องทางสมัครสมาชิก (channel) ทั้งหมดที่มีในระบบ (ไม่ซ้ำ) เรียงตามตัวอักษร
🟡 ประยุกต์
5 ออเดอร์ที่สถานะ completed และมีส่วนลด เรียงส่วนลดจากมากไปน้อย ถ้าส่วนลดเท่ากันให้เรียง order_id จากน้อยไปมาก
สินค้าหมวด Home หรือ Sports ที่ราคาอยู่ระหว่าง 500-1000 บาท
จำนวนลูกค้าที่มาจากช่องทาง promo และสมัครในปี 2025
🔴 ท้าทาย
3 สินค้าราคาแพงที่สุดที่ไม่ใช่หมวด Electronics ถ้าราคาเท่ากันให้เรียงชื่อสินค้าจาก A ไป Z
Quiz
สรุป
- SELECT เลือกคอลัมน์ที่ต้องการ WHERE กรองแถว ORDER BY เรียงผลลัพธ์ LIMIT ตัดจำนวนแถว
- การเทียบสตริงสนใจตัวพิมพ์เล็ก-ใหญ่ และ NULL ต้องเช็กด้วย IS NULL ไม่ใช่ =
- AND ทำงานก่อน OR เสมอ ถ้าผสมกันต้องใส่วงเล็บให้ชัดเจน
คำถามสัมภาษณ์
ทำไม WHERE x = NULL ไม่เคยคืนแถวไหนเลย ต้องเขียนยังไงแทน
NULL ใน SQL แปลว่า "ไม่รู้ค่า" ไม่ใช่ค่าว่างเปล่าหรือศูนย์ การเปรียบเทียบใดๆ กับ NULL ด้วย =, <>, > ฯลฯ
จะได้ผลเป็น unknown เสมอ ไม่ใช่ true หรือ false จึงไม่มีแถวไหนผ่านเงื่อนไข WHERE x = NULL เลย
ต้องใช้ IS NULL หรือ IS NOT NULL ซึ่งเป็นตัวดำเนินการพิเศษที่ออกแบบมาสำหรับเช็ก NULL โดยเฉพาะ