การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน
ใช้ CROSS JOIN อย่างมีเจตนาเพื่อสร้างคู่แบบผสมทุกแบบ และหลีกเลี่ยงผลคูณคาร์ทีเซียนขนาดใหญ่จากคีย์การเชื่อมที่หายไป
การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
CROSS JOIN คืออะไร
CROSS JOIN สร้างชุดผสมของแถวทุกคู่: ได้แถวผลลัพธ์จำนวน m × n แถว และไม่มีส่วนคำสั่ง ON
SELECT * FROM a CROSS JOIN b;
-- Equivalent:
SELECT * FROM a, b; -- comma join, no conditionผลคูณคาร์ทีเซียนโดยไม่ได้ตั้งใจ
ข้อผิดพลาดคลาสสิกคือ ลืมเงื่อนไข JOIN ทำให้ทุกแถวของ A ถูกจับคู่กับทุกแถวของ B
SELECT u.email, o.id
FROM users u, orders o; -- missing WHERE u.id = o.user_id !
-- m users × n orders rows — millions!กรณีใช้งานที่ตั้งใจ
CROSS JOIN มีประโยชน์เมื่อคุณต้องการคู่ผสมทั้งหมดจริง ๆ:
- การผสมหมวดหมู่ × ช่วงเวลา สำหรับรายงานที่ต้องแสดงช่วงที่ไม่มีข้อมูล
- ข้อมูลทดสอบ: ผู้ใช้ทุกคน × ผลิตภัณฑ์ทุกชิ้น
- ปฏิทิน: ร้านค้าทุกแห่ง × วันที่ทุกวัน
ตัวอย่างปฏิทิน × ร้านค้า
เติมวันที่มียอดเป็นศูนย์ให้ร้านค้าทุกแห่ง:
SELECT d.day, s.id, COALESCE(SUM(o.total), 0) AS revenue
FROM generate_series(CURRENT_DATE - 30, CURRENT_DATE, '1 day') AS d(day)
CROSS JOIN stores s
LEFT JOIN orders o ON o.store_id = s.id
AND date_trunc('day', o.created_at) = d.day
GROUP BY d.day, s.id
ORDER BY d.day, s.id;ผลคูณคาร์ทีเซียนและ EXPLAIN
ผลคูณคาร์ทีเซียนที่ไม่ได้ตั้งใจจะแสดงเป็นจำนวนแถวมหาศาลใน EXPLAIN ANALYZE:
EXPLAIN ANALYZE
SELECT u.email, o.id FROM users u, orders o;
-- Nested Loop (rows=10000000) ← warning signLATERAL: CROSS JOIN แบบมีเงื่อนไข
LATERAL JOIN คล้ายกับ CROSS JOIN แต่ด้านขวาสามารถอ้างอิงด้านซ้ายได้ ซึ่งจะกล่าวถึงในบทเรียนถัดไป
การเรียงสับเปลี่ยนและการจัดหมู่
สำหรับคู่ (A,B) ที่ไม่ต้องการรายการซ้ำ ให้เพิ่มการเปรียบเทียบใน ON:
SELECT a.id, b.id
FROM products a
JOIN products b ON a.id < b.id;
-- All unique pairs of products, no (A,A), no (B,A) duplicates of (A,B)CROSS JOIN กับ VALUES
แทรกชุดข้อมูลขนาดเล็กไว้ในคำสั่ง:
SELECT u.email, c.code
FROM users u
CROSS JOIN (VALUES ('EUR'), ('USD'), ('GBP')) AS c(code);หลีกเลี่ยงรูปแบบการ JOIN ด้วยจุลภาค
การ JOIN โดยนัยด้วยจุลภาค (FROM a, b) สามารถใช้ได้ตามกฎหมาย SQL แต่ซ่อนเจตนาของคำสั่งไว้ ควรใช้ CROSS JOIN อย่างชัดเจนแทน:
-- Don't (looks like a typo):
FROM users, orders
-- Do:
FROM users CROSS JOIN ordersประสิทธิภาพ
CROSS JOIN เองมีต้นทุนต่ำ เพราะไม่มีเงื่อนไขให้ประเมิน ต้นทุนอยู่ที่จำนวนแถวผลลัพธ์: 10k × 10k = 100M แถว
สรุป
CROSS JOIN = คู่ผสมทั้งหมด
- ใช้โดยตั้งใจสำหรับสร้างชุดผสม
- ระวังผลคูณคาร์ทีเซียนโดยไม่ได้ตั้งใจ (ไม่มี WHERE)
- ใช้ร่วมกับ generate_series สำหรับรายงานที่ต้องเติมช่วงข้อมูลที่หายไป
ตรวจสอบความเข้าใจ
คุณเขียน SELECT * FROM users u, orders o; โดยไม่มี WHERE ผลลัพธ์คืออะไร
คำถามที่พบบ่อย
บทเรียน “การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน”
ใช้ CROSS JOIN อย่างมีเจตนาเพื่อสร้างคู่แบบผสมทุกแบบ และหลีกเลี่ยงผลคูณคาร์ทีเซียนขนาดใหญ่จากคีย์การเชื่อมที่หายไป คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน
- การเชื่อมแบบ Lateral (LATERAL JOIN)
- การเชื่อมแบบตัดออกและกึ่งเชื่อม (NOT EXISTS)
- การปรับประสิทธิภาพการเชื่อมหลายตาราง