IN เทียบกับ ANY เทียบกับ ALL
เปรียบเทียบกับชุดของค่า
IN เทียบกับ ANY เทียบกับ ALL เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
IN, ANY และ ALL คืออะไร
เมื่อเขียนคำสั่งสอบถาม SQL คุณมักจำเป็นต้องเปรียบเทียบค่ากับ ชุดของค่า SQL มีตัวดำเนินการที่ทรงพลังสามรายการสำหรับงานนี้ ได้แก่ IN, ANY และ ALL
ตัวดำเนินการทั้งสามทำงานร่วมกับแบบสอบถามย่อยที่ส่งคืนรายการค่าได้ ทั้งหมดดูคล้ายกันแต่มีพฤติกรรมต่างกัน การเลือกใช้ให้ถูกต้องจะช่วยให้คำสั่งสอบถามสื่อความหมายได้ชัดเจนขึ้นและมีประสิทธิภาพมากขึ้น
ตัวดำเนินการ IN
ตัวดำเนินการ IN ตรวจสอบว่าค่าตรงกับ ค่าใด ๆ ในรายการหรือผลลัพธ์ของแบบสอบถามย่อยหรือไม่ ตัวดำเนินการนี้เป็นตัวที่ง่ายที่สุดในสามรายการ
ตัวอย่างด้านล่างดึงข้อมูลพนักงานที่ทำงานในแผนกฝ่ายขาย, HR หรือฝ่ายวิศวกรรม
SELECT name, department
FROM employees
WHERE department IN ('Sales', 'HR', 'Engineering');IN กับแบบสอบถามย่อย
IN มีประโยชน์อย่างยิ่งเมื่อใช้ร่วมกับแบบสอบถามย่อย แทนที่จะใช้รายการที่กำหนดตายตัว คุณสามารถดึงค่าที่ใช้เปรียบเทียบโดยตรงจากอีกตารางหนึ่งได้
ในที่นี้ เราค้นหาพนักงานทั้งหมดที่อยู่ในแผนกซึ่งมีงบประมาณสูงกว่า 100,000
SELECT name, department
FROM employees
WHERE department IN (
SELECT dept_name
FROM departments
WHERE budget > 100000
);ตัวดำเนินการ ANY
ANY (เขียนได้อีกแบบว่า SOME) เปรียบเทียบค่ากับทุกค่าที่แบบสอบถามย่อยส่งคืน โดยใช้ตัวดำเนินการเปรียบเทียบ เช่น =, >, <, >= หรือ <=
เงื่อนไขจะเป็นจริงหากการเปรียบเทียบเป็นจริงสำหรับค่า อย่างน้อยหนึ่งค่าในผลลัพธ์ของแบบสอบถามย่อย
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department = 'HR'
);= ANY เหมือนกับ IN
ความเท่าเทียมที่สำคัญประการหนึ่งคือ = ANY (subquery) เหมือนกันในเชิงตรรกะกับ IN (subquery) ทั้งสองจะส่งคืนค่าเป็นจริงเมื่อค่าตรงกับผลลัพธ์อย่างน้อยหนึ่งรายการจากแบบสอบถามย่อย
แบบสอบถามสองรายการนี้ให้ผลลัพธ์เหมือนกัน:
-- Using IN
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'NYC');
-- Using = ANY
SELECT name FROM employees
WHERE department_id = ANY (SELECT id FROM departments WHERE location = 'NYC');ตัวดำเนินการ ALL
ALL เปรียบเทียบค่ากับทุกค่าในผลลัพธ์ของแบบสอบถามย่อย เงื่อนไขจะเป็นจริงก็ต่อเมื่อการเปรียบเทียบนั้นเป็นจริงสำหรับทุกค่าที่ส่งคืน
ตัวอย่างนี้ค้นหาพนักงานที่มีเงินเดือนสูงกว่าเงินเดือนทุกคนในระดับผู้ฝึกงาน ซึ่งหมายความว่าพวกเขาได้รับเงินเดือนสูงกว่าผู้ฝึกงานที่มีเงินเดือนสูงที่สุด
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary
FROM employees
WHERE job_grade = 'Intern'
);ANY เทียบกับ ALL — เปรียบเทียบโดยตรง
ความแตกต่างสำคัญคือ ANY ต้องการให้เงื่อนไขเป็นจริงสำหรับค่า อย่างน้อยหนึ่งค่า ขณะที่ ALL ต้องการให้เป็นจริงสำหรับค่า ทุกค่า
ลองนึกภาพดังนี้: ANY เปรียบเสมือน OR ที่ใช้กับการเปรียบเทียบทั้งหมด และ ALL เปรียบเสมือน AND ที่ใช้กับการเปรียบเทียบทั้งหมด
-- Returns rows where salary > at least one value in the subquery
SELECT name, salary FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE department = 'Support');
-- Returns rows where salary > every value in the subquery
SELECT name, salary FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE department = 'Support');NOT IN เทียบกับ <> ALL
เช่นเดียวกับที่ = ANY มีความหมายเหมือนกับ IN ตัวดำเนินการ <> ALL ก็เทียบเท่ากับ NOT IN เช่นกัน ทั้งสองจะส่งคืนค่าเป็นจริงก็ต่อเมื่อค่าไม่ตรงกับค่าใด ๆ ในแบบสอบถามย่อย
อย่างไรก็ตาม ต้องระวังไว้ว่า หากแบบสอบถามย่อยส่งคืนค่า NULL แม้เพียงหนึ่งค่า NOT IN จะไม่ส่งคืนแถวใดเลย เนื่องจากตรรกะแบบสามค่าของ SQL
-- Using NOT IN
SELECT name FROM employees
WHERE department_id NOT IN (SELECT id FROM departments WHERE location = 'Remote');
-- Using <> ALL (equivalent)
SELECT name FROM employees
WHERE department_id <> ALL (SELECT id FROM departments WHERE location = 'Remote');กับดัก NULL เมื่อใช้ NOT IN
ข้อควรระวังสำคัญคือ หากแบบสอบถามย่อยที่ใช้กับ NOT IN ส่งคืนค่า NULL เงื่อนไข NOT IN ทั้งหมดจะถูกประเมินเป็น UNKNOWN สำหรับทุกแถว ทำให้ชุดผลลัพธ์ว่างเปล่า
เพื่อหลีกเลี่ยงปัญหานี้ ให้กรอง NULL ออกจากแบบสอบถามย่อย หรือใช้ NOT EXISTS แทน ซึ่งจัดการกับ NULL ได้อย่างปลอดภัย
-- Dangerous: if manager_id has any NULL, no rows are returned
SELECT name FROM employees
WHERE id NOT IN (SELECT manager_id FROM employees);
-- Safe: filter NULLs explicitly
SELECT name FROM employees
WHERE id NOT IN (
SELECT manager_id FROM employees
WHERE manager_id IS NOT NULL
);ตัวอย่างใช้งานจริง: ค้นหาผู้มีรายได้สูง
มาดูการนำตัวดำเนินการทั้งสามไปใช้กับสถานการณ์ที่พบได้จริง เรามีตาราง employees ซึ่งมีคอลัมน์ name, department และ salary
เราต้องการพนักงานที่มีเงินเดือนสูงกว่าค่าเฉลี่ยเงินเดือนของแผนกใดแผนกหนึ่ง ซึ่งหมายถึงสูงกว่าค่าเฉลี่ยของอย่างน้อยหนึ่งแผนก
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT AVG(salary)
FROM employees
GROUP BY department
)
ORDER BY salary DESC;ควรใช้ตัวใดเมื่อใด
แนวทางอย่างรวดเร็วสำหรับการเลือกใช้ตัวดำเนินการทั้งสามมีดังนี้:
- IN — เมื่อมีรายการคงที่ หรือต้องการจับคู่ความเท่ากันอย่างง่ายกับแบบสอบถามย่อย
- = ANY — เหมือนกับ IN แต่ทำให้ใช้ตัวดำเนินการเปรียบเทียบอื่น ๆ เช่น
>,<ได้ - ALL — เมื่อเงื่อนไขต้องเป็นจริงเมื่อเทียบกับทุกค่า (เช่น มากกว่าค่าสูงสุดโดยไม่ใช้ MAX)
- NOT IN — สะดวกแต่ต้องระวัง NULL ควรเลือก
NOT EXISTSเมื่อแบบสอบถามย่อยอาจมี NULL
ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับ IN, ANY และ ALL
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้วิธีเปรียบเทียบค่ากับชุดของค่าโดยใช้ IN, ANY และ ALL
ประเด็นสำคัญ:
INตรวจสอบการเป็นสมาชิก — เป็นจริงหากค่าตรงกับรายการใด ๆ ในรายการหรือแบบสอบถามย่อย= ANYเทียบเท่ากับINส่วนการใช้ตัวดำเนินการอื่น เช่น> ANYจะเป็นจริงเมื่อมีการตรงกันอย่างน้อยหนึ่งรายการALLหมายถึงเงื่อนไขต้องเป็นจริงสำหรับทุกค่าที่แบบสอบถามย่อยส่งคืนNOT INจะไม่ส่งคืนแถวใดเลยโดยไม่แจ้งเตือนเมื่อแบบสอบถามย่อยมี NULL — ต้องป้องกันกรณีนี้เสมอ- ใช้
NOT EXISTSเป็นทางเลือกที่ปลอดภัยกว่า NOT IN เมื่ออาจมี NULL
คำถามที่พบบ่อย
บทเรียน “IN เทียบกับ ANY เทียบกับ ALL” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “IN เทียบกับ ANY เทียบกับ ALL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “IN เทียบกับ ANY เทียบกับ ALL”
เปรียบเทียบกับชุดของค่า คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “IN เทียบกับ ANY เทียบกับ ALL” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คำค้นย่อยที่สัมพันธ์กัน
- EXISTS และ NOT EXISTS
- IN เทียบกับ ANY เทียบกับ ALL
- ประสิทธิภาพของ EXISTS เทียบกับ JOIN