Data Analyst › SQL

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 มีสินค้าอะไรบ้างที่ราคาถูก เผื่อเอาไปทำโปรโมชัน "ซื้อหนังสือราคาย่อมเยา"

  1. ดูโครงตารางก่อน — เช็กว่า products มีคอลัมน์อะไรบ้าง

    SQL

ออเดอร์ที่ยกเลิกหรือคืนสินค้าในเดือน มี.ค. 2025

ทีมบริการลูกค้าอยากดูออเดอร์ที่มีปัญหา (ยกเลิกหรือคืนสินค้า) ในเดือนมีนาคม 2025 เพื่อตามไปสอบถามลูกค้า

  1. ดูค่าที่เป็นไปได้ของ status ก่อน จะได้รู้ว่าต้องกรองคำว่าอะไร

    SQL

เติมช่องว่าง

แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ

ยังไม่ได้ทำ

หา 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

1. BETWEEN 5 AND 10 นับค่า 5 และ 10 เองด้วยไหม
2. WHERE discount_pct = NULL ใช้หาแถวที่ไม่มีส่วนลดได้ไหม
3. ORDER BY a, b เรียงลำดับยังไง

สรุป

  • 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 โดยเฉพาะ