LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER
ใช้ LEFT JOIN เพื่อเก็บแถวที่จับคู่ไม่ได้ ทำความเข้าใจ RIGHT และ FULL OUTER JOIN และตรวจหาข้อมูลที่หายไปด้วย WHERE x IS NULL
LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
LEFT JOIN: เก็บแถวทั้งหมดจากฝั่งซ้าย
LEFT JOIN จะคืนค่าทุกแถวจากตารางฝั่งซ้าย พร้อมคอลัมน์จากฝั่งขวาที่ตรงกัน หรือเป็น NULL เมื่อไม่มีแถวที่ตรงกัน
SELECT u.id, u.email, o.id AS order_id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;
-- Users without orders still appear, with order_id = NULL.RIGHT JOIN
เป็นภาพสะท้อนของ LEFT JOIN โดยเก็บแถวทั้งหมดจากฝั่ง RIGHT ผู้ใช้ส่วนใหญ่มักเขียน RIGHT JOIN ใหม่เป็น LEFT JOIN เพื่อให้อ่านง่ายขึ้น:
SELECT u.id, u.email, o.id
FROM orders o
RIGHT JOIN users u ON u.id = o.user_id;
-- Equivalent to LEFT JOIN with sides swapped:
SELECT u.id, u.email, o.id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;FULL OUTER JOIN
เก็บแถวจากทั้งสองฝั่ง คอลัมน์ที่ไม่มีคู่ตรงกันจะเป็น NULL:
SELECT u.email, o.id AS order_id
FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;ค้นหาคู่ที่ไม่ตรงกัน
การใช้ LEFT JOIN ร่วมกับ WHERE right.id IS NULL จะค้นหาแถวในตารางฝั่งซ้ายที่ไม่มีคู่ตรงกันทางฝั่งขวา ซึ่งเป็นรูปแบบ anti-join แบบคลาสสิก:
SELECT u.id, u.email
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL; -- users who have never placed an orderLEFT JOIN กับค่ารวม
มีประโยชน์สำหรับรายงานที่ต้องการให้แสดง 0 เมื่อไม่มีข้อมูล:
SELECT u.id, u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email
ORDER BY order_count DESC;ตำแหน่งของตัวกรองมีความสำคัญ
ตัวกรองบนตารางฝั่งขวาที่อยู่ใน WHERE จะเปลี่ยน LEFT JOIN กลับเป็น INNER JOIN ให้ใส่ตัวกรองเหล่านั้นใน ON เพื่อคงพฤติกรรมของ LEFT ไว้:
-- Drops users without paid orders entirely:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.status = 'paid'
GROUP BY u.id;
-- Keeps users with no paid orders:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o
ON o.user_id = u.id AND o.status = 'paid'
GROUP BY u.id;LEFT JOIN หลายรายการ
เขียนต่อกันได้ โดย LEFT แต่ละรายการจะรักษาแถวจากฝั่งซ้ายของตัวดำเนินการนั้นไว้:
SELECT u.email, o.id, p.name
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
LEFT JOIN products p ON p.id = o.product_id;ประสิทธิภาพของ LEFT JOIN
LEFT JOIN มีค่าใช้จ่ายมากกว่า INNER เล็กน้อย เนื่องจากตัววางแผนต้องเก็บแถวที่ไม่มีคู่ตรงกันไว้ โดยมากความแตกต่างแทบไม่มีนัยสำคัญ แต่หากไม่ต้องการแถวที่ไม่มีคู่ตรงกัน INNER JOIN จะประหยัดกว่าเล็กน้อย
การเชื่อมภายนอกกับผลลัพธ์ NULL
ผลลัพธ์ NULL จาก LEFT JOIN อาจทำให้โค้ดส่วนถัดไปทำงานอย่างไม่คาดคิด ใช้ COALESCE เพื่อกำหนดค่าเริ่มต้น:
SELECT u.email, COALESCE(SUM(o.total), 0) AS revenue
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.email;CROSS JOIN — เมื่อคุณต้องการทุกคู่
เชื่อมทุกแถวของ A เข้ากับทุกแถวของ B ควรใช้อย่างระมัดระวัง:
SELECT d.date, u.id
FROM users u
CROSS JOIN generate_series('2024-01-01', '2024-01-07', INTERVAL '1 day') AS d(date);รูปแบบการทำ Anti-Join
มีสามวิธีตามรูปแบบที่นิยมใช้ในการค้นหาแถวจากฝั่งซ้ายที่ไม่มีคู่ตรงกัน:
-- LEFT JOIN ... WHERE IS NULL
SELECT u.* FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;
-- NOT EXISTS (often the planner's favourite)
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);สรุป
การเชื่อมแบบ OUTER จะเก็บแถวที่ไม่มีคู่ตรงกันไว้
- LEFT = แถวทั้งหมดทางซ้าย และเป็น NULL ทางขวาเมื่อไม่มีคู่ตรงกัน
- RIGHT = ภาพสะท้อนของ LEFT ควรใช้ LEFT เพื่อให้อ่านง่าย
- FULL OUTER = ทั้งสองฝั่ง
- Anti-Join = LEFT JOIN ... WHERE right IS NULL
ตรวจสอบความเข้าใจ
JOIN ชนิดใดคืนค่าผู้ใช้แม้ว่าผู้ใช้เหล่านั้นจะมีคำสั่งซื้อเป็น NO
คำถามที่พบบ่อย
บทเรียน “LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER”
ใช้ LEFT JOIN เพื่อเก็บแถวที่จับคู่ไม่ได้ ทำความเข้าใจ RIGHT และ FULL OUTER JOIN และตรวจหาข้อมูลที่หายไปด้วย WHERE x IS NULL คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดจึงต้องใช้การเชื่อมตาราง (ทบทวนโมเดลเชิงสัมพันธ์)
- กลไกของ INNER JOIN
- LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER
- การเชื่อมตารางเข้ากับตัวเองและชื่อแทน