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 > 20IN เป็นการตรวจสมาชิกของเซต
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ใช้ตรวจสมาชิกของเซตได้อย่างอ่านง่าย และปลอดภัยเมื่อมีค่า NULLNOT 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ลำดับความสำคัญของ AND/OR และการใส่วงเล็บ
- BETWEEN, IN และขอบเขตแบบรวมปลาย
- LIKE อักขระแทนที่ และการหลีกอักขระ
- กรองด้วยค่าที่คำนวณแล้ว