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

ใช้ COUNT(*) ใน WHERE Clause โดยไม่ต้องเขียน Subquery ซ้ำใน MySQL

สามารถอ้างอิง 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);