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

นับจำนวนแถวจากหลายตารางใน MySQL พร้อมกัน (Multiple Table Count)

นับ COUNT(*) จากหลายตารางในคำสั่งเดียว

ใช้ Subquery ใน SELECT Clause แต่ละ Subquery นับจากตารางหนึ่ง แล้วรวมผลลัพธ์เป็นแถวเดียว หลายคอลัมน์

ไวยากรณ์

SELECT 
    (SELECT COUNT(*) FROM table1) AS table1_count,
    (SELECT COUNT(*) FROM table2) AS table2_count
FROM DUAL;

DUAL เป็น Dummy Table ใน MySQL (และ Oracle) ใช้เมื่อต้องการ SELECT โดยไม่มี FROM Table จริง

สร้างตาราง 1 และข้อมูล (6 แถว)

mysql> CREATE TABLE DemoTable1 (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
Query OK, 0 rows affected (0.56 sec)

mysql> INSERT INTO DemoTable1 VALUES(),(),(),(),(),();
Query OK, 6 rows affected

สร้างตาราง 2 และข้อมูล (2 แถว)

mysql> CREATE TABLE DemoTable2 (Name VARCHAR(20));
Query OK, 0 rows affected (0.64 sec)

mysql> INSERT INTO DemoTable2 VALUES('Chris'), ('David');
Query OK, 2 rows affected

คำสั่งนับจากทั้งสองตาราง

mysql> SELECT
    -> (SELECT COUNT(*) FROM DemoTable1) AS FirstTable1Count,
    -> (SELECT COUNT(*) FROM DemoTable2) AS SecondTable2Count
    -> FROM DUAL;

ผลลัพธ์

+---------------------+----------------------+
| FirstTable1Count    | SecondTable2Count    |
+---------------------+----------------------+
|                   6 |                    2 |
+---------------------+----------------------+

วิธีอื่น: UNION ALL (แนวตั้ง)

SELECT 'DemoTable1' AS table_name, COUNT(*) AS row_count FROM DemoTable1
UNION ALL
SELECT 'DemoTable2', COUNT(*) FROM DemoTable2;

ผลลัพธ์แนวตั้ง

+------------+-----------+
| table_name | row_count |
+------------+-----------+
| DemoTable1 |         6 |
| DemoTable2 |         2 |
+------------+-----------+

MySQL 8.0: ใช้ VALUES ROW Constructor

SELECT t.table_name, t.row_count
FROM (
    VALUES ROW('DemoTable1', (SELECT COUNT(*) FROM DemoTable1)),
           ROW('DemoTable2', (SELECT COUNT(*) FROM DemoTable2))
) AS t(table_name, row_count);

Information Schema (สำหรับนับทุกตารางใน Database)

SELECT TABLE_NAME, TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_database_name';

หมายเหตุ: TABLE_ROWS เป็นประมาณการสำหรับ InnoDB (ไม่ Real-time) ใช้ COUNT(*) สำหรับค่าที่แม่นยำ

Performance: COUNT(*) บน InnoDB

  • InnoDB ไม่เก็บ Row Count ไว้ (ต่าง MyISAM)
  • COUNT(*) ต้อง Scan Index (Primary Key) ทุกครั้ง
  • ตารางใหญ่: ใช้ Trigger/Maintain Counter Table / Approximate từ Information Schema