SELECT + WHERE
ดึงข้อมูลออกมาดู กรองด้วย AND/OR/IN/LIKE/BETWEEN, ใช้ DISTINCT เอาค่าไม่ซ้ำ และระวัง NULL trap (= NULL ไม่เวิร์ก ต้องใช้ IS NULL)
Database ของ Vibe Mart มีลูกค้าเป็นพัน คำสั่งซื้อเป็นหมื่น ถ้าดึงออกมาทีเดียวคงไม่ไหว เราต้องเลือกเฉพาะที่อยากเห็น คำสั่งที่ทำหน้าที่นี้คือ SELECT คู่กับ WHERE ซึ่งเป็นคู่ที่ใช้บ่อยที่สุดในงานจริง
โครงสร้างพื้นฐาน
SELECT column1, column2
FROM table_name
WHERE condition;3 บรรทัดนี้คือพื้นฐานของทุก query SELECT บอกว่าจะเอา column ไหน FROM บอกว่ามาจากตารางไหน ส่วน WHERE เป็นตัวกรองว่าจะเอา row ที่เข้าเงื่อนไขอะไรบ้าง ถ้าอยากได้ทุก column ก็ใช้ SELECT * ได้ แต่ในงานจริงควรระบุ column ที่ต้องการ เพราะเร็วกว่า และไม่ดึงข้อมูลเกินจำเป็น
WHERE ทำงานที่ database ไม่ใช่ที่ frontend
คนเริ่มต้นมักเขียนแบบนี้ ดึงทุก row ออกมาก่อน แล้วค่อยใช้ .filter() ใน JavaScript คัดอีกที ฟังดูตรงไปตรงมา แต่ถ้า Vibe Mart มีลูกค้าแสนคน database ก็จะส่งข้อมูลกลับมาเป็นแสน row network ใช้เวลาโอนเป็นนาที พอ JS filter เสร็จเหลือจริงแค่ 5 row เท่ากับเสียเวลาเปล่ามหาศาล
ถ้าใส่ WHERE ตั้งแต่ต้น database จะคัดเหลือ 5 row ก่อนส่งกลับ network ใช้เวลาแค่ ms กฎคือ กรองให้แคบที่สุดที่ database ก่อน แล้วค่อยให้ frontend จัดรูปแบบ
ลองเปลี่ยนเงื่อนไข ดูว่า row ไหนผ่าน
เลื่อน column และ operator ดูว่า row ไหนเข้าเงื่อนไข row ที่ไม่เข้าจะจางลงให้เห็นชัดๆ และดู SQL ที่ระบบสร้างขึ้นด้านบนได้ด้วย
SELECT id, name, city, signup_date FROM users WHERE city = 'กรุงเทพ';
| id | name | city | signup_date |
|---|---|---|---|
| 1 | ปอนด์ | กรุงเทพ | 2024-01-12 |
| 2 | น้ำเพชร | เชียงใหม่ | 2024-02-03 |
| 3 | เอิร์น | กรุงเทพ | 2024-02-18 |
| 4 | มาย | ขอนแก่น | 2024-03-05 |
| 5 | ฟิวส์ | ภูเก็ต | 2024-03-22 |
| 6 | กิ๊ฟ | เชียงใหม่ | 2024-04-09 |
| 7 | โบ๊ต | กรุงเทพ | 2024-05-14 |
| 8 | ใบหม่อน | สงขลา | 2024-06-01 |
| 9 | แตงโม | กรุงเทพ | 2024-07-20 |
| 10 | ก้อย | NULL | 2024-08-08 |
| 11 | ปลื้ม | ขอนแก่น | 2024-09-15 |
| 12 | ภูมิ | เชียงใหม่ | 2024-10-30 |
Operator ที่เจอบ่อย
=,!=,<,>,<=,>=ใช้เปรียบเทียบค่าAND,OR,NOTใช้ผสมเงื่อนไขหลายอันเข้าด้วยกันIN (a, b, c)ใช้เช็คว่าค่าอยู่ในชุดที่กำหนดไหม เช่นstatus IN ('paid', 'shipped')BETWEEN a AND bเช็คว่าอยู่ในช่วง โดยรวมปลายทั้งสองข้างด้วยLIKE 'น%'เปรียบเทียบ string ด้วย pattern โดย%หมายถึงตัวอักษรกี่ตัวก็ได้ ส่วน_หมายถึงตัวเดียว
NULL ไม่ใช่ค่า แต่เป็น "ไม่มีค่า" การเปรียบเทียบกับ NULL ด้วย = ให้ผลเป็น unknown เสมอ ซึ่งไม่ใช่ true จึงไม่มี row ผ่านเงื่อนไข
ใช้ IS NULL หรือ IS NOT NULL เป็น operator พิเศษสำหรับเช็ค NULL โดยเฉพาะ
DISTINCT เอาเฉพาะค่าที่ไม่ซ้ำ
บางครั้งอยากรู้ว่า Vibe Mart มีลูกค้าอยู่กี่จังหวัด ถ้าเขียน SELECT city FROM users เฉยๆ จะได้ทุก row รวมที่ city ซ้ำกัน ใส่ DISTINCT ก่อน column เพื่อให้เหลือเฉพาะค่าที่ไม่ซ้ำ
SELECT DISTINCT city FROM users;ได้ทุก row ทั้งหมด 12 รายการ รวมที่ซ้ำกัน
เหลือเฉพาะค่าที่ไม่ซ้ำ 6 ค่า (5 จังหวัด + 1 NULL)
Playground ลองเขียน query เอง
Playground ด้านล่างเป็น SQL จริงที่รันบน Vibe Mart database (SQLite ที่อยู่ใน browser) ลองคลิก suggestion หรือพิมพ์เอง กด Cmd/Ctrl + Enter เพื่อรัน
สรุปบทนี้
SELECT col FROM table WHERE conditionคือพื้นฐานของทุก queryWHEREทำงานที่ database คัดให้แคบที่สุดก่อนส่งกลับ- AND/OR/IN/LIKE/BETWEEN ใช้รวมเป็นเงื่อนไขซับซ้อนได้
- NULL ต้องใช้
IS NULLห้ามใช้= NULLเด็ดขาด SELECT DISTINCT colใช้เอาเฉพาะค่าที่ไม่ซ้ำของ column นั้น- บทถัดไปจะเรียงผลลัพธ์ และเอาแค่ N อันแรก