0Pricing
Coding Interview Prep · บทเรียน

BETWEEN, IN และขอบเขตแบบรวมปลาย

กรณีขอบเขตที่ต้องระวัง และวิธีที่ BETWEEN จัดการกับค่าปลายขอบเขต

BETWEEN, IN และขอบเขตแบบรวมปลาย เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดขอบเขตช่วงจึงทำให้ผู้สมัครเสียคะแนน

ตัวกรองช่วงและตัวกรองเซตดูเป็นเรื่องง่าย ผู้สัมภาษณ์จึงมักใช้กรณีขอบเป็นกับดัก BETWEEN รวมขอบเขตทั้งสองด้าน IN ซ่อนกับดัก NULL ที่ละเอียดอ่อน และช่วงวันที่คือจุดที่ข้อผิดพลาดเกินหรือขาดหนึ่งทำให้รายงานคลาดเคลื่อนโดยไม่รู้ตัว

บทเรียนนี้อธิบายอย่างละเอียดว่า BETWEEN จัดการกับขอบเขตอย่างไร เมื่อใด IN อ่านง่ายกว่าการต่อ OR และรูปแบบช่วงเปิดด้านหนึ่งที่มืออาชีพใช้กับวันที่

BETWEEN รวมขอบเขตทั้งสองด้าน

col BETWEEN a AND b เป็นรูปย่อของ col >= a AND col <= b ขอบเขตทั้งสองด้านถูกรวมอยู่ด้วย

ดังนั้น price BETWEEN 10 AND 20 จึงส่งคืนแถวที่ราคาตรงกับ 10 หรือ 20 พอดี รวมถึงค่าทั้งหมดที่อยู่ระหว่างนั้นด้วย คำตอบที่ผิดพลาดบ่อยที่สุดในการสัมภาษณ์คือการบอกว่าขอบเขตบนไม่ถูกรวม

SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;
-- equivalent to: price >= 10 AND price <= 20

ลำดับอาร์กิวเมนต์มีความสำคัญ

BETWEEN ต้องรับค่าขอบเขตล่างก่อน col BETWEEN 20 AND 10 จะขยายเป็น col >= 20 AND col <= 10 ซึ่งไม่มีทางเป็นจริง จึงส่งคืน ไม่มีแถว แทนที่จะเกิดข้อผิดพลาด

นี่เป็นกับดักยอดนิยม: คำสั่งทำงานได้อย่างเรียบร้อยแต่ไม่ส่งคืนอะไรเลย และผู้สมัครก็คิดว่าข้อมูลว่างเปล่า ควรใส่ขอบเขตที่มีค่าน้อยกว่าก่อนเสมอ

SELECT *
FROM products
WHERE price BETWEEN 20 AND 10;
-- returns NOTHING, not an error

ปัญหาเกินหรือขาดหนึ่งในช่วงวันที่

เมื่อขอ ข้อมูลทั้งหมดของเดือนมกราคม ผู้สมัครจำนวนมากจะเขียน order_date BETWEEN '2024-01-01' AND '2024-01-31' หาก order_date เป็นค่าประทับเวลา คำสั่งนี้จะ ตัดข้อมูลทั้งหมดหลังเที่ยงคืนของวันที่ 31 ออก เพราะ 2024-01-31 หมายถึง 2024-01-31 00:00:00

คำสั่งซื้อเวลา 14.00 น. ของวันที่ 31 มกราคมจะถูกตัดออก หากใช้คอลัมน์ DATE ล้วน คำสั่งนี้จะทำงานได้ แต่คุณไม่สามารถสมมติชนิดข้อมูลได้

SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- silently excludes Jan 31 afternoon if order_date is a timestamp

วิธีแก้ด้วยช่วงเปิดด้านหนึ่ง

รูปแบบแบบมืออาชีพสำหรับวันที่คือ ช่วงเปิดด้านหนึ่ง: มากกว่าหรือเท่ากับจุดเริ่มต้น และน้อยกว่าช่วงเวลาถัดไปอย่างเคร่งครัด วิธีนี้ถูกต้องทั้งกับ DATE และ TIMESTAMP และไม่จำเป็นต้องรู้ความละเอียดด้านเวลาของคอลัมน์

สังเกตว่าขอบเขตบนคือวันแรกของเดือนกุมภาพันธ์ ไม่ใช่วันสุดท้ายของเดือนมกราคม วิธีนี้จึงครอบคลุมทุกช่วงเวลาของเดือนมกราคม

SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date <  '2024-02-01';

NOT BETWEEN

col NOT BETWEEN a AND b จะขยายเป็น col < a OR col > b ซึ่งตัดทั้งขอบเขตสองด้านและค่าทั้งหมดที่อยู่ระหว่างนั้นออก

โปรดระวัง: หาก col เป็น NULL NOT BETWEEN จะประเมินผลเป็น UNKNOWN ดังนั้นแถวที่เป็น NULL จึงถูกตัดออกเช่นเดียวกับการใช้ BETWEEN ปกติ ค่า NULL ไม่เคยผ่านการทดสอบช่วงไม่ว่าจะตรวจไปทางใด

SELECT *
FROM products
WHERE price NOT BETWEEN 10 AND 20;
-- price < 10 OR price > 20

IN เป็นการตรวจสมาชิกของเซต

col IN (a, b, c) เป็นรูปย่อของ col = a OR col = b OR col = c เป็นวิธีที่อ่านง่ายในการตรวจว่าค่าเป็นสมาชิกของเซตขนาดเล็กที่กำหนดไว้หรือไม่

