0

假设我有以下数据库模型:

在此处输入图像描述

问题如下:

列出所有部门名称和部门中的员工总数。员工总数列应重命名为“total_emps”。从员工人数最少的部门到员工人数最多的部门对列表进行排序。注意:您需要在列表中包括一个部门,即使该部门当前没有分配任何员工。

这是我的尝试:

SELECT Department.deptname

   (SELECT COUNT(*)
   FROM Department
   WHERE Department.empno = Employee.empno ) AS total_emps

FROM Department

我很确定我的解决方案不正确,因为它不包括没有员工的部门。你如何使用左内连接来解决这个问题?

4

2 回答 2

1

首先,它是一个左连接。现在,对于您的查询,您希望加入基于 的 2 个表deptno,然后还按deptno(或deptname,因为这可能是唯一的)分组,以确保我们为表中的每个唯一部门完成任何聚合。最后,使用count函数完成计数,导致以下查询:

select d.deptname, count(e.empno) as total_emps
from department d 
left join employee e on d.deptno = e.deptno
group by d.deptname

SQLFiddle

请注意,由于我们想要所有记录,department无论是否有匹配的记录employee,都department必须出现在连接的左侧。我们可以通过交换连接中 2 个表的位置来使用右外连接来完成相同的操作。

于 2015-01-20T12:01:42.233 回答
1

您尝试编写的查询是:(
表创建从shree.pat18的 sqlfiddle 修改为这个sqlfiddle

create table department (deptno int, deptname varchar(20));
insert into department values (1, 'a'),(2, 'b'),(3, 'c');
create table employee (empno int, deptno int);
insert into employee values (1,1),(2,1),(3,3);

SELECT d.deptname, 
    (SELECT COUNT(*)
    FROM EMPLOYEE e
    WHERE d.deptno = e.deptno ) AS total_emps
FROM DEPARTMENT d
ORDER BY total_emps ASC;

(您从DEPARTMENT代替计数EMPLOYEE并比较empno代替deptno。并且您遗漏了一个逗号。)

(您被要求提供每个部门的名称和员工人数,所以这会返回。在实践中,deptno如果deptname不是唯一的,我们将包括一个可能是唯一的。)

我很确定我的解决方案不正确,因为它不包括没有员工的部门。

即使您的答案版本的查询(添加了缺少的逗号)也有一个外部选择,无论子选择返回什么,它都会返回每个部门的计数。所以我不知道你为什么/如何认为它不会。

如果您想使用 LEFT (OUTER) JOIN,那么DEPARTMENT没有员工的行会被 NULL 扩展。但是一列的 COUNT 只计算非 NULL 行。

SELECT d.deptname, COUNT(e.empno) AS total_emps
FROM DEPARTMENT d
LEFT JOIN EMPLOYEE e
ON d.deptno = e.deptno
GROUP BY d.deptno
ORDER BY total_emps ASC;

(注意 LEFT JOIN 版本使用了更多概念:LEFT JOIN 扩展 NULL、GROUP BY 和 COUNT 的 NULL 行为用于非*。)

于 2015-01-20T12:36:16.300 回答