0Pricing
Coding Interview Prep · บทเรียน

ความหมายของ RIGHT และ FULL OUTER JOIN

กรณีที่ต้องใช้แต่ละแบบ และวิธีเขียน RIGHT ใหม่ให้เป็น LEFT

ความหมายของ RIGHT และ FULL OUTER JOIN เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

นอกเหนือจาก LEFT JOIN

เมื่อคุณเข้าใจ LEFT JOIN แล้ว ผู้สัมภาษณ์จะทดสอบทั้งรูปแบบกลับด้านและการรวมของทั้งสองแบบ นั่นคือ RIGHT JOIN และ FULL OUTER JOIN

  • RIGHT JOIN จะคงทุกแถวของตารางด้านขวาไว้
  • FULL OUTER JOIN จะคงแถวที่ไม่ตรงกันจากตาราง ทั้งสอง ไว้

บทเรียนนี้จะอธิบายแต่ละแบบอย่างแม่นยำ และแสดงเทคนิคการเขียนใหม่ที่ผู้สัมภาษณ์ชื่นชอบ: RIGHT JOIN ใด ๆ ก็สามารถเปลี่ยนเป็น LEFT JOIN ได้

ความหมายของ RIGHT JOIN

RIGHT JOIN (หรือ RIGHT OUTER JOIN) จะคงทุกแถวจากตาราง ด้านขวา ซึ่งเป็นตารางที่เขียนไว้หลังคีย์เวิร์ด JOIN แถวด้านขวาที่ไม่ตรงกันจะปรากฏขึ้น โดยมีค่า NULL ในคอลัมน์ของตารางด้านซ้าย

นี่คือภาพกลับด้านที่ตรงข้ามกับ LEFT JOIN ทุกประการ ในขณะที่ LEFT คงตารางที่ระบุชื่อก่อนหน้าไว้ RIGHT จะคงตารางที่ระบุชื่อเป็นลำดับที่สองไว้

SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c
  ON o.customer_id = c.id;
-- keeps ALL customers, even those
-- with no order (Carol -> amount NULL)

กลับมาดูตารางอีกครั้ง

ใช้ข้อมูลชุดเดิมจากก่อนหน้านี้ แครอล (ลูกค้าหมายเลข 3) ไม่มีคำสั่งซื้อ แถวคำสั่งซื้อทั้งหมดในที่นี้อ้างอิงลูกค้าที่มีอยู่จริง ดังนั้นเมื่อลูกค้าเป็นฝั่งที่คงไว้ จึงไม่มีคำสั่งซื้อใดที่ไม่มีลูกค้าอ้างอิง

-- customers           orders
-- 1 | Alice           10 | 1 | 50
-- 2 | Bob             11 | 1 | 75
-- 3 | Carol           12 | 2 | 20

เขียน RIGHT ใหม่เป็น LEFT

ประเด็นสำคัญในการสัมภาษณ์คือ แทบไม่ใช้ RIGHT JOIN ในการทำงานจริง เพราะคุณสามารถสลับลำดับตารางและใช้ LEFT JOIN ได้เสมอ คำสั่งสืบค้นสองรายการด้านล่างมีตรรกะเหมือนกัน

คู่มือรูปแบบการเขียนหลายฉบับห้ามใช้ RIGHT JOIN โดยสิ้นเชิง เพราะการอ่านจากซ้ายไปขวาและคงตารางด้านซ้ายไว้เสมอทำให้วิเคราะห์ได้ง่ายกว่า

-- RIGHT JOIN
SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c ON o.customer_id = c.id;

-- Equivalent LEFT JOIN (preferred)
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

ความหมายของ FULL OUTER JOIN

