前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小白学习MySQL - 统计的"投机取巧"

小白学习MySQL - 统计的"投机取巧"

作者头像
bisal
发布2022-06-27 09:38:38
4170
发布2022-06-27 09:38:38
举报
文章被收录于专栏:bisal的个人杂货铺

MySQL中支持LIMIT子句,限制返回行数。如果先执行了LIMIT,我又想知道不带LIMIT能返回多少行,但又不想再执行一次相同的语句,这时能怎么做?

此时,可以利用MySQL提供的一个函数FOUND_ROWS()特性来解决。

(1) 首先,执行一次包含SQL_CALC_FOUND_ROWS选项的SELECT语句,

代码语言:javascript
复制
bisal@mysqldb 15:49:  [test]> select SQL_CALC_FOUND_ROWS * from tt limit 1;
+------+---------------------+--------+
| code | cdate               | ctotal |
+------+---------------------+--------+
| AAA  | 2022-01-01 00:00:00 |      1 |
+------+---------------------+--------+
1 row in set, 1 warning (0.00 sec)

(2) 执行FOUND_ROWS()函数,返回的就是这张表的记录数,

代码语言:javascript
复制
bisal@mysqldb 16:02:  [test]> select found_rows();
+--------------+
| found_rows() |
+--------------+
|           15 |
+--------------+
1 row in set, 1 warning (0.00 sec)

可以看到,和COUNT(*)的记录数,是相同的,

代码语言:javascript
复制
bisal@mysqldb 16:03:  [test]> select count(*) from tt;
+----------+
| count(*) |
+----------+
|       15 |
+----------+
1 row in set (0.01 sec)

之所以加上SQL_CALC_FOUND_ROWS,因为他是表示需要取得的结果数,为后面使用FOUND_ROWS()函数做铺垫。

如果执行LIMIT时没带SQL_CALC_FOUND_ROWS,

代码语言:javascript
复制
bisal@mysqldb 15:49:  [test]> select * from tt limit 1;
+------+---------------------+--------+
| code | cdate               | ctotal |
+------+---------------------+--------+
| AAA  | 2022-01-01 00:00:00 |      1 |
+------+---------------------+--------+
1 row in set (0.00 sec)

执行FOUND_ROWS()返回的就是上一条SELECT语句实际返回的行数,

代码语言:javascript
复制
bisal@mysqldb 15:49:  [test]> select found_rows();
+--------------+
| found_rows() |
+--------------+
|            1 |
+--------------+
1 row in set, 1 warning (0.00 sec)

FOUND_ROWS()得到的数据,只是临时的,执行下一条语句,就会失效,如果逻辑中需要用到,可以提前保存,例如在程序中定义变量存储。

关于FOUND_ROWS()在官网文档中有相关的介绍,

https://dev.mysql.com/doc/refman/5.7/en/information-functions.html

efa270bacf6cd46634fb8de3c79665bd.png
efa270bacf6cd46634fb8de3c79665bd.png

至于原理上,我没看过代码,但是我觉得SQL_CALC_FOUND_ROWS意思就是在执行的时候,可能就统计了一次表的记录数,存到了临时变量或者某个临时区域,所以要紧接着执行这个FOUND_ROWS(),得到这个值,虽然事儿该做什么还做什么,毕竟相当于MySQL替代我们做了这件事儿,至少从执行层面,还是有些帮助的。

小白学习MySQL

小白学习MySQL - 增量统计SQL的需求

小白学习MySQL - 你碰到过这种无法登陆的场景?

小白学习MySQL - 不同版本创建用户的些许区别

小白学习MySQL - 随机插入测试数据的工具

小白学习MySQL - varchar类型字段为什么经常定义成255?

小白学习MySQL - 变通创建索引的案例一则

小白学习MySQL - “投机取巧”统计表的记录数

小白学习MySQL - 一次慢SQL的定位

小白学习MySQL - TIMESTAMP类型字段非空和默认值属性的影响

小白学习MySQL - 聊聊数据备份的重要性

小白学习MySQL - InnoDB支持optimize table?

小白学习MySQL - table_open_cache的作用

小白学习MySQL - 表空间碎片整理方法

小白学习MySQL - 大小写敏感问题解惑

小白学习MySQL - only_full_group_by的校验规则

小白学习MySQL - max_allowed_packet

小白学习MySQL - mysqldump保证数据一致性的参数差异

小白学习MySQL - 查询会锁表?

小白学习MySQL - 索引键长度限制的问题

小白学习MySQL - MySQL会不会受到“高水位”的影响?

小白学习MySQL - 数据库软件和初始化安装

小白学习MySQL - 闲聊聊

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档