【SQL基础】SQL 执行顺序之 GROUP BY与 WHERE HAVING ORDER BY的顺序

分组查询

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;

GROUP BY与 WHERE HAVING ORDER BY的顺序

SQL 执行顺序

书写顺序:select–from–where–group by–having–order by --limit

执行顺序:from—where–group by—having—select—order by–limit

在这里插入图片描述

from:需要从哪个数据表检索数据 
where:过滤表中数据的条件 
group by:如何将上面过滤出的数据分组 
having:对上面已经分组的数据进行过滤的条件 
select:查看结果集中的哪个列,或列的计算结果 
order by :按照什么样的顺序来查看返回的数据 

where先执行,再groupby分组

GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
在这里插入图片描述

group by先分组,having在执行

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 子句]

除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子

在这里插入图片描述

having和where的区别

(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 排序实例

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

猜你喜欢

转载自blog.csdn.net/weixin_42694422/article/details/129624454