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

IN และ NOT IN สำหรับชุดค่า

กรองข้อมูลตามรายการค่าด้วย IN และ NOT IN เรียนรู้ข้อควรระวังเรื่อง NULL ใน NOT IN และเปลี่ยนเป็น EXISTS เพื่อความหมายที่ปลอดภัย

IN และ NOT IN สำหรับชุดค่า เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

IN: จับคู่กับรายการ

IN เป็นทางลัดสำหรับ OR หลายตัว:

SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');

-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';

IN กับ subquery

คุณสามารถใช้ subquery ทางด้านขวาได้:

SELECT * FROM orders
WHERE user_id IN (
  SELECT id FROM users WHERE country = 'US'
);

NOT IN: ไม่รวมรายการ

กรองแถวที่ตรงกันออก:

SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');

กับดัก NULL ของ NOT IN

หากด้านขวามี NULL อยู่ NOT IN จะคืนค่า NULL — และแถวที่ predicate เป็น NULL จะถูกตัดออก ผลลัพธ์คือไม่มีแถว

-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently

-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);

เหตุผลที่ NOT EXISTS ปลอดภัยกว่า

NOT EXISTS ใช้ความหมายของ subquery แบบสัมพันธ์ตามมาตรฐานและปลอดภัยต่อ NULL ตัววางแผนส่วนใหญ่จะปรับให้เหมาะสมเหมือนกับ NOT IN ที่เขียนอย่างถูกต้อง

IN กับ OR — อ่านง่ายกว่า

IN อ่านเข้าใจง่ายกว่า цеп OR ที่ยาว และตัววางแผนมักปรับให้เหมาะสมเหมือนกัน:

-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...

-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)

IN กับทูเพิล (ตัวสร้างแถว)

จับคู่คอลัมน์เป็นคู่:

SELECT * FROM order_items
WHERE (order_id, product_id) IN (
  (1, 42), (2, 99), (3, 17)
);

การใช้ดัชนี

รายการ IN บนคอลัมน์ที่มีดัชนีสามารถดำเนินการเป็นการค้นหาด้วยดัชนีหลายครั้ง (Bitmap Index Scan) โดยทั่วไปทำงานได้รวดเร็ว

-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);

รายการ IN ขนาดใหญ่

รายการที่มีค่าหลายพันค่าอาจเริ่มทำงานช้า ควรเลือก:

  • ใช้ JOIN กับตารางจริงหรือตารางชั่วคราว
  • ใช้ = ANY(array) เพื่อส่งพารามิเตอร์แบบอาร์เรย์
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);

IN กับรายการว่าง

รายการ IN ที่ว่างผิดกฎหมายตาม SQL มาตรฐาน ไคลเอนต์บางตัวส่งค่าแทนพิเศษมา วิธีที่ปลอดภัยกว่าคือสร้างเงื่อนไข SQL แบบมีเงื่อนไข

-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.

IN กับ JOIN

บางครั้ง JOIN อธิบายได้ชัดเจนกว่า subquery IN:

-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);

-- With JOIN:
SELECT o.*
FROM orders o
JOIN users  u ON u.id = o.user_id
WHERE u.pro;

สรุป

IN เป็นรูปแบบที่อ่านง่ายสำหรับการตรวจสมาชิกของเซต

  • เลือก IN แทน OR เพื่อให้อ่านง่าย
  • NOT IN อันตรายเมื่อมี NULL — ควรใช้ NOT EXISTS
  • สำหรับเซตขนาดใหญ่ ให้ใช้ JOIN หรือส่งอาร์เรย์

ตรวจสอบความเข้าใจ

สิ่งใดเป็นตัวแทนที่ปลอดภัยที่สุดสำหรับ NOT IN (subquery) เมื่อ subquery อาจมี NULL

คำถามที่พบบ่อย

บทเรียน “IN และ NOT IN สำหรับชุดค่า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “IN และ NOT IN สำหรับชุดค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “IN และ NOT IN สำหรับชุดค่า”

กรองข้อมูลตามรายการค่าด้วย IN และ NOT IN เรียนรู้ข้อควรระวังเรื่อง NULL ใน NOT IN และเปลี่ยนเป็น EXISTS เพื่อความหมายที่ปลอดภัย คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “IN และ NOT IN สำหรับชุดค่า” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. รูปแบบ LIKE และอักขระแทน
  2. IN และ NOT IN สำหรับชุดค่า
  3. BETWEEN สำหรับช่วงค่า
  4. IS NULL, IS NOT NULL และ COALESCE
← กลับไปที่ SQL Academy