FULL OUTER JOIN จะคงแถวที่ไม่ตรงกันจากตาราง ทั้งสอง ไว้ ให้คิดว่าเป็นการรวม LEFT JOIN กับ RIGHT JOIN เข้าด้วยกัน:

  • คู่แถวที่ตรงกันจะปรากฏตามปกติ
  • แถวด้านซ้ายที่ไม่มีข้อมูลตรงกัน: คอลัมน์ด้านขวาเป็น NULL
  • แถวด้านขวาที่ไม่มีข้อมูลตรงกัน: คอลัมน์ด้านซ้ายเป็น NULL

การเชื่อมแบบนี้ตอบโจทย์ "แสดงข้อมูลทั้งหมดจากทั้งสองฝั่ง โดยจัดคู่รายการที่ตรงกันให้ตรงกัน"

SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o
  ON o.customer_id = c.id;

เมื่อ FULL OUTER มีประโยชน์อย่างยิ่ง

FULL OUTER JOIN เป็นตัวเลือกหลักสำหรับ การกระทบยอด ซึ่งคือการเปรียบเทียบชุดข้อมูลสองชุดที่ควรตรงกัน แต่อาจไม่ตรงกันก็ได้

ลองนึกถึงตาราง orders และตาราง payments ที่แยกจากกัน การใช้ FULL OUTER JOIN โดยจับคู่ด้วยรหัสคำสั่งซื้อจะทำให้เห็นทั้งคำสั่งซื้อที่ไม่มีการชำระเงิน และ การชำระเงินที่ไม่มีคำสั่งซื้อที่ตรงกันในผลลัพธ์เดียว โดยแต่ละรายการจะมีค่า NULL เป็นสัญญาณบอกฝั่งที่ขาดหายไป

SELECT o.id AS order_id, p.id AS payment_id
FROM orders o
FULL OUTER JOIN payments p
  ON p.order_id = o.id
WHERE o.id IS NULL OR p.id IS NULL;
-- rows where one side is missing

ความตระหนักถึงความแตกต่างของไดอะเล็กต์

ผู้สัมภาษณ์อาจทดสอบความสามารถในการย้ายระบบ MySQL ไม่มีคีย์เวิร์ด FULL OUTER JOIN (จนถึงเวอร์ชัน 8) ส่วน Postgres, SQL Server และ Oracle รองรับสิ่งนี้

ใน MySQL คุณจำลองการทำงานนี้ได้ด้วยการรวม LEFT JOIN และ RIGHT JOIN เข้ากับ UNION (ซึ่งจะลบแถวที่ตรงกันซ้ำกันออก) การเข้าใจความแตกต่างนี้แสดงให้เห็นถึงประสบการณ์การทำงานจริง

-- FULL OUTER JOIN emulated in MySQL
SELECT c.name, o.id FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.name, o.id FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;

ประเภทการ JOIN ทั้งสี่โดยสรุป

จดจำตารางนี้ไว้ให้ขึ้นใจ คำว่า “เก็บไว้” หมายถึงแถวที่ไม่ตรงกันยังคงอยู่ โดยมีค่า NULL

  • INNER JOIN: เฉพาะแถวที่ตรงกัน ไม่มีการเก็บแถวใดไว้
  • LEFT JOIN: เก็บแถวจากฝั่งซ้ายทั้งหมดไว้
  • RIGHT JOIN: เก็บแถวจากฝั่งขวาทั้งหมดไว้
  • FULL OUTER JOIN: เก็บแถวไว้ทั้งสองฝั่ง

คำถามสัมภาษณ์เกี่ยวกับการ JOIN แบบด้านนอกแทบทั้งหมดล้วนเป็นการเลือกว่าจะเก็บแถวจากฝั่งใดไว้บ้าง

การเลือกใช้ระหว่างประเภทเหล่านี้

เลือก JOIN โดยถามว่า “ต้องเก็บแถวที่ไม่ตรงกันจากฝั่งใดไว้บ้าง”

  • ต้องการเก็บเฉพาะแถวของตารางหลักหรือตารางต้นทาง: LEFT JOIN (วางตารางหลักไว้ก่อน)
  • ต้องการชุดแถวที่ไม่ตรงกันจากทั้งสองฝั่งเพื่อกระทบยอด: FULL OUTER JOIN
  • สนใจเฉพาะแถวที่ตรงกัน: INNER JOIN

