จากทั้งหมด สู่เฉพาะที่ต้องการ
ตาราง orders มี 4,200 แถว แต่คำถามในงานจริงมักเจาะจงกว่านั้น เช่น
- “ขอดูเฉพาะออเดอร์จาก Grab”
- “เมนูไหนบ้างที่ราคา เกิน 70 บาท”
- “ลูกค้าที่สมัครสมาชิก หลังเดือนมิถุนายน”
ถ้าคุณเคยใช้ปุ่ม Filter ใน Excel — WHERE คือสิ่งเดียวกันในภาษา SQL
หน้าตาของ WHERE
WHERE เขียนต่อจาก FROM แล้วตามด้วย เงื่อนไข แถวไหนเงื่อนไขเป็นจริง จะถูกเก็บไว้ แถวไหนไม่จริง จะถูกตัดทิ้ง
อ่านว่า “เลือกชื่อเมนู หมวด และราคา จากตาราง products เฉพาะแถวที่ category เท่ากับ coffee” — ได้ 8 เมนู
ลองเปลี่ยน 'coffee' เป็น 'bakery' แล้วรันใหม่ดู
ตัวดำเนินการเปรียบเทียบ
| เครื่องหมาย | ความหมาย | ตัวอย่าง |
|---|
= | เท่ากับ | category = 'tea' |
<> หรือ != | ไม่เท่ากับ | channel <> 'store' |
> | มากกว่า | price > 70 |
< | น้อยกว่า | price < 50 |
>= | มากกว่าหรือเท่ากับ | seats >= 50 |
<= | น้อยกว่าหรือเท่ากับ | price <= 45 |
ลองหาเมนูราคาถูกกว่า 50 บาท
และลองดูออเดอร์ที่ ไม่ได้ สั่งหน้าร้าน (สั่งผ่านแอป) — มีหลายร้อยแถว ลองเลื่อนดู
ข้อความต้องมี ' แต่ตัวเลขไม่ต้อง
นี่คือกฎที่สำคัญที่สุดของบทนี้
ทำไม? เพราะถ้าไม่มี ' SQL จะคิดว่า tea คือ ชื่อคอลัมน์ แล้วหาไม่เจอ ลองรันดู
ข้อความภาษาไทยก็ใช้ได้เหมือนกัน
กรองด้วยวันที่
วันที่เขียนเป็นข้อความรูปแบบ 'ปี-เดือน-วัน' (ค.ศ.) แล้วเทียบได้เหมือนตัวเลข — วันที่ก่อนหน้าถือว่า “น้อยกว่า”
ลำดับการเขียนต้องเป๊ะ
คำสั่งใน SQL ต้องเรียงตามลำดับนี้เสมอ ถ้าสลับจะ error
SELECT ... -- 1. เอาคอลัมน์อะไร
FROM ... -- 2. จากตารางไหน
WHERE ...; -- 3. เฉพาะแถวแบบไหน
ถึงตาคุณแล้ว
แบบฝึกหัดที่ 1· เมนูหมวดชา ร้านกำลังจะจัดโปรโมชัน “เทศกาลชา” ขอรายการ ชื่อเมนูและราคา เฉพาะเมนูที่อยู่ในหมวด tea
แสดง product_name และ price จากตาราง products เฉพาะแถวที่ category เป็น tea
แบบฝึกหัดที่ 2· เมนูพรีเมียม ผู้จัดการอยากรู้ว่ามีเมนูไหนบ้างที่ราคา ตั้งแต่ 80 บาทขึ้นไป
แสดง product_name และ price ของเมนูที่ price มากกว่าหรือเท่ากับ 80
แบบฝึกหัดที่ 3· สมาชิกระดับ Platinum ทีม CRM จะส่งของขวัญให้สมาชิกระดับสูงสุด ขอ ชื่อ นามสกุล และจังหวัด ของลูกค้าที่ member_tier เป็น platinum
แบบฝึกหัดที่ 4· สาขารุ่นแรก บริษัทจะทำวิดีโอครบรอบ อยากเชิญพนักงานจากสาขาที่เปิด ก่อนปี 2021 (คือก่อนวันที่ 1 มกราคม 2021)
แสดง branch_name และ opened_date ของสาขาเหล่านั้น
แบบฝึกหัดที่ 5· ออเดอร์ที่ถูกยกเลิก ฝ่ายปฏิบัติการอยากตรวจสอบออเดอร์ที่ ถูกยกเลิก ขอเลขที่ออเดอร์ วันเวลา และยอดเงิน
แสดง order_id, order_date, total_amount จากตาราง orders ที่ status เป็น cancelled
สรุป
WHERE เงื่อนไข เก็บเฉพาะแถวที่เงื่อนไขเป็นจริง
- ตัวดำเนินการ:
=, <>, >, <, >=, <=
- ข้อความต้องมี
'...' ตัวเลขไม่ต้อง และข้อความแยกตัวพิมพ์เล็ก-ใหญ่
- วันที่เขียน
'YYYY-MM-DD' และเทียบได้เหมือนตัวเลข
- ลำดับ:
SELECT → FROM → WHERE
บทถัดไปเราจะ เรียงลำดับ ผลลัพธ์ และเลือกมาแค่ “Top 5” เพื่อตอบคำถามอย่าง “ออเดอร์ไหนยอดสูงที่สุด”