คิวรีย่อยแบบ IN, ANY และ ALL
คิวรีย่อยสำหรับตรวจสมาชิกของชุดข้อมูล และกับดักคลาสสิกของ NOT IN กับ NULL
คิวรีย่อยแบบ IN, ANY และ ALL เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
ซับคิวรีสำหรับการเป็นสมาชิกของชุด
เมื่อซับคิวรีส่งคืนรายการค่า คุณสามารถตรวจสอบการเป็นสมาชิกของชุดนั้นด้วย IN, ANY หรือ ALL ซึ่งเป็นวิธีที่ SQL ใช้ถามว่า ค่านี้อยู่ในชุดนั้นหรือไม่ หรือ ค่านี้มากกว่าสมาชิกทุกตัวหรือบางตัวในชุดนั้นหรือไม่
IN— ตรงกับค่าใดค่าหนึ่งในรายการANY/SOME— เป็นจริงหากเงื่อนไขการเปรียบเทียบเป็นจริงกับสมาชิกอย่างน้อยหนึ่งตัวALL— เป็นจริงก็ต่อเมื่อเงื่อนไขเป็นจริงกับสมาชิกทุกตัว
IN กับซับคิวรี
กรณีที่พบได้ทั่วไปคือ การค้นหาพนักงานที่ทำงานอยู่ในแผนกใดก็ตามที่ตั้งอยู่ใน 'NYC' ซับคิวรีจะส่งคืนชุดรหัสแผนก และ IN จะเก็บแถวที่ตรงกับรหัสใดรหัสหนึ่งในชุดนั้น
รูปแบบนี้อ่านเข้าใจได้เป็นธรรมชาติ และเป็นรูปแบบแรกที่ผู้สัมภาษณ์คาดหวัง
SELECT name
FROM employees
WHERE dept_id IN (
SELECT id FROM departments WHERE city = 'NYC'
);= ANY เหมือนกับ IN
ความเทียบเท่าที่ผู้สัมภาษณ์ชื่นชอบคือ = ANY (subquery) มีความหมายเหมือนกับ IN (subquery) ทุกประการ ทั้งสองแบบเป็นจริงเมื่อค่าเท่ากับสมาชิกอย่างน้อยหนึ่งตัวในชุด
คิวรีด้านล่างส่งคืนผลลัพธ์เดียวกับคิวรีก่อนหน้า ANY และคำพ้องความหมายคือ SOME สามารถขยายแนวคิดนี้ไปยังตัวดำเนินการอื่น เช่น > และ < ได้
SELECT name
FROM employees
WHERE dept_id = ANY (
SELECT id FROM departments WHERE city = 'NYC'
);ANY กับตัวดำเนินการเปรียบเทียบ
ANY มีประโยชน์มากขึ้นเมื่อใช้กับ > หรือ < นิพจน์ salary > ANY (set) เป็นจริงหากเงินเดือนมากกว่าสมาชิกที่มีค่าน้อยที่สุดอย่างน้อยหนึ่งตัว หรือก็คือมากกว่าค่าต่ำสุด
รูปแบบนี้ใช้ค้นหาพนักงานที่มีรายได้มากกว่าบุคคลอย่างน้อยหนึ่งคนในแผนก 5
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary FROM employees WHERE dept_id = 5
);ALL กับตัวดำเนินการเปรียบเทียบ
salary > ALL (set) เป็นจริงก็ต่อเมื่อเงินเดือนมากกว่าสมาชิกทุกตัว หรือก็คือมากกว่าค่าสูงสุด รูปแบบนี้ใช้ค้นหาพนักงานที่มีรายได้มากกว่าทุกคนในแผนก 5
จำทางลัดนี้ไว้: > ALL = มากกว่า MAX, > ANY = มากกว่า MIN ผู้สัมภาษณ์มักทดสอบเรื่องนี้อยู่เสมอ
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary FROM employees WHERE dept_id = 5
);NOT IN: กับดัก NULL อันโด่งดัง
นี่คือจุดหลอกในการสัมภาษณ์เกี่ยวกับซับคิวรีที่ถูกถามบ่อยที่สุด หากซับคิวรีใน NOT IN ส่งคืน NULL แม้เพียงหนึ่งค่า NOT IN ทั้งหมดอาจส่งคืนไม่มีแถวเลย แทนที่จะส่งคืนระเบียนที่ไม่มีคู่ตามที่คาดไว้
เพราะเหตุใด? x NOT IN (1, 2, NULL) จะขยายเป็น x <> 1 AND x <> 2 AND x <> NULL การเปรียบเทียบส่วนสุดท้ายให้ผลเป็น UNKNOWN ดังนั้น AND จึงไม่มีทางเป็นจริง
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
);เหตุใดคิวรีนั้นจึงล้มเหลวโดยไม่มีสัญญาณเตือน
หาก orders.customer_id อนุญาตให้เป็นค่าว่าง และมีแถวใดก็ตามที่มีค่า NULL ในคอลัมน์นั้น คิวรีก่อนหน้าจะส่งคืนศูนย์แถว แม้ว่าจะมีลูกค้าที่ไม่มีรายการสั่งซื้ออยู่อย่างชัดเจน
- การมีอยู่ของ NULL ทำให้ตรรกะมีค่าเป็น
UNKNOWN - คิวรีจะไม่เกิดข้อผิดพลาด — เพียงส่งคืนผลลัพธ์ที่ไม่ถูกต้องและว่างเปล่า
การพูดถึงอันตรายนี้อย่างชัดเจนระหว่างการสัมภาษณ์เป็นสัญญาณที่ดีมาก
แก้ไข NOT IN เมื่อมี NULL
วิธีแก้ที่ปลอดภัยสามวิธีซึ่งผู้สัมภาษณ์ยอมรับ:
- ตัดค่า NULL ออกจากซับคิวรี: เพิ่ม
WHERE customer_id IS NOT NULL - เขียนใหม่โดยใช้
NOT EXISTSซึ่งจัดการ NULL ได้อย่างถูกต้อง - ใช้การเชื่อมตารางแบบตัดออกด้วย
LEFT JOIN ... IS NULL
รูปแบบที่มีการป้องกันด้านล่างจะส่งคืนรายชื่อลูกค้าที่ไม่มีรายการสั่งซื้ออย่างถูกต้อง
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
WHERE customer_id IS NOT NULL
);IN ใช้กับ NULL ได้
ข้อสังเกตเพื่อความสบายใจ: IN แบบธรรมดา (ที่ไม่ได้ทำให้เป็นปฏิเสธ) จะไม่เสียหายเมื่อรายการมี NULL x IN (1, 2, NULL) เป็นจริงหาก x เท่ากับ 1 หรือ 2 ส่วน NULL จะไม่ตรงกับค่าใดเลย
อันตรายจาก NULL เกิดขึ้นเฉพาะกับ NOT IN การเข้าใจความแตกต่างของสองกรณีนี้เป็นสิ่งที่แยกคำตอบที่มั่นใจออกจากการเดา
IN หลายคอลัมน์
ภาษาถิ่นบางแบบ (โพสต์เกรส, MySQL) อนุญาตให้ใช้ IN กับทูเพิลของคอลัมน์ เพื่อจับคู่หลายคอลัมน์พร้อมกัน รูปแบบนี้ใช้ค้นหาบรรทัดรายการสั่งซื้อที่มีคู่ (สินค้า, ภูมิภาค) ปรากฏอยู่ในตารางโปรโมชั่น
SQL Server ไม่มี IN สำหรับค่าระดับแถว คุณจึงต้องเขียนใหม่โดยใช้ EXISTS ในกรณีนั้น การกล่าวถึงข้อจำกัดด้านความเข้ากันได้ระหว่างระบบนี้จะทำให้ผู้สัมภาษณ์ประทับใจ
SELECT *
FROM order_lines
WHERE (product_id, region) IN (
SELECT product_id, region FROM promotions
);ประโยคเด็ดสำหรับการสัมภาษณ์
ตอบดังนี้: "IN ใช้ตรวจสอบการเป็นสมาชิกของชุด และเทียบเท่ากับ = ANY เมื่อใช้กับตัวดำเนินการเปรียบเทียบ > ANY หมายถึงมากกว่าค่าต่ำสุด และ > ALL หมายถึงมากกว่าค่าสูงสุด กับดักสำคัญคือการใช้ NOT IN กับซับคิวรีที่อาจส่งคืน NULL ซึ่งจะส่งคืนไม่มีแถวโดยไม่มีสัญญาณเตือน ดังนั้นผมจึงป้องกันด้วย IS NOT NULL หรือเปลี่ยนไปใช้ NOT EXISTS"
คำตอบนี้ครอบคลุมการเป็นสมาชิกของชุด ความหมายของ ANY/ALL และกับดัก NULL ได้ในครั้งเดียว
ตรวจสอบอย่างรวดเร็ว
จุดหลอกเกี่ยวกับซับคิวรีที่ผู้สัมภาษณ์ชื่นชอบที่สุด
สรุปทบทวน
เชี่ยวชาญซับคิวรีสำหรับการเป็นสมาชิกของชุดแล้ว:
IN== ANY: ตรงกับสมาชิกใดสมาชิกหนึ่งในชุด> ANYหมายถึงมากกว่าค่าต่ำสุด ส่วน> ALLหมายถึงมากกว่าค่าสูงสุดNOT INที่มี NULL อยู่ในซับคิวรีจะส่งคืนไม่มีแถวโดยไม่มีสัญญาณเตือน ให้ป้องกันด้วยIS NOT NULLหรือใช้NOT EXISTSINแบบธรรมดารองรับ NULL ได้ ส่วนINหลายคอลัมน์ใช้ได้ในภาษาถิ่นบางแบบ
ถัดไป: EXISTS เทียบกับ IN และคำถามด้านประสิทธิภาพที่ผู้สัมภาษณ์ระดับอาวุโสชื่นชอบ
คำถามที่พบบ่อย
บทเรียน “คิวรีย่อยแบบ IN, ANY และ ALL” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “คิวรีย่อยแบบ IN, ANY และ ALL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “คิวรีย่อยแบบ IN, ANY และ ALL”
คิวรีย่อยสำหรับตรวจสมาชิกของชุดข้อมูล และกับดักคลาสสิกของ NOT IN กับ NULL คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “คิวรีย่อยแบบ IN, ANY และ ALL” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คิวรีย่อยแบบสเกลาร์ใน SELECT และ WHERE
- คิวรีย่อยในส่วน FROM (ตารางที่ได้มา)
- คิวรีย่อยแบบ IN, ANY และ ALL
- ประสิทธิภาพของ EXISTS เทียบกับ IN