SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];
查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
1、满足SELECT子句中的列名必须为分组列或列函数,因为SELECT有group by中包含的列
2、having必须和group by一起用,且在group by后面
3、group by、having、order by的使用顺序:group by 、having、order by
SELECT *|字段列表 [as 别名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT 子句]
(1)having必须在执行了group by操作之后才能运行,having必须和group by一起用,且在group by后面
(2)where的执行顺序在group by之前,也就必然在having之前。
(3)having后面可以加上聚合函数,而where后面不能加聚和函数如count(),sum(),avg(),max(),min()等函数。
(4)执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
(5)判断条件不同:where不能对聚合函数进行判断,而having可以。
(6) 执行顺序: where > 聚合函数 > having
常用聚合函数:
order by A,B # A 升序排列 B也升序排列
order by A desc,B # A 降序(优先),B 升序排列
order by A ,B desc # A 升序(优先),B 降序排列
SQL100 确定最佳顾客的另一种方式(二)
返回订单总价不小于1000 的客户名称和总额(OrderItems 表中的order_num)
提示:需要计算总和(item_price 乘以 quantity)。按总额对结果进行排序,请使用INNER JOIN 语法
SQL 书写顺序:group by–having–order by
select
c.cust_name,
sum(os.item_price * os.quantity) total_price
from
OrderItems os
INNER JOIN Orders o on o.order_num = os.order_num
INNER JOIN Customers c on c.cust_id = o.cust_id
GROUP BY
cust_name
HAVING
total_price >= 1000
ORDER BY
total_price