我希望能够做到这一点:
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”的未知专栏。
这可能吗?
使用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。
或者使用 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
你也可以试试这个:
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
您必须使用“拥有”-
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 返回的记录。