การหาค่าสูงสุดและต่ำสุดจากหลายตารางด้วย UNION และ Aggregate Functions
เมื่อต้องการหาค่าสูงสุด (MAX) และต่ำสุด (MIN) จากคอลัมน์ที่อยู่ในตารางต่างกัน ให้ใช้ UNION รวมข้อมูลก่อน แล้วค่อยใช้ Aggregate Function
รูปแบบคำสั่ง
SELECT MAX(common_col) AS max_val, MIN(common_col) AS min_val
FROM (
SELECT col1 AS common_col FROM table1
UNION
SELECT col2 AS common_col FROM table2
) AS combined;
ตัวอย่าง: หาคะแนนสูงสุดและต่ำสุดจาก 2 ตาราง
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable1 (
UniqueId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score1 INT
);
INSERT INTO DemoTable1 (Score1) VALUES (56), (76), (65);
CREATE TABLE DemoTable2 (
UniqueId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score2 INT
);
INSERT INTO DemoTable2 (Score2) VALUES (67), (94), (98);
2. ดูข้อมูลทั้งสองตาราง
SELECT * FROM DemoTable1;
SELECT * FROM DemoTable2;
DemoTable1: 56, 76, 65 | DemoTable2: 67, 94, 98
3. หาค่าสูงสุดและต่ำสุดรวม 2 ตาราง
SELECT
MAX(commonValue) AS Highest_Value,
MIN(commonValue) AS Lowest_Value
FROM (
SELECT Score1 AS commonValue FROM DemoTable1
UNION
SELECT Score2 AS commonValue FROM DemoTable2
) AS tbl;
ผลลัพธ์:
+---------------+--------------+
| Highest_Value | Lowest_Value |
+---------------+--------------+
| 98 | 56 |
+---------------+--------------+
คำอธิบาย
UNIONรวมผลลัพธ์ของ 2 SELECT และ ลบค่าซ้ำ (DISTINCT โดยอัตโนมัติ)UNION ALLจะรวมค่าซ้ำด้วย (เร็วกว่า หากแน่ใจว่าไม่ซ้ำหรือต้องการซ้ำ)- Subquery ต้องมี
AS tbl(Alias) ตามกฎของ MySQL - คอลัมน์ใน UNION ต้องมีจำนวนและชนิดข้อมูลตรงกัน
ขยายไปหลายตาราง
SELECT MAX(val) AS MaxVal, MIN(val) AS MinVal FROM (
SELECT Score1 AS val FROM Table1
UNION ALL
SELECT Score2 AS val FROM Table2
UNION ALL
SELECT Score3 AS val FROM Table3
UNION ALL
SELECT Score4 AS val FROM Table4
) AS all_scores;
ประสิทธิภาพ
- หากตารางใหญ่ ให้เพิ่ม Index บนคอลัมน์ที่ต้องการ MAX/MIN
UNION ALLเร็วกว่าUNIONเพราะไม่ต้องตรวจสอบค่าซ้ำ- สำหรับตารางใหญ่มาก ควรคำนวณ MAX/MIN แยกตารางก่อน แล้วรวมใน Application Layer
กรณีต้องการรู้ว่าค่าสูงสุดมาจากตารางไหน
SELECT 'Table1' AS source, MAX(Score1) AS val FROM DemoTable1
UNION ALL
SELECT 'Table2', MAX(Score2) FROM DemoTable2
ORDER BY val DESC LIMIT 1;