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

วิธีที่ INNER JOIN จับคู่แถว

แนวคิดเรื่องการจับคู่แถวที่ช่วยให้ตอบคำถามเกี่ยวกับการเชื่อมตารางได้ง่ายขึ้น

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

JOIN แรกที่ผู้สัมภาษณ์มักถาม

เมื่อผู้สัมภาษณ์พูดว่า “เชื่อมตารางสองตารางนี้เข้าด้วยกัน” แทบจะหมายถึง INNER JOIN เสมอ นี่คือการเชื่อมตารางแบบเริ่มต้น และเป็นสิ่งที่แสดงว่าคุณเข้าใจจริงหรือไม่ว่าแถวต่าง ๆ ถูกจับคู่กันอย่างไร

หัวข้อนี้สรุปได้ในประโยคเดียว: INNER JOIN จะพิจารณาคู่แถวที่เป็นไปได้ทุกคู่จากตารางสองตาราง และเก็บไว้เฉพาะคู่ที่ตรงตามเงื่อนไข ON หากไม่มีคู่ที่ตรงกัน แถวนั้นจะหายไปจากผลลัพธ์

จดจำแบบจำลองนี้ไว้ แล้วคำถามเกี่ยวกับการเชื่อมตารางที่ยากขึ้นทุกข้อจะเข้าใจได้ง่ายขึ้น

ตารางสองตารางสำหรับใช้พิจารณา

ตลอดบทเรียนนี้ เราจะใช้ตารางขนาดเล็กสองตาราง ตาราง ลูกค้าเก็บข้อมูลว่าใครเป็นผู้สั่งซื้อ ส่วนตาราง คำสั่งซื้อเก็บข้อมูลคำสั่งซื้อแต่ละรายการพร้อมกับลูกค้าที่เป็นเจ้าของ

  • customers(id, name)
  • orders(id, customer_id, amount)

ความเชื่อมโยงระหว่างตารางคือ orders.customer_id = customers.id ความเท่าเทียมกันนี้คือเงื่อนไขการเชื่อมตารางที่ผลลัพธ์ทั้งหมดขึ้นอยู่กับ

customers
id | name
1  | Ada
2  | Bob
3  | Cleo   -- no orders yet

orders
id | customer_id | amount
10 | 1           | 50
11 | 1           | 20
12 | 2           | 99

คำสั่ง INNER JOIN พื้นฐาน

นี่คือคำสั่งมาตรฐานที่ผู้สัมภาษณ์ต้องการเห็น โปรดสังเกตสามส่วน ได้แก่ ตารางสองตาราง, JOIN ... ON ที่ใช้จับคู่แถว และคอลัมน์ที่คุณเลือกแสดง

คำสำคัญ INNER เป็นส่วนที่ไม่จำเป็นในฐานข้อมูลหลักทุกชนิด การเขียน JOIN เปล่า ๆ หมายถึง INNER JOIN แต่การเขียนให้ชัดเจนจะแสดงเจตนาและช่วยหลีกเลี่ยงความกำกวมในการตรวจทานโปรแกรม

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

ลักษณะของผลลัพธ์

เมื่อเรียกใช้คำสั่งกับข้อมูลตัวอย่างของเรา คุณจะได้สามแถว Ada มีคำสั่งซื้อสองรายการ เธอจึงปรากฏสองครั้ง ส่วน Bob ปรากฏหนึ่งครั้ง

Cleo หายไป เธอไม่มีคำสั่งซื้อที่ตรงกัน ดังนั้น INNER JOIN จึงตัดเธอออกจากผลลัพธ์ทั้งหมด การพูดให้ชัดว่าแถวที่ไม่ตรงกันหายไปคือสิ่งสำคัญที่สุดในการสัมภาษณ์เรื่องการเชื่อมตาราง

name | amount
Ada  | 50
Ada  | 20
Bob  | 99

แบบจำลองการจับคู่แถว

