MySQL LIMIT 理解

本文详细介绍了SQL语句中LIMIT关键字的使用方法,包括其两个参数offset和count的作用及实例演示。此外,还讨论了LIMIT在提高查询效率方面的应用,以及如何优化大量数据的查询过程。最后,提到了LIMIT在DELETE和UPDATE语句中的使用。

参数

Limit一般放在sql的最后,用于对数据集的行数进行约束,有两个参数,实例如下:

SELECT 
column1,column2,...
FROM
table
LIMIT offset , count;

offset:含义是偏移量,offset=3代表跳过前三条记录,从第四条开始算。

count:指返回的条数。

LIMIT 3,5 就是返回第4-8条数据。

当然第一个参数offset可以省略,LIMIT 5表示返回 5 条记录,省略了offset,offset的默认值是0,就是没有偏移量,返回第1-5条记录。

利用LIMIT的这个特性,可以用来做分页、快速查询等。

效率

先来看下如下sql:

SELECT 
column1,column2,...
FROM
table
LIMIT 300000 , 100;

这个sql的效率其实是很低的,因为数据库需要一直“偏移”到300000的位置,才开始取那需要的100条数据,所以一般不要这样写sql,这也可以解释很多app中只提供最近几个月的操作记录或订单。那怎么优化呢?可以先通过其他条件,把前30w不需要的数据通过where条件过滤掉,如where id>=300000等。

其他

LIMIT除了用在SELECT查询语句上,也是支持DELETE和UPDATE语句的,如:

UPDATE 
TABLE SET column1='test1' 
WHERE type=1234
LIMIT 1;

sql表示只更新type=1234的第一条记录,同样DELETE语句也是同样道理。

### MySQL 中 `LIMIT` 的用法及 `HAVING` 子句中的聚合函数应用 #### 1. **MySQL 中 `LIMIT` 的基本语法与用途** 在 MySQL 查询中,`LIMIT` 是用来限制返回结果数量的关键字。它通常用于分页显示或减少不必要的数据传输量。其标准形式如下所示: - 当单独使用时,表示最多获取指定数目行的数据: ```sql SELECT * FROM table_name LIMIT number_of_rows; ``` - 如果提供两个参数,则第一个代表起始偏移位置(从零开始),第二个则是要提取的最大记录数: ```sql SELECT * FROM table_name LIMIT offset, number_of_rows; ``` 上述两种写法均支持结合其他子句共同作用以满足复杂场景需求[^1]。 --- #### 2. **关于 `HAVING` 后能否运用聚合函数作筛选条件的回答** 确实,在 SQL 标准定义里允许我们在 `HAVING` 条件表达式里面调用诸如 `COUNT()`, `SUM()` 等类型的聚集操作符来进行过滤处理。这是因为不同于普通的 `WHERE` 子句只能基于单条目属性做判定;而前者专门服务于已经经过分组后的汇总统计层面之上再施加约束限定的目的[^2]。 下面列举几个实际例子帮助加深印象理解: - 计算各部门薪资总额超过特定阈值的所有部门编号及其对应金额: ```sql SELECT department_id, SUM(salary) as total_salary FROM employees GROUP BY department_id HAVING SUM(salary) > threshold_value; ``` - 找出订单次数大于等于三次以上的客户清单连同他们各自的订购频率一起呈现出来: ```sql SELECT customer_id,COUNT(order_id)AS order_frequency FROM orders GROUP BY customer_id HAVING COUNT(order_id)>=3 ; ``` 可见以上情况皆充分利用到了内置提供的各种集合运算能力从而达成预期目标效果[^3]. --- ### 示例代码展示 为了直观感受两者配合使用的魅力所在,特此设计了一套模拟环境供参考学习之便: ```sql -- 初始化临时表结构并填充初始资料 CREATE TEMPORARY TABLE sales_data ( sale_date DATE NOT NULL, product VARCHAR(50), quantity INT UNSIGNED DEFAULT 0 , revenue FLOAT PRECISION DEFAULT .00 CHECK(revenue>=0 ) ); INSERT INTO sales_data VALUES (&#39;2023-09-01&#39;,&#39;ProductA&#39;,8,400.),(&#39;2023-09-02&#39;,&#39;ProductB&#39;,6,300.); INSERT INTO sales_data VALUES (&#39;2023-09-03&#39;,&#39;ProductC&#39;,7,350.),(&#39;2023-09-04&#39;,&#39;ProductD&#39;,9,450.); INSERT INTO sales_data VALUES (&#39;2023-09-05&#39;,&#39;ProductE&#39;,5,250.),(&#39;2023-09-06&#39;,&#39;ProductF&#39;,10,500.); -- 应用 limit 实现简单取样演示 SELECT * FROM sales_data ORDER BY revenue DESC LIMIT 3 ; -- 结合 having 进一步细化分析过程举例说明 SELECT product,SUM(quantity)as sold_items,SUM(revenue)as earned_money FROM sales_data GROUP BY product HAVING SUM(quantity)>7 AND SUM(revenue)<500 ; -- 清除残留对象以便下次重复执行不受干扰 DROP TABLE IF EXISTS sales_data ; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值