查询语句的书写顺序中,where子句应该在group by子句之前,且where子句中不能用聚合函数。
正确答案是:D: `select user_id, avg(amount) from orders group by user_id having avg(amount)>2000;`
**分析:**
A: `select user_id, avg(amount) from orders where avg(amount)>2000;`
- 这句SQL会报错,因为`avg(amount)`是一个聚合函数,不能在`WHERE`子句中直接使用聚合函数。
B: `select user_id, avg(amount) from orders group by user_id where avg(amount)>2000;`
- 这句SQL会报错,因为`WHERE`子句应该在`GROUP BY`之前,并且`WHERE`子句不能使用聚合函数。聚合函数应该在`HAVING`子句中使用。
C: `select user_id, avg(amount) from orders where avg(amount)>2000 group by user_id;`
- 这句SQL会报错,因为`WHERE`子句不能使用聚合函数。聚合函数应该在`HAVING`子句中使用。
D: `select user_id, avg(amount) from orders group by user_id having avg(amount)>2000;`
- 这句SQL是正确的。`HAVING`子句用于在分组后的结果中进行过滤,可以使用聚合函数。这里`avg(amount)>2000`是在分组后进行过滤,符合SQL语法。
因此,只有D选项不会报错。