ใน MySQL สามารถ SELECT จากสองตารางพร้อมกันได้โดยระบุชื่อตารางคั่นด้วย Comma (FROM table1, table2) ซึ่งจะสร้าง Cartesian Product (Cross Join) คือ ทุกแถวของตาราง 1 จับคู่กับทุกแถวของตาราง 2
ตัวอย่างการใช้งาน
สร้างตาราง 1 (มี 3 แถว):
mysql> CREATE TABLE DemoTable1 (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY); mysql> INSERT INTO DemoTable1 VALUES (), (), ();
สร้างตาราง 2 (มี 3 แถว):
mysql> CREATE TABLE DemoTable2 (FirstName VARCHAR(10));
mysql> INSERT INTO DemoTable2 VALUES ('Chris'), ('David'), ('Sam');
SELECT จากสองตาราง (Cross Join):
mysql> SELECT Id, FirstName FROM DemoTable1, DemoTable2;
ผลลัพธ์ (3 × 3 = 9 แถว):
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Chris | | 3 | Chris | | 1 | David | | 2 | David | | 3 | David | | 1 | Sam | | 2 | Sam | | 3 | Sam | +----+-----------+
คำเตือนสำคัญ
- Cartesian Product จะสร้างแถวมากมาย (Rows1 × Rows2) → อาจทำให้ Query ค้าง/หน่วยความจำเต็ม
- ตาราง 10,000 แถว × 10,000 แถว = 100 ล้านแถว!
- ส่วนใหญ่ต้องการ INNER JOIN (มีเงื่อนไขเชื่อมโยง) ไม่ใช่ Cross Join
วิธีที่ถูกต้อง: ใช้ JOIN พร้อม ON
-- Inner Join (มาตรฐาน แนะนำ) SELECT t1.Id, t2.FirstName FROM DemoTable1 t1 INNER JOIN DemoTable2 t2 ON t1.Id = t2.Id; -- ต้องมีคอลัมน์เชื่อมโยง -- Left Join (เก็บทั้งหมดจาก t1) SELECT t1.Id, t2.FirstName FROM DemoTable1 t1 LEFT JOIN DemoTable2 t2 ON t1.Id = t2.Id;
กรณีที่ใช้ Cross Join จริงๆ
- สร้างข้อมูลทดสอบ/Generate Series:
SELECT * FROM (SELECT 1 UNION ALL SELECT 2) a, (SELECT 1 UNION ALL SELECT 2) b - Matrix/Grid Generation: พิกัด X × Y
- Combinatorics: หาคู่ผสมทั้งหมด
- Benchmarking: สร้างข้อมูลมากอย่างรวดเร็ว
Syntax แบบชัดเจน (Explicit)
-- Cross Join แบบ Explicit (MySQL 8.0+) SELECT * FROM DemoTable1 CROSS JOIN DemoTable2; -- INNER JOIN (Default JOIN) SELECT * FROM DemoTable1 JOIN DemoTable2 ON condition;
สรุป
FROM a, b= CROSS JOIN (Cartesian Product) - ใช้ด้วยความระมัดระวัง- ปกติใช้
INNER JOIN ... ONหรือLEFT JOIN ... ON - หากไม่มีความสัมพันธ์ระหว่างตาราง → ไม่ควร JOIN