select orderNumber, sum(priceEach * quantityOrdered) as totalvalues from orderdetails where sum(priceEach * quantityOrdered) > 60000;
报错原因:
是由于在where语句中使用了聚合函数。
where和having的作用以及区别:
WHERE是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”,因为where的执行顺序在聚合函数之前。
HAVING是一个过滤声明,过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,且having后面可以使用“聚合函数”。注意:having是对查出来的结果进行过滤,那么对没有查出来的值就不能使用having。之前一直以为having必须与group by一起用,今天试了下,只是一个筛选条件,没有什么捆绑使用的讲究。
正确写法:
select orderNumber, sum(priceEach * quantityOrdered) as totalvalues from orderdetails group by orderNumber having sum(priceEach * quantityOrdered) > 60000;
另外需要注意的地方是,SQL语法:
SELECT [DISTINCT|DISINCTROW|ALL] select_expression,... -- 查询结果
[FROM table_references -- 指定查询的表
[WHERE where_definition] -- where子句,查询数据的过滤条件
[GROUP BY col_name,...] -- 对[匹配where子句的]查询结果进行分组
[HAVING where_definition] -- 对分组后的结果进行条件限制
[ORDER BY{unsigned_integer | col_name | formula} [ASC | DESC],...] -- 对查询结果进行排序
[LIMIT [offset,] rows] -- 对查询的显示结果进行条数限制
[PROCEDURE procedure_name] --查询存储过程返回的结果集数据
]
查询语句书写顺序须遵循上述规则。