Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การ SELECT จากสองตารางใน MySQL ด้วย Cross Join (Cartesian Product)

ใน 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