Syntax: Comma Join = Cross Join
-- Syntax 1: Comma (Implicit Cross Join)
SELECT * FROM table1, table2;
-- Syntax 2: Explicit Cross Join
SELECT * FROM table1 CROSS JOIN table2;
ทั้งสองให้ผลลัพธ์เหมือนกัน: Cartesian Product
ตัวอย่าง
mysql> CREATE TABLE DemoTable1882 (Id INT);
mysql> INSERT INTO DemoTable1882 VALUES(10), (20), (30);
mysql> CREATE TABLE DemoTable1883 (Id INT);
mysql> INSERT INTO DemoTable1883 VALUES(100), (101), (102);
Comma Join
mysql> SELECT * FROM DemoTable1882, DemoTable1883;
ผลลัพธ์ (3 × 3 = 9 แถว):
+------+------+
| Id | Id |
+------+------+
| 10 | 100 |
| 20 | 100 |
| 30 | 100 |
| 10 | 101 |
| 20 | 101 |
| 30 | 101 |
| 10 | 102 |
| 20 | 102 |
| 30 | 102 |
+------+------+
CROSS JOIN (Explicit)
mysql> SELECT * FROM DemoTable1882 CROSS JOIN DemoTable1883;
ผลลัพธ์เหมือนกัน
ความแตกต่างและข้อแนะนำ
| รูปแบบ | ข้อดี | ข้อเสีย |
|---|---|---|
| Comma (table1, table2) | สั้น กว้างขวาง | สับสนกับ INNER JOIN, Deprecated Style |
| CROSS JOIN | ชัดเจน เป็น Standard SQL | ยาวกว่าเล็กน้อย |
ข้อควรระวัง
- Cartesian Product ขยายขนาดข้อมูลมาก: 10,000 × 10,000 = 100M Rows
- ใช้ WHERE เพื่อจำกัด (กลายเป็น Implicit Inner Join)
- MySQL จัดการ Comma Join เป็น CROSS JOIN ภายใน
- ANSI SQL แนะนำใช้ Explicit JOIN Syntax
เมื่อไหร่ควรใช้ Cross Join
- สร้าง Test Data / Number Table
- Generate Combinations (Date × Product × Store)
- Matrix Operations
- การคำนวณสถิติที่ต้องการทุกคู่
ตัวอย่างสร้าง Number Table
SELECT a.N + b.N * 10 + 1 AS num
FROM (SELECT 0 N UNION ALL SELECT 1 UNION ALL SELECT 2 ... SELECT 9) a
CROSS JOIN (SELECT 0 N UNION ALL SELECT 1 ... SELECT 9) b
ORDER BY num; -- 1-100