วิธีที่ INNER JOIN จับคู่แถว
แนวคิดเรื่องการจับคู่แถวที่ช่วยให้ตอบคำถามเกี่ยวกับการเชื่อมตารางได้ง่ายขึ้น
วิธีที่ INNER JOIN จับคู่แถว เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL 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) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “วิธีที่ INNER JOIN จับคู่แถว”
แนวคิดเรื่องการจับคู่แถวที่ช่วยให้ตอบคำถามเกี่ยวกับการเชื่อมตารางได้ง่ายขึ้น คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “วิธีที่ INNER JOIN จับคู่แถว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- วิธีที่ INNER JOIN จับคู่แถว
- ON เทียบกับ WHERE ในการเชื่อมตาราง
- การแตกแขนงของการเชื่อมตารางและการเพิ่มจำนวนแถว
- เชื่อมตารางสามตารางขึ้นไป