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

คิวรีย่อยแบบ 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 EXISTS
  • IN แบบธรรมดารองรับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. คิวรีย่อยแบบสเกลาร์ใน SELECT และ WHERE
  2. คิวรีย่อยในส่วน FROM (ตารางที่ได้มา)
  3. คิวรีย่อยแบบ IN, ANY และ ALL
  4. ประสิทธิภาพของ EXISTS เทียบกับ IN
← กลับไปที่ Coding Interview Prep