อ่านเข้าใจง่ายกว่าการต่อ OR หลายตัว และหลีกเลี่ยงปัญหาการใส่วงเล็บตามลำดับการประเมินได้ทั้งหมด เพราะการทดสอบทั้งเซตเป็นเพรดิเคตเดียว

SELECT *
FROM orders
WHERE status IN ('pending', 'shipped', 'delivered');

กับดักของ NOT IN เมื่อมี NULL

นี่คือคำถามเกี่ยวกับ IN ที่ผู้สมัครหวาดกลัวที่สุด หากรายการ (หรือคำสั่งย่อย) ที่อยู่เบื้องหลัง NOT IN มี NULL เพียงค่าเดียว เพรดิเคตทั้งหมดอาจประเมินผลเป็น UNKNOWN และส่งคืน ไม่มีแถว

เหตุผลคือ x NOT IN (1, NULL) จะกลายเป็น x <> 1 AND x <> NULL และ x <> NULL ไม่เคยเป็นจริง แต่เป็น UNKNOWN แทน ดังนั้น AND ทั้งหมดจึงไม่มีทางเป็นจริง

SELECT *
FROM employees
WHERE manager_id NOT IN (SELECT id FROM managers);
-- returns NOTHING if any managers.id is NULL

การแก้ปัญหา NOT IN

วิธีแก้ที่เชื่อถือได้สองวิธีสำหรับกับดัก NULL ของ NOT IN:

  • กรองค่า NULL ออกจากคำสั่งย่อยด้วย WHERE id IS NOT NULL
  • วิธีที่ดีกว่าคือเขียนใหม่เป็น NOT EXISTS ซึ่งจัดการค่า NULL ได้อย่างถูกต้องตั้งแต่การออกแบบ

ผู้สัมภาษณ์มองว่า NOT EXISTS เป็นคำตอบระดับผู้มีประสบการณ์ เพราะหลีกเลี่ยงกับดักนี้ได้ทั้งหมด และมักสร้างแผนการทำงานได้ดีกว่า

SELECT e.*
FROM employees e
WHERE NOT EXISTS (
  SELECT 1 FROM managers m WHERE m.id = e.manager_id
);

IN กับคำสั่งย่อย

IN รับคำสั่งย่อยที่ส่งคืนหนึ่งคอลัมน์ได้ WHERE customer_id IN (SELECT customer_id FROM vip) จะเก็บแถวที่ลูกค้าอยู่ในชุด VIP

IN ปกติ (ไม่ใช่ NOT IN) ปลอดภัยเมื่อคำสั่งย่อยมีค่า NULL: ค่า NULL ในรายการจะไม่ตรงกับอะไรเลย แต่จะไม่ทำให้แถวที่ตรงกันเกิดปัญหา กับดักนี้มีเฉพาะกับ NOT IN

SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM vip_customers);

IN หลายคอลัมน์ด้วยตัวสร้างแถว

คำถามต่อยอดที่พบบ่อยคือ คุณจะจับคู่โดยใช้ คอลัมน์มากกว่าหนึ่งคอลัมน์พร้อมกันได้อย่างไร ให้ส่งชุดค่าไปยัง IN โดยใช้ตัวสร้างแถว วิธีนี้จะเปรียบเทียบคอลัมน์ตามตำแหน่ง และสะอาดกว่าการต่อเงื่อนไข OR (a = .. AND b = ..) มาก

  • อ่านเข้าใจง่ายและรองรับรายการค่าที่อนุญาตจำนวนมาก
  • แต่ละชุดค่าต้องระบุคอลัมน์ตามลำดับเดียวกัน
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));

ตรวจสอบความเข้าใจ

ทบทวนว่า BETWEEN จัดการกับขอบเขตอย่างไร

สรุป

ประเด็นสำคัญ:

  • BETWEEN a AND b รวมขอบเขตทั้งสองด้าน โดยต้องใส่ขอบเขตล่างก่อน มิฉะนั้นจะได้ไม่มีแถว
  • สำหรับช่วงค่าประทับเวลา ให้ใช้ ช่วงเปิดด้านหนึ่ง: >= start AND < next_period
  • IN ใช้ตรวจสมาชิกของเซตได้อย่างอ่านง่าย และปลอดภัยเมื่อมีค่า NULL
  • NOT IN ที่มี NULL อยู่ในรายการแม้แต่ค่าเดียวจะไม่ส่งคืนอะไรเลย ให้เขียนใหม่เป็น NOT EXISTS

ประเด็นที่พบซ้ำ ๆ คือ ตัวกรองอาจทำงานได้อย่างสมบูรณ์และยังคงส่งคืนแถวที่ไม่ถูกต้องอย่างเงียบ ๆ

คำถามที่พบบ่อย

บทเรียน “BETWEEN, IN และขอบเขตแบบรวมปลาย” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “BETWEEN, IN และขอบเขตแบบรวมปลาย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “BETWEEN, IN และขอบเขตแบบรวมปลาย”

กรณีขอบเขตที่ต้องระวัง และวิธีที่ BETWEEN จัดการกับค่าปลายขอบเขต คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “BETWEEN, IN และขอบเขตแบบรวมปลาย” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม

ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ลำดับความสำคัญของ AND/OR และการใส่วงเล็บ
  2. BETWEEN, IN และขอบเขตแบบรวมปลาย
  3. LIKE อักขระแทนที่ และการหลีกอักขระ
  4. กรองด้วยค่าที่คำนวณแล้ว
← กลับไปที่ Coding Interview Prep