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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบ LIKE และอักขระแทน
- IN และ NOT IN สำหรับชุดค่า
- BETWEEN สำหรับช่วงค่า
- IS NULL, IS NOT NULL และ COALESCE