将 SQL 查询从 with 子句转移到没有 with 子句
Transferring SQL query from with clause to without with clause
考虑查询:
找出工资总额大于所有部门工资总额平均值的所有部门
with dept_total (dept_name, value) as
(
select dept_name, sum(salary)
from instructor
group by dept_name
),
dept_total_avg(value) as
(
select avg(value)
from dept_total
)
select dept_name
from dept_total, dept_total_avg
where dept_total.value >= dept_total avg.value;
不使用 with 构造重写此查询。
查询基于 Korth 的 The database system concept 提供的 University 模式。我假设我只需要考虑讲师 table 来找到查询的答案。
指导老师(ID、姓名、dept_name、工资)
我可以求出所有部门工资总额的平均值
SELECT AVG(salary) GROUP BY dept_name;
然后我输了。我没有找到继续的方法。
我找到了 that。但我正在寻找更多解释,因为我无法从这个 link.
中理解它
感谢您的帮助。
看了你上一题,发现你用的是mysql5.8,那么你可以使用分析功能
select distinct t1.dept_name
from (
select t1.*,
sum(salary) over(partition by dept_name) val,
sum(salary) over() / count(distinct dept_name) over() avg
from Instructor t1
) t1
where t1.val > t1.avg
在不支持 CTE 的 mySQL 版本中,有几种方法可以做到这一点(我假设这就是他们让您重写查询以省略 with 的原因)。此外,您正在按部门计算平均工资,但问题是要求找到每个部门的平均总工资,然后 return 低于该值的那些。
https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=fefea829cff3e20aea93634f9a4114d6
使用子查询:
SELECT dept_name
FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) d
WHERE salaries > (
SELECT avg(salaries) as avgSalaries FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z
)
加入:
SELECT dept_name
FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) d
CROSS JOIN (
SELECT avg(salaries) as avgSalaries FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z
) avgs
WHERE salaries > avgs.avgSalaries
使用会话变量(在更高版本中已弃用,但仍然有效):
SELECT avg(salaries) INTO @avg FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z;
SELECT @avg;
SELECT dept_name
FROM instructor GROUP BY dept_name
HAVING sum(salary) > @avg;
所有好的技术都要了解。
考虑查询:
找出工资总额大于所有部门工资总额平均值的所有部门
with dept_total (dept_name, value) as
(
select dept_name, sum(salary)
from instructor
group by dept_name
),
dept_total_avg(value) as
(
select avg(value)
from dept_total
)
select dept_name
from dept_total, dept_total_avg
where dept_total.value >= dept_total avg.value;
不使用 with 构造重写此查询。
查询基于 Korth 的 The database system concept 提供的 University 模式。我假设我只需要考虑讲师 table 来找到查询的答案。
指导老师(ID、姓名、dept_name、工资)
我可以求出所有部门工资总额的平均值
SELECT AVG(salary) GROUP BY dept_name;
然后我输了。我没有找到继续的方法。
我找到了 that。但我正在寻找更多解释,因为我无法从这个 link.
中理解它感谢您的帮助。
看了你上一题,发现你用的是mysql5.8,那么你可以使用分析功能
select distinct t1.dept_name
from (
select t1.*,
sum(salary) over(partition by dept_name) val,
sum(salary) over() / count(distinct dept_name) over() avg
from Instructor t1
) t1
where t1.val > t1.avg
在不支持 CTE 的 mySQL 版本中,有几种方法可以做到这一点(我假设这就是他们让您重写查询以省略 with 的原因)。此外,您正在按部门计算平均工资,但问题是要求找到每个部门的平均总工资,然后 return 低于该值的那些。
https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=fefea829cff3e20aea93634f9a4114d6
使用子查询:
SELECT dept_name
FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) d
WHERE salaries > (
SELECT avg(salaries) as avgSalaries FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z
)
加入:
SELECT dept_name
FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) d
CROSS JOIN (
SELECT avg(salaries) as avgSalaries FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z
) avgs
WHERE salaries > avgs.avgSalaries
使用会话变量(在更高版本中已弃用,但仍然有效):
SELECT avg(salaries) INTO @avg FROM (
SELECT dept_name, sum(salary) as salaries
FROM instructor GROUP BY dept_name
) z;
SELECT @avg;
SELECT dept_name
FROM instructor GROUP BY dept_name
HAVING sum(salary) > @avg;
所有好的技术都要了解。