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

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 order

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

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

  1. เหตุใดจึงต้องใช้การเชื่อมตาราง (ทบทวนโมเดลเชิงสัมพันธ์)
  2. กลไกของ INNER JOIN
  3. LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER
  4. การเชื่อมตารางเข้ากับตัวเองและชื่อแทน
← กลับไปที่ SQL Academy