GROUP BY和HAVING用法介绍

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

4、having是在分好组后找出特定的分组,通常是以筛选聚合函数的结果,如sum(a) > 100等,使用了having必须使用group by,但是使用group by 不一定使用having。

5、分组函数常用到的聚合函数

MIN 最小值

MAX 最大值

SUM 求和

AVG 求平均

COUNT 计数

不允许使用双重聚合函数,所以在对分组进行筛选的时候,可以用order by 排序,然后用limit也可以找到极值。

二、where/having区别

子名作用
where 子句

1) 对查询结果进行分组前,将不符合 where 条件的行去掉,即在分组之前过滤数据,即先过滤再分组。
2) where 后面不可以使用聚合函数

3) 过滤

having 子句

1) having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。

2) having 后面可以使用聚合函数

3) 过滤

4) 支持所有WHERE操作符

三、limit用法

LIMIT offset,length;

offset:起始行数,从 0 开始计数,如果省略,默认就是 0

length: 返回的行数

查询学生表中数据,从第 3 条开始显示,显示 6 条。

select * from student3 limit 2,6

分页:比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。

假设我们每页显示 5 条记录的方式来分页。

如果第一个参数是 0 可以省略写

select * from student3 limit 5

最后如果不够 5 条,有多少显示多少

select * from student3 limit 10,5

 

 

 

### SQL HAVING 子句使用教程 HAVING 子句在 SQL 查询中用于筛选由 `GROUP BY` 子句创建的分组后的记录集。与 `WHERE` 子句不同的是,`HAVING` 可以包含聚合函数并应用于分组的结果[^4]。 #### 基本语法 ```sql SELECT column_name, aggregate_function(column_name) FROM table_name WHERE condition GROUP BY column_name HAVING condition; ``` 此结构允许先对数据进行分组再基于特定条件进一步筛选这些分组的数据集合。 #### 示例:按类别统计电影数量并筛选出至少有两部影片的类别 假设有一个名为 `film_category` 的表以及另一个叫作 `category` 的表,在 Sakila 数据库中存储着关于电影的信息。下面的例子会展示如何利用这两个表格来找出拥有两个及以上电影条目的分类: ```sql SELECT c.name AS category_name, COUNT(fc.film_id) AS film_count FROM film_category fc JOIN category c ON fc.category_id = c.category_id GROUP BY c.name HAVING COUNT(fc.film_id) >= 2; ``` 这段代码首先连接了两张表,并按照类别的名称进行了分组操作;接着通过 `HAVING` 设置了一个阈值——只有当某个类目下的电影数目大于等于二时才会被选入最终结果集中[^1]。 #### 复杂条件的应用 除了简单的比较外,还可以组合多个逻辑运算符不同的聚合函数来进行更加精细的选择。比如要查找那些平均租赁持续时间超过三天而且总共有五次以上出租记录的城市: ```sql SELECT city.city, AVG(rental_duration), SUM(amount) FROM rental JOIN payment p USING (rental_id) JOIN customer cu USING (customer_id) JOIN address a USING (address_id) JOIN city USING (city_id) GROUP BY city.city HAVING AVG(rental_duration) > 3 AND SUM(p.amount) > 500; ``` 这里不仅限定了每座城市的平均租期长度还设定了累计支付金额的要求,以此作为返回城市列表的标准之一[^3]。 #### 性能考量 虽然 CTE 复杂嵌套查询能够实现功能上的灵活性,但在面对大规模数据集时可能会遇到性能瓶颈。因此建议开发者们根据实际情况评估是否有必要采用更为高效的方式如窗口函数或简单子查询替代之。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值