mysql - 创建子查询时遇到问题

标签 mysql sql subquery mysql-workbench

我在使用子查询创建查询时遇到一些问题。我必须使用子查询,因为这是学校的作业。

我有两张表,一张是员工表,一张是部门表。我必须从这些表中返回收入超过部门平均工资的员工。

这就是我到目前为止所拥有的:

SELECT 
    ename,
    salary,
    (SELECT 
            department.depname
        FROM
            department
        WHERE
            department.depno = employee.depno) AS depname,
    (SELECT 
            AVG(salary)
        FROM
            employee
        WHERE
            employee.depno IN (SELECT 
                    department.depno
                FROM
                    department)) avgSalary
FROM
    employee
WHERE
    salary > (SELECT 
            AVG(salary)
        FROM
            employee
        WHERE
            employee.depno IN (SELECT 
                    department.depno
                FROM
                    department))

返回:

'JONES', '2975.00', 'RESEARCH', '2073.214286'
'BLAKE', '2850.00', 'SALES', '2073.214286'
'CLARK', '2450.00', 'ACCOUNTING', '2073.214286'
'SCOTT', '3000.00', 'RESEARCH', '2073.214286'
'KING', '5000.00', 'ACCOUNTING', '2073.214286'
'FORD', '3000.00', 'RESEARCH', '2073.214286'

但是平均工资返回所有工资的平均值。但我需要为每个部门执行此操作。

我知道如何通过执行以下查询来做到这一点:

SELECT 
    department.depname,
    (SELECT 
            AVG(salary)
        FROM
            employee
        WHERE
            department.depno = employee.depno) avgSalary
FROM
    department

返回:

ACCOUNTING  2916.666667
RESEARCH    2175.000000
SALES       1566.666667
OPERATIONS  

但我不知道如何组合它们,也不知道是否可以在不使用 join 的情况下组合它们。

任何帮助将不胜感激

编辑:

Table: employee
Columns:
empno decimal(4,0) PK 
ename varchar(10) 
efunction varchar(10) 
boss decimal(4,0) 
employed date 
salary decimal(7,2) 
commission decimal(7,2) 
depno decimal(2,0)

Table: department
Columns:
depno decimal(2,0) PK 
depname varchar(14) 
location varchar(13)

最佳答案

有点像这样......?

mysql> select   *
    -> from     employee e
    -> where    e.employee_salary > (
    ->             select   avg(employee_salary) avg
    ->             from     employee ee
    ->             -- this is how you join them without a join...
    ->             where    ee.department_id=e.department_id
    ->          );
+-------------+---------------+---------------+-----------------+
| employee_id | department_id | employee_name | employee_salary |
+-------------+---------------+---------------+-----------------+
|           2 |             1 | employee 2    |              40 |
|           6 |             1 | employee 6    |              50 |
+-------------+---------------+---------------+-----------------+
2 rows in set (0.04 sec)

哪里....

mysql> select * from employee;
+-------------+---------------+---------------+-----------------+
| employee_id | department_id | employee_name | employee_salary |
+-------------+---------------+---------------+-----------------+
|           1 |             1 | employee 1    |              20 |
|           2 |             1 | employee 2    |              40 |
|           3 |             1 | employee 3    |              30 |
|           4 |             1 | employee 4    |              30 |
|           5 |             1 | employee 5    |              30 |
|           6 |             1 | employee 6    |              50 |
+-------------+---------------+---------------+-----------------+
6 rows in set (0.00 sec)

没有连接...

mysql> select   e.*,
    ->
    ->          (select  department_name
    ->           from    department d
    ->           where   d.department_id=e.department_id) as department_name,
    ->
    ->          (select   avg(employee_salary) avg
    ->             from     employee ee
    ->             where    ee.department_id=e.department_id) as department_average
    ->
    -> from     employee e
    ->
    -> where    e.employee_salary > (
    ->             select   avg(employee_salary) avg
    ->             from     employee ee
    ->             where    ee.department_id=e.department_id
    ->          );
+-------------+---------------+---------------+-----------------+-----------------+--------------------+
| employee_id | department_id | employee_name | employee_salary | department_name | department_average |
+-------------+---------------+---------------+-----------------+-----------------+--------------------+
|           2 |             1 | employee 2    |              40 | department 1    | 33.333333333333336 |
|           6 |             1 | employee 6    |              50 | department 1    | 33.333333333333336 |
+-------------+---------------+---------------+-----------------+-----------------+--------------------+
2 rows in set (0.00 sec)

除非确实有必要,否则您应该真正避免在选择中使用这样的连接,因为在现实生活中最好只使用连接(以提高较大数据集的效率/性能)。不过,where 中的子查询是完全合适的。

关于mysql - 创建子查询时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28944460/

相关文章:

mysql - 从nodejs mysql连接函数返回数据

MySQL 按数字系列分组

java - 在没有巨大列表参数的情况下重写 Hibernate 查询

mysql - 如何编写一个 mysql 子查询,其中一个表根据返回一行的表返回多行?

php - 连接两个 MySQL 查询

python - 系统错误 : The connection has been disabled

sql - 优化使用索引进行聚合查询

SQLITE:无法解释的行为 - 比较适用于某些数字,不适用于其他数字

mysql从子查询中解决外部查询

php - 使用 LIMIT 计算 MySQL 记录