0Pricing
SQL Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. คำค้นย่อยที่สัมพันธ์กัน
  2. EXISTS และ NOT EXISTS
  3. IN เทียบกับ ANY เทียบกับ ALL
  4. ประสิทธิภาพของ EXISTS เทียบกับ JOIN
← กลับไปที่ SQL Academy