สามารถอ้างอิง COUNT(*) ของตารางเดียวกันใน WHERE clause ได้โดยตรงผ่าน Subquery
รูปแบบคำสั่ง
SELECT yourColumnName FROM yourTableName WHERE (SELECT COUNT(*) FROM yourTableName) = 2;
ตัวอย่าง
1. สร้างตารางและข้อมูล 9 แถว
mysql> create table CountWithSubqueryDemo (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EmployeeName varchar(20)
-> );
mysql> insert into CountWithSubqueryDemo(EmployeeName) values
-> ('John'),(NULL),('Carol'),(''),('Bob'),(NULL),('Sam'),('Mike'),('James');
2. Query นับแถว = 2 (ไม่มีผลเพราะมี 9 แถว)
mysql> select Id,EmployeeName from CountWithSubqueryDemo
-> where (select count(*) from CountWithSubqueryDemo) = 2;
Empty set (0.03 sec)
3. ลบข้อมูลและใส่ 2 แถว
mysql> truncate table CountWithSubqueryDemo;
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('James'),(NULL);
4. Query อีกครั้ง (มีผลลัพธ์)
mysql> select Id,EmployeeName from CountWithSubqueryDemo
-> where (select count(*) from CountWithSubqueryDemo) = 2;
+----+--------------+ | Id | EmployeeName | +----+--------------+ | 1 | James | | 2 | NULL | +----+--------------+
⚡ ประสิทธิภาพและการเพิ่มประสิทธิภาพ
ปัญหา: Subquery จะรันนับแถวทุกครั้งที่ประเมิน WHERE
แก้ไขด้วย CROSS JOIN (รันนับครั้งเดียว):
SELECT t.Id, t.EmployeeName FROM CountWithSubqueryDemo t CROSS JOIN (SELECT COUNT(*) as cnt FROM CountWithSubqueryDemo) c WHERE c.cnt = 2;
MySQL 8.0+ ใช้ CTE:
WITH cnt AS (SELECT COUNT(*) as c FROM CountWithSubqueryDemo) SELECT Id, EmployeeName FROM CountWithSubqueryDemo, cnt WHERE cnt.c = 2;
กรณีใช้ HAVING (สำหรับ GROUP BY)
SELECT department, COUNT(*) as emp_count FROM employees GROUP BY department HAVING COUNT(*) = (SELECT COUNT(*) FROM departments);