mySQL:如何编写满足两个或多个条件的查询

mySQL:如何编写满足两个或多个条件的查询,mysql,sql,database,Mysql,Sql,Database,给定表格: Departments: dept_id, dept_name Employees: dept_id, emp_id, salary 我试图提出一个查询,显示部门id、部门名称、特定部门的平均工资以及该部门的员工人数,其中部门员工少于20人,部门平均工资低于2000人 SELECT d.dept_id, d.dept_name, COUNT(*) AS count FROM employees e INNER JOIN dept d ON e.dep

给定表格:

Departments: dept_id, dept_name
Employees: dept_id, emp_id, salary
我试图提出一个查询,显示部门id、部门名称、特定部门的平均工资以及该部门的员工人数,其中部门员工少于20人,部门平均工资低于2000人

SELECT
    d.dept_id,
    d.dept_name,
    COUNT(*) AS count
FROM employees e
INNER JOIN dept d
    ON e.department_id = d.department_id 
GROUP BY
    d.dept_id    -- or maybe GROUP BY d.dept_id, d.dept_name if this doesn't work
HAVING 
    COUNT(*) < 20 AND
    AVG(salary) < 2000;
下面是我用来显示工资低于2000的员工的查询:

这就是我的薪水

SELECT dept_id, salary
FROM employees
WHERE (salary) < 2000;
如何在单个查询中实现它,使其符合规范?

在查询中添加HAVING子句,该子句仅限于平均工资低于2000的部门

SELECT
    d.dept_id,
    d.dept_name,
    COUNT(*) AS count
FROM employees e
INNER JOIN dept d
    ON e.department_id = d.department_id 
GROUP BY
    d.dept_id    -- or maybe GROUP BY d.dept_id, d.dept_name if this doesn't work
HAVING 
    COUNT(*) < 20 AND
    AVG(salary) < 2000;
运行GROUP BY后,WHERE子句适用于单个记录,HAVING子句适用于组。在这种情况下,您需要后者

编辑:最好按dept_id列进行分组,因为这应该始终是唯一的,并且应该是此表中的主键。按部门名称分组的潜在风险是两个不同的部门可能具有相同的名称。

在查询中添加HAVING子句,该子句仅限于平均工资低于2000的部门

SELECT
    d.dept_id,
    d.dept_name,
    COUNT(*) AS count
FROM employees e
INNER JOIN dept d
    ON e.department_id = d.department_id 
GROUP BY
    d.dept_id    -- or maybe GROUP BY d.dept_id, d.dept_name if this doesn't work
HAVING 
    COUNT(*) < 20 AND
    AVG(salary) < 2000;
SELECT count(*) as count,dept.dept_name, salary
FROM employees 
INNER JOIN dept on employees.department_id = dept.department_id 
GROUP BY dept.dept_name HAVING salary < 2000
运行GROUP BY后,WHERE子句适用于单个记录,HAVING子句适用于组。在这种情况下,您需要后者


编辑:最好按dept_id列进行分组,因为这应该始终是唯一的,并且应该是此表中的主键。按部门名称分组的潜在风险是两个不同的部门可能具有相同的名称。

我是否可以使用AND with HAVING子句来满足查询的需要。我已将查询所需的内容斜体化。当您选择d.dept\u name时,dept\u name不在employees中。你能解释一下吗?@somethingels从理论上讲,你的select子句可能包含from之后出现的任何表格中的任何列。在本例中,它的限制性更大,但dept.dept\u name是可在此处选择的完全有效的列。我尝试将dept\u id添加为另一列,但选择组似乎不一致。所有部门名称和部门ID也是唯一的。我的答案中更新的查询应该满足您的需要。我不能再进一步评论了。我可以使用AND with HAVING子句来满足我的查询需求吗。我已将查询所需的内容斜体化。当您选择d.dept\u name时,dept\u name不在employees中。你能解释一下吗?@somethingels从理论上讲,你的select子句可能包含from之后出现的任何表格中的任何列。在本例中,它的限制性更大,但dept.dept\u name是可在此处选择的完全有效的列。我尝试将dept\u id添加为另一列,但选择组似乎不一致。所有部门名称和部门ID也是唯一的。我的答案中更新的查询应该满足您的需要。我不能再进一步评论了。我可以使用AND with HAVING子句来满足我的查询需求吗。我已将我的问题用斜体表示needs@Murat蒂菲克西:那应该是一个AVGsalary。@somethingelse:是的,使用和。你可以尝试一下,或者用谷歌搜索一下,而不是问这个问题。选择count*作为count,dept.dept\u name,AVGemployees.salary作为avgSalary从员工内部加入员工的部门。department\u id=dept.department\u id,其中employees.department\u id在中从avgSalary<2000的员工中选择dept\u id,按部门分组\u id按部门分组\u id;啊,不。只需在原始查询中将salary更改为AVGemployees.salaray,并在其末尾添加并计算*<20。我是否可以使用and with HAVING子句来满足查询的需要。我已将我的问题用斜体表示needs@Murat蒂菲克西:那应该是一个AVGsalary。@somethingelse:是的,使用和。你可以尝试一下,或者用谷歌搜索一下,而不是问这个问题。选择count*作为count,dept.dept\u name,AVGemployees.salary作为avgSalary从员工内部加入员工的部门。department\u id=dept.department\u id,其中employees.department\u id在中从avgSalary<2000的员工中选择dept\u id,按部门分组\u id按部门分组\u id;啊,不。只需在原始查询中将salary更改为AVGemployees.salaray,然后在查询结束时添加并计算*<20。
SELECT count(*) as count,dept.dept_name, salary
FROM employees 
INNER JOIN dept on employees.department_id = dept.department_id 
GROUP BY dept.dept_name HAVING salary < 2000