แทบไม่เลือก RIGHT JOIN โดยตรง แต่ปรับรูปแบบให้เป็น LEFT JOIN ด้วยการสลับลำดับตาราง

ตัวอย่างการกระทบยอด

นำ FULL OUTER JOIN มาใช้ระบุสถานะของแต่ละแถว การใช้ CASE ตรวจรูปแบบของ NULL จะบอกได้ว่าแถวขาดหายจากฝั่งใด ซึ่งเป็นรูปแบบคำสั่งตรวจสอบข้อมูลแบบคลาสสิก

SELECT
  COALESCE(o.id, p.order_id) AS ord,
  CASE
    WHEN p.id IS NULL THEN 'no payment'
    WHEN o.id IS NULL THEN 'orphan payment'
    ELSE 'matched'
  END AS status
FROM orders o
FULL OUTER JOIN payments p ON p.order_id = o.id;

ความเข้าใจผิดที่พบบ่อย

ผู้สมัครมักเข้าใจว่า FULL OUTER JOIN คืนผลคูณคาร์ทีเซียนของแถวที่ไม่ตรงกัน แต่ ไม่ใช่เช่นนั้น แถวที่ไม่ตรงกันของแต่ละฝั่งจะปรากฏเพียงครั้งเดียว โดยจับคู่กับค่า NULL และจะไม่ถูกนำไปคูณไขว้กัน

แถวที่ตรงกันยังคงเป็นไปตามการเพิ่มจำนวนแถวของการ JOIN ตามปกติ (หนึ่งแถวผลลัพธ์ต่อหนึ่งคู่ที่ตรงกัน) ซึ่งเป็นกฎการแตกแขนงแบบเดียวกับการ JOIN ทุกประเภท

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

ผู้สัมภาษณ์ขอให้คุณเขียนคำสั่งใหม่สำหรับทีมที่ห้ามใช้ RIGHT JOIN

สรุป

RIGHT JOIN เก็บตารางด้านขวาไว้ ส่วน FULL OUTER JOIN เก็บไว้ทั้งสองฝั่ง คุณสามารถเขียน RIGHT JOIN ใหม่เป็น LEFT JOIN ได้เสมอด้วยการสลับลำดับตาราง จึงเป็นเหตุผลที่ทีมต่าง ๆ นิยมใช้ LEFT

  • FULL OUTER เหมาะอย่างยิ่งสำหรับการกระทบยอดชุดข้อมูลสองชุด
  • MySQL ไม่มี FULL OUTER จึงจำลองได้ด้วย LEFT + RIGHT + UNION
  • เลือก JOIN โดยตัดสินใจว่าจะเก็บแถวที่ไม่ตรงกันใดไว้
  • แถวที่ไม่ตรงกันจะปรากฏครั้งเดียวพร้อมค่า NULL ไม่ใช่ผลคูณคาร์ทีเซียน

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

บทเรียน “ความหมายของ RIGHT และ FULL OUTER JOIN” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ความหมายของ RIGHT และ FULL OUTER JOIN” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ความหมายของ RIGHT และ FULL OUTER JOIN”

กรณีที่ต้องใช้แต่ละแบบ และวิธีเขียน RIGHT ใหม่ให้เป็น LEFT คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ความหมายของ RIGHT และ FULL OUTER JOIN” ใช้เวลานานแค่ไหน

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

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

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

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

  1. LEFT JOIN และการคงแถวที่ไม่ตรงกัน
  2. ความหมายของ RIGHT และ FULL OUTER JOIN
  3. ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก)
  4. กับดักการใช้ WHERE กับการเชื่อมตารางภายนอก
← กลับไปที่ Coding Interview Prep