我必须得到部门的名称和其中的员工数量。测试是我的架构。
所以我提出两个问题给我相同的结果 -
第一
SELECT Department.Departmentname,
(
SELECT COUNT(*)
FROM test.Employee
WHERE Employee.Departmentid = Department.idDepartment
) AS NumberOfEmployees
FROM test.Department;
第二
SELECT Department.Departmentname AS NAme,COUNT(Employee.idEmployee) AS Employee_COUNT
FROM test.Department
LEFT JOIN test.Employee
ON Employee.Departmentid = Department.idDepartment
GROUP BY Employee.Departmentid ;
这两项中哪一项是获得所需结果的最佳和最有效的方法?欢迎任何其他解决方案。
请解释为什么特定解决方案更好
请参阅:我是MySQL新手。试着学习最佳实践。
答案 0 :(得分:2)
我的首选项是第二个查询,我将其写为:
SELECT d.Departmentname AS Name, COUNT(e.idEmployee) AS Employee_COUNT
FROM test.Department d LEFT JOIN
test.Employee e
ON e.Departmentid = d.idDepartment
GROUP BY d.Departmentname;
请注意表别名的使用以及GROUP BY
使用与SELECT
相同的列的事实。但是,在MySQL中,此查询不会在DepartmentName
上使用group by
的索引。这意味着GROUP BY
正在进行文件排序,这是一项相对昂贵的操作。
当您编写如下查询时:
SELECT d.Departmentname,
(SELECT COUNT(*)
FROM test.Employee e
WHERE e.Departmentid = d.idDepartment
) AS NumberOfEmployees
FROM test.Department d;
不需要明确的group by
。使用Employee(DepartmentId)
上的索引,这将使用count(*)
的索引,因此该版本通常在MySQL中表现更好。
在您开始拥有数千或数十万行之前,性能差异可能微不足道。