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

CROSS JOIN และผลคูณคาร์ทีเซียน

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

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

การ JOIN ที่ผู้สัมภาษณ์ใช้เป็นกับดัก

CROSS JOIN จับคู่ทุกแถวของตารางซ้ายกับทุกแถวของตารางขวา โดยไม่มีเงื่อนไข ON หากตาราง A มี 4 แถวและตาราง B มี 3 แถว ผลลัพธ์จะมี 4 x 3 = 12 แถว

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

ไวยากรณ์ CROSS JOIN แบบระบุอย่างชัดเจน

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

ที่นี่ เราจับคู่ขนาดทุกขนาดกับสีทุกสีเพื่อสร้างเมทริกซ์สินค้าที่ครบถ้วน

SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;

ไวยากรณ์เครื่องหมายจุลภาคแบบเก่า

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

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

-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;

ตัวอย่างแบบลงมือทำ: การสร้างตารางขนาด

สมมติว่าร้านค้าขายเสื้อยืด 3 ขนาดและ 4 สี และต้องการให้มีหนึ่งแถวสำหรับรูปแบบสินค้าที่เป็นไปได้ทุกแบบ แม้แต่แบบที่ยังไม่มีในสต็อก การเชื่อมแบบไขว้จะสร้างชุดผสมทั้ง 12 แบบได้ในขั้นตอนเดียว

นี่คือการใช้งาน โดยเจตนาที่พบบ่อยที่สุด นั่นคือการสร้างตารางตัวเลือกที่ครบถ้วน

SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;

การสร้างตารางปฏิทิน

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

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

SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';

การระเบิดของผลคูณคาร์ทีเซียนโดยไม่ตั้งใจ

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

หาก orders มี 100,000 แถว และ customers มี 50,000 แถว ผลลัพธ์จะมี 5 พันล้านแถว คำสั่งสอบถามจะค้าง ใช้หน่วยความจำจนล้น และตัวเลขจะสูงเกินจริงอย่างมาก การสังเกตรูปแบบนี้ในการตรวจสอบโค้ดถือเป็นสัญญาณที่ดี

-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rows

วิธีสังเกตการเชื่อมแบบไขว้โดยไม่ตั้งใจ

อาการที่ผู้สัมภาษณ์ต้องการให้คุณระบุมีดังนี้:

  • จำนวนแถวมีค่าประมาณ ผลคูณ ของขนาดตารางทั้งสอง ไม่ใช่ผลบวก
  • ค่ารวมต่าง ๆ เช่น SUM สูงเกินจริงเป็นจำนวนเท่าคงที่
  • แผนการทำงานของคำสั่งสอบถามแสดง ลูปซ้อน โดยไม่มีตัวกรองการเชื่อม

วิธีแก้เกือบทุกครั้งคือมีเงื่อนไขเท่ากันระหว่างตารางใน ON หรือ WHERE ที่หายไป

CROSS JOIN เทียบกับ INNER JOIN ที่มี ON เป็นจริงเสมอ

โดยตรรกะแล้ว CROSS JOIN เหมือนกับ INNER JOIN ... ON 1=1 ทั้งสองแบบให้ผลเป็นผลคูณคาร์ทีเซียนที่ครบถ้วน

ที่จริงแล้ว การเชื่อมแบบด้านในก็คือการเชื่อมแบบไขว้ แล้วกรองด้วยเงื่อนไข ON แบบจำลองทางความคิดนี้อธิบายได้ว่าเหตุใดเงื่อนไขที่หายไปจึงทำให้การเชื่อมแบบด้านในกลายเป็นการเชื่อมแบบไขว้

-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;

การเชื่อมแบบไขว้กับตารางตัวเลข

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

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

SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;

ประสิทธิภาพและแนวทางปฏิบัติที่ปลอดภัย

เนื่องจากผลลัพธ์เติบโตตามการคูณ จึงไม่ควรใช้การเชื่อมแบบไขว้กับตารางขนาดใหญ่สองตาราง อย่างน้อยหนึ่งฝั่งต้องมีขนาดเล็ก เช่น รายการขนาด ปฏิทินขนาดเล็ก หรือตารางตัวเลข

ในการสัมภาษณ์งาน ควรกล่าวให้ชัดเจนว่า 'CROSS JOIN จะปลอดภัยก็ต่อเมื่อฝั่งหนึ่งมีขนาดเล็กและมีขอบเขตแน่นอน มิฉะนั้นผลลัพธ์จะจัดการไม่ได้' ประโยคนี้แสดงให้เห็นถึงวิจารณญาณ ไม่ใช่แค่ความรู้ด้านไวยากรณ์

เมื่อใดควรเลือกใช้ CROSS JOIN

ใช้ CROSS JOIN โดยเจตนาเมื่อคุณต้องการทุกชุดผสมของข้อมูลสองชุด:

  • สร้างเมทริกซ์ตัวเลือก เช่น ขนาด x สี
  • ทำอนุกรมเวลาให้มีข้อมูลครบ เช่น ร้านค้า x วัน ก่อนใช้ LEFT JOIN
  • ขยายแถวด้วยตารางตัวเลข

หากคุณไม่ต้องการทุกชุดผสม แทบจะแน่นอนว่าควรใช้การเชื่อมที่มีเงื่อนไข ON แทน

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

ทดสอบความเข้าใจเกี่ยวกับผลคูณคาร์ทีเซียน

สรุป: CROSS JOIN

ประเด็นสำคัญ:

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

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

บทเรียน “CROSS JOIN และผลคูณคาร์ทีเซียน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “CROSS JOIN และผลคูณคาร์ทีเซียน”

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

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

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

บทเรียน “CROSS JOIN และผลคูณคาร์ทีเซียน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. CROSS JOIN และผลคูณคาร์ทีเซียน
  2. SELF JOIN สำหรับโครงสร้างลำดับชั้น
  3. เปรียบเทียบแถวภายในตารางเดียวกัน
  4. เลือกประเภทการเชื่อมตารางที่เหมาะสม
← กลับไปที่ Coding Interview Prep