9

我希望能够做到这一点:

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept 
     INNER JOIN invoices ON invoices.id_dept = dept.id 
WHERE sumTotal > 10000

但是我得到了一个关于使用“sumTotal”的未知专栏。

这可能吗?

4

4 回答 4

19

使用HAVING

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept 
INNER JOIN invoices
    ON invoices.id_dept = dept.id 
HAVING sumTotal > 10000

问题是WHERE子句在语句之前执行SELECT。因此,该sumTotal列尚不可用。

HAVING子句在语句之后执行SELECT。在您选择所有内容后,它会过滤掉结果。但请记住,因为使用HAVING速度较慢。它对整组行进行操作。

MySQL 文档

HAVING 子句几乎在最后应用,就在项目发送到客户端之前,没有优化。(LIMIT 在 HAVING 之后应用。)

SQL 标准要求 HAVING 必须仅引用 GROUP BY 子句中的列或聚合函数中使用的列。但是,MySQL 支持对这种行为的扩展,并允许 HAVING 引用 SELECT 列表中的列和外部子查询中的列。


HAVING 子句可以引用聚合函数,而 WHERE 子句不能:

SELECT user, MAX(salary)
FROM users
GROUP BY user
HAVING MAX(salary) > 10;

不要对应该在 WHERE 子句中的项目使用 HAVING。

于 2013-03-25T15:38:57.050 回答
5

或者使用 WHERE...

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
  FROM dept 
  JOIN invoices ON invoices.id_dept = dept.id 
 WHERE invoices.col1 + invoices.col2 + invoices.col3 > 10000
于 2013-03-25T15:46:49.927 回答
4

你也可以试试这个:

WITH temp AS
(
 SELECT
   dept.id,
   (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
 FROM dept INNER JOIN invoices ON invoices.id_dept = dept.id
)
SELECT *
FROM temp
WHERE sumTotal > 10000
于 2013-03-25T15:44:41.717 回答
1

您必须使用“拥有”-

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept 
INNER JOIN invoices ON invoices.id_dept = dept.id 
HAVING sumTotal > 10000

我不确定您是否可以使用您的别名字段,或者您是否必须写 'have (invoices.col1 + invoices.col2 + invoices.col3) > 10000。

'where' 语句与'select' 一起使用:它过滤最初返回的记录。“拥有”然后过滤返回的数据集,通常是因为在“选择”时无法知道“拥有”条件。

引用一个文档,“HAVING 子句被添加到 SQL 中,因为 WHERE 关键字不能与聚合函数一起使用。” 其他地方写着 ' SQL HAVING 子句与 SQL GROUP BY 子句结合使用。它可以在 SQL SELECT 语句中用于过滤 SQL GROUP BY 返回的记录

于 2013-03-25T15:44:56.690 回答