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

รวมหลาย SELECT Query ขั้นสูงใน MySQL ด้วย UNION

ใช้ UNION รวมผลลัพธ์จากหลาย SELECT

UNION รวม Result Set จากหลาย SELECT Statement ต้องมีจำนวนคอลัมน์และ Data Type ตรงกัน

Syntax

(SELECT col1, col2 FROM table1)
UNION
(SELECT col1, col2 FROM table2)
ORDER BY col1 DESC;

ตัวอย่าง: รวมข้อมูลจาก 2 ตาราง

CREATE TABLE DemoTable1 (Value1 INT, Value2 INT);
CREATE TABLE DemoTable2 (Number1 INT, Number2 INT);

INSERT INTO DemoTable1 VALUES(10,29), (100,190), (40,101);
INSERT INTO DemoTable2 VALUES(100,290), (200,390), (50,170);

Query รวมและเรียง:

(SELECT Value1, Value2 FROM DemoTable1)
UNION
(SELECT Number1 AS Value1, Number2 AS Value2 FROM DemoTable2)
ORDER BY Value1 DESC;

ผลลัพธ์:

+--------+--------+
| Value1 | Value2 |
+--------+--------+
| 200    | 390    |
| 100    | 290    |
| 100    | 190    |
| 50     | 170    |
| 40     | 101    |
| 10     | 29     |
+--------+--------+

UNION vs UNION ALL

คำสั่งพฤติกรรมPerformanceใช้เมื่อไหร่
UNIONลบ Duplicate Rows (Distinct)ช้ากว่า (ต้อง Sort/Hash เพื่อ Dedup)ต้องการ Unique Rows
UNION ALLเก็บทุกแถว รวม Duplicateเร็วกว่า (แค่ Concatenate)ไม่แคร์ Duplicate, หรือรู้ว่าไม่มี Dup

ข้อจำกัดและ Best Practices

  1. Column Count & Type ต้องตรงกัน - ใช้ Alias (AS) เพื่อจับคู่ชื่อคอลัมน์
  2. ORDER BY/LIMIT - วางไว้ท้ายสุดหลัง UNION ทั้งหมด (หรือใน Subquery)
  3. Parentheses - ใช้วงเล็บครอบแต่ละ SELECT เพื่อความชัดเจน
  4. Data Type Precedence - MySQL จะเลือก Type ที่ "ใหญ่กว่า" อัตโนมัติ (INT + DECIMAL = DECIMAL)

ตัวอย่าง Advance: UNION กับ WHERE ต่างกัน

(SELECT id, name, 'active' AS status FROM users WHERE status = 1)
UNION ALL
(SELECT id, name, 'inactive' AS status FROM users WHERE status = 0)
UNION ALL
(SELECT id, name, 'pending' AS status FROM users WHERE status = 2)
ORDER BY status, name;

ใช้ WITH (CTE) ทำให้อ่านง่าย (MySQL 8.0+)

WITH combined AS (
    SELECT Value1, Value2 FROM DemoTable1
    UNION ALL
    SELECT Number1, Number2 FROM DemoTable2
)
SELECT * FROM combined ORDER BY Value1 DESC;