ลองจินตนาการว่าฐานข้อมูลสร้างผลคูณคาร์ทีเซียนก่อน นั่นคือจับคู่ลูกค้าทุกคนกับคำสั่งซื้อทุกรายการ เมื่อลูกค้ามี 3 คนและมีคำสั่งซื้อ 3 รายการ จะมีคู่ที่เป็นไปได้ 9 คู่

จากนั้นจึงใช้เงื่อนไข ON และเก็บไว้เฉพาะคู่ที่เงื่อนไขเป็นจริง จากคู่ที่เป็นไปได้ 9 คู่ มีเพียง 3 คู่ที่ผ่าน o.customer_id = c.id

คุณไม่จำเป็นต้องคิดแบบนี้เมื่อต้องพิจารณาประสิทธิภาพ แต่เป็นแบบจำลองที่ตรงที่สุดสำหรับตอบคำถามว่า “จะได้กลับมากี่แถว”

ไล่ดูคู่ที่เป็นไปได้

มาลองไล่ดูทีละคู่ ความคิดเห็นหลังแต่ละคู่จะแสดงว่าเงื่อนไขเป็นจริงหรือไม่

มีเพียงแถวที่เป็น TRUE สามแถวเท่านั้นที่เหลืออยู่ในผลลัพธ์ ทุกคู่ที่มี Cleo (หมายเลข 3) ไม่ผ่านเงื่อนไข ดังนั้นเธอจึงไม่เพิ่มแถวใดเลย

-- customer.id vs order.customer_id
(Ada=1, ord10 cust=1)  -> TRUE  keep
(Ada=1, ord11 cust=1)  -> TRUE  keep
(Ada=1, ord12 cust=2)  -> FALSE
(Bob=2, ord10 cust=1)  -> FALSE
(Bob=2, ord12 cust=2)  -> TRUE  keep
(Cleo=3, anything)     -> FALSE (no order matches 3)

INNER JOIN ไม่ขึ้นกับลำดับ

คำถามทดสอบที่พบบ่อยคือ ตารางใดจะอยู่ลำดับแรกมีผลหรือไม่ สำหรับ INNER JOIN คำตอบคือไม่ คำสั่งสองแบบนี้คืนแถวเหมือนกันทุกประการ เพราะเงื่อนไข ON มีสมบัติสมมาตร

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

-- These return the same rows
SELECT c.name, o.amount
FROM customers c JOIN orders o ON o.customer_id = c.id;

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

ผู้สัมภาษณ์คาดหวังให้ใช้ชื่อแทนตาราง

ผู้สัมภาษณ์ต้องการชื่อแทนที่สั้นและชัดเจน ลองเปรียบเทียบเวอร์ชันที่ระบุชื่อครบถ้วนและยืดยาวกับเวอร์ชันที่ใช้ชื่อแทนอย่างกระชับ

ชื่อแทนยังเป็นสิ่งจำเป็นเมื่อมีชื่อคอลัมน์เดียวกันอยู่ในทั้งสองตาราง การเลือก id แบบไม่ระบุตารางในที่นี้จะทำให้เกิดข้อผิดพลาดคอลัมน์กำกวม ดังนั้นต้องเขียน c.id หรือ o.id

-- verbose
SELECT customers.name, orders.amount
FROM customers JOIN orders
  ON orders.customer_id = customers.id;

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

การเชื่อมโดยใช้มากกว่าหนึ่งคอลัมน์

เพรดิเคตของ ON ไม่ได้จำกัดอยู่ที่ความเท่ากันเพียงรายการเดียว เมื่อความสัมพันธ์กำหนดด้วย คีย์ประกอบ ให้เชื่อมเงื่อนไขเข้าด้วยกันด้วย AND

ในที่นี้ ราคาจะใช้แยกตามสินค้าและภูมิภาค ดังนั้นการจับคู่ต้องทำให้ทั้งสองคอลัมน์ตรงกัน ผู้สัมภาษณ์ใช้กรณีนี้ตรวจสอบว่าคุณไม่ได้ท่องจำเฉพาะการเชื่อมด้วยคอลัมน์เดียว

SELECT s.units, p.unit_price
FROM sales s
INNER JOIN price_list p
  ON p.product_id = s.product_id
 AND p.region     = s.region;

การเชื่อมแบบไม่เท่ากันก็มีเช่นกัน

เงื่อนไข ON อาจเป็นนิพจน์บูลีนใดก็ได้ ไม่ใช่แค่ = การเชื่อมแบบไม่เท่ากันใช้ช่วงค่าหรืออสมการ ตัวอย่างคลาสสิกคือการจัดคะแนนให้อยู่ในช่วงระดับคะแนน

คะแนนแต่ละค่าจะตรงกับช่วงคะแนนเพียงช่วงเดียวที่ครอบคลุมค่านั้น การกล่าวว่าการเชื่อมไม่ได้จำกัดอยู่แค่ความเท่ากัน เป็นวิธีที่ช่วยแสดงให้เห็นอย่างรวดเร็วว่าคุณมีประสบการณ์สูง

SELECT s.student, g.grade
FROM scores s
INNER JOIN grades g
  ON s.points >= g.min_points
 AND s.points <= g.max_points;

JOIN แบบชัดเจนกับการเชื่อมด้วยจุลภาค

คุณจะยังพบไวยากรณ์การเชื่อมด้วยจุลภาคแบบเก่าในโค้ดรุ่นเก่าและคำถามสัมภาษณ์บางข้อ คิวรีทั้งสองนี้ให้ผลเทียบเท่ากันสำหรับ INNER JOIN

ควรใช้รูปแบบ JOIN ... ON อย่างชัดเจน ไวยากรณ์แบบจุลภาคทำให้พิมพ์ผิดจนเกิดผลคูณคาร์ทีเซียนโดยไม่ตั้งใจได้ง่าย เช่น ลืมใส่ WHERE ซึ่งเป็นข้อผิดพลาดที่ผู้สัมภาษณ์ต้องการตรวจจับพอดี

-- old implicit join
SELECT c.name, o.amount
FROM customers c, orders o
WHERE o.customer_id = c.id;

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

ตรวจสอบอย่างรวดเร็ว

ทดสอบแนวคิดหลักของการจับคู่ด้วย INNER JOIN

สรุป: INNER JOIN จับคู่อย่างไร

ประเด็นสำคัญที่ควรกล่าวซ้ำในการสัมภาษณ์:

  • INNER JOIN เก็บไว้เฉพาะคู่ที่ตรงกันเท่านั้น แถวที่ไม่มีคู่ตรงกันจากทั้งสองฝั่งจะหายไป
  • แบบจำลองในใจ: สร้างคู่ผู้สมัครทั้งหมดก่อน แล้วเก็บเฉพาะคู่ที่เพรดิเคตของ ON เป็นจริง
  • ผลลัพธ์ไม่ขึ้นกับลำดับ และคีย์เวิร์ด INNER เป็นสิ่งที่ไม่จำเป็นต้องใส่
  • ON สามารถใช้คีย์ประกอบ ช่วงค่า และอสมการได้ ไม่ใช่แค่ = เพียงรายการเดียว
  • ใช้ JOIN ... ON อย่างชัดเจนร่วมกับชื่อแทนที่เข้าใจง่าย เพื่อหลีกเลี่ยงข้อผิดพลาดจากคอลัมน์กำกวมและผลคูณคาร์ทีเซียนโดยไม่ตั้งใจ

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

บทเรียน “วิธีที่ INNER JOIN จับคู่แถว” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “วิธีที่ INNER JOIN จับคู่แถว”

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

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

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

บทเรียน “วิธีที่ INNER JOIN จับคู่แถว” ใช้เวลานานแค่ไหน

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

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

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

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

  1. วิธีที่ INNER JOIN จับคู่แถว
  2. ON เทียบกับ WHERE ในการเชื่อมตาราง
  3. การแตกแขนงของการเชื่อมตารางและการเพิ่มจำนวนแถว
  4. เชื่อมตารางสามตารางขึ้นไป
← กลับไปที่ Coding Interview Prep