我在使用子查询创建查询时遇到一些问题。我必须使用子查询,因为这是学校的作业。
我有两张表,一张是员工表,一张是部门表。我必须从这些表中返回收入超过部门平均工资的员工。
这就是我到目前为止所拥有的:
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/