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