澳门正规赌博十大网站-澳门游戏网站
做最好的网站

无标题文章

MySQL中的 FOUND_ROWS() 与 ROW_COUNT() 函数

移植sql server 的存放过程到mysql中,碰着了sql server中的:

 

IF @@ROWCOUNT < 1

 

对应到mysql中可以使用 FOUND_ROWS(卡塔尔(قطر‎ 函数来替换。

 

  1. found_rows() 函数

 

文书档案地址:

 

1)found_rows(卡塔尔(英语:State of Qatar) 的第后生可畏种选择状态(带有SQL_CALC_FOUND_ROWS,也带有 limit):

 

A SELECT statement may include a LIMIT clause to restrict the number of rows the server returns to the client. In some cases, it is desirable to know how many rows the statement would have returned without the LIMIT, but without running the statement again. To obtain this row count, include a SQL_CALC_FOUND_ROWS option in the SELECT statement, and then invoke FOUND_ROWS() afterward:

 

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name

无标题文章。    -> WHERE id > 100 LIMIT 10;

mysql> SELECT FOUND_ROWS();

The second SELECT returns a number indicating how many rows the first SELECT would have returned had it been written without the LIMIT clause.

 

眼下的含有limit的select语句假使加上了 SQL_CALC_FOUND_无标题文章。ROWS,那么接下去推行的 SELECT FOUND_ROWS(卡塔尔(英语:State of Qatar); 将回来前面语句不带limit语句重返的行数。

 

图片 1

此种情状下,select found_rows() 和 select count(*卡塔尔有二个相当的小的界别:如若userId允许为null,那么select found_rows(卡塔尔的结果或然要比select count(*卡塔尔国 要小片段。因为前端等价于:select count(userId卡塔尔(قطر‎ from Users; 而该语句不会总计userId 为null的行在内。而count(*卡塔尔国会简政放权在内。

 

2)found_rows(卡塔尔 的第两种/第三中选用境况(不分包SQL_CALC_无标题文章。FOUND_无标题文章。ROWS):

无标题文章。 

In the absence of the SQL_CALC_FOUND_ROWS option in the most recent successful SELECT statement, FOUND_ROWS() returns the number of rows in the result set returned by that statement. If the statement includes a LIMIT clause, FOUND_ROWS() returns the number of rows up to the limit. For example, FOUND_ROWS() returns 10 or 60, respectively, if the statement includes LIMIT 10 or LIMIT 50, 10.

 

The row count available through FOUND_ROWS() is transient and not intended to be available past the statement following the SELECT SQL_CALC_FOUND_ROWS statement. If you need to refer to the value later, save it:

 

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;

mysql> SET @rows = FOUND_ROWS();

If you are using SELECT SQL_CALC_FOUND_ROWS, MySQL must calculate how many rows are in the full result set. However, this is faster than running the query again without LIMIT, because the result set need not be sent to the client.

 

1> 第三种选择状态(不分包SQL_CALC_FOUND_ROWS,也尚无带 limit 卡塔尔国:

图片 2

只要前方的select语句未有带 SQL_CALC_FOUND_ROWS,也未曾带 limit ,那么后边的 SELECT FOUND_ROWS(卡塔尔; 再次回到的结果就是前方的select再次回到的行数;

 

2> 第三中利用状态(不含有SQL_CALC_FOUND_ROWS,不过有带 limit 卡塔尔:

 

生龙活虎经前面的select语句未有带 SQL_CALC_FOUND_ROWS,不过带有 limit,那么后边的 SELECT FOUND_ROWS(卡塔尔国; 重临的结果就是limit语句到达的最大的行数,例如:select * from xxx limit 10; 达到的最大的行数为10,所以 found_rows() 返回10;比如 select * from xxx limit 50,10; 它要从第50行发轫,再扫描10行,所以到达的最大的行数为60,所以found_rows() 返回60。

图片 3

无标题文章。这里首先个select found_rows(卡塔尔国重临105,因为她是从偏移100的位置,再扫描5行,所以回来105;可是第4个扫描的结果为空,select found_rows(卡塔尔(قطر‎再次回到了0!并不是105,因为 where userId=999999的结果为空,所以往边的 limit 100,5根本就从不实践。所以select found_rows()返回了0。

 

再看多少个事例,越来越深刻的明亮里面情景下的 found_rows():

图片 4

上面sql中 user_Pwd=xx 的值都是如出风流罗曼蒂克辙的。能够看见这种景色下的found_rows()是没错select语句的中间结果,再 limit 时,那时的limit的扫描到的最大的行数。和原始表中的数据的行数,是一贯不提到的。他是对select的中档结果的limit,然后才获得最终的结果集,再回来。

 

3)SQL_CALC_FOUND_ROWS and FOUND_ROWS(卡塔尔(英语:State of Qatar) 契合利用的现象

 

SQL_CALC_FOUND_ROWS and FOUND_ROWS() can be useful in situations when you want to restrict the number of rows that a query returns, but also determine the number of rows in the full result set without running the query again. An example is a Web script that presents a paged display containing links to the pages that show other sections of a search result. Using FOUND_ROWS() enables you to determine how many other pages are needed for the rest of the result.

 

1> SQL_CALC_FOUND_ROW limit found_rows(卡塔尔还不错在分页的场地。

 

2> 不带SQL_CALC_FOUND_ROW 的 found_rows(卡塔尔国能够利用在蕴藏进程中判别前方的select是否为空:

 

DELIMITER //
DROP PROCEDURE IF EXISTS loginandreg //

CREATE PROCEDURE loginandreg(
    OUT userId     BIGINT,
    IN user_Pwd                          VARCHAR(32),
    IN user_MobileCode                   VARCHAR(16),
    IN user_RegIP                        VARCHAR(16)
)
BEGIN
IF EXISTS(SELECT * FROM Users u WHERE u.user_MobileCode=user_MobileCode) THEN
    SELECT u.userId INTO userId FROM Users u WHERE u.user_MobileCode=user_MobileCode AND u.user_Pwd=user_Pwd;    
    IF FOUND_ROWS() < 1 THEN
        SELECT -1 INTO userId;
    END IF;
ELSE 
    INSERT INTO Users(user_Pwd,user_MobileCode,user_Visibility,user_Level,user_RegTime,user_RegIP,user_Collecter,user_Collected)
    VALUES (user_Pwd,user_MobileCode,6,6,NOW(),user_RegIP,0,0);
    SELECT LAST_INSERT_ID() INTO userId;
END IF;

END //
DELIMITER ;

 

上边存储进度中的:

 

SELECT u.userId INTO userId FROM Users u WHERE u.user_MobileCode=user_MobileCode AND u.user_Pwd=user_Pwd;    

    IF FOUND_ROWS() < 1 THEN

        SELECT -1 INTO userId;

    END IF;

正是五个很好的应用的例子。

 

这种存款和储蓄进度之处中就能够运用 mysql 的 FOUND_ROWS(卡塔尔 替换 sql server 存储进度中的 IF @@ROWCOUNT < 1 语句。

 


 

  1. row-count() 函数

 

文档地址:

 

一句话,row_count(卡塔尔(قطر‎ 函数通常用来重返被 update, insert, delete 实际纠正的行数。

 

In MySQL 5.6, ROW_COUNT() returns a value as follows:

 

DDL statements: 0. This applies to statements such as CREATE TABLE or DROP TABLE.

 

DML statements other than SELECT: The number of affected rows. This applies to statements such as UPDATE, INSERT, or DELETE (as before), but now also to statements such as ALTER TABLE and LOAD DATA INFILE.

 

SELECT: -1 if the statement returns a result set, or the number of rows “affected” if it does not. For example, for SELECT * FROM t1, ROW_COUNT() returns -1. For SELECT * FROM t1 INTO OUTFILE 'file_name', ROW_COUNT() returns the number of rows written to the file.

 

SIGNAL statements: 0.

 

For UPDATE statements, the affected-rows value by default is the number of rows actually changed. If you specify the CLIENT_FOUND_ROWS flag to mysql_real_connect() when connecting to mysqld, the affected-rows value is the number of rows “found”; that is, matched by the WHERE clause.

 

也正是说对于update语句,row_count(卡塔尔私下认可重临的是实际被改善的行数;但是经过参数设置,也得以回去找到的行数(可能说相配的行数,受影响的行数卡塔尔(قطر‎,那样设置就能够相称于Oracle  ps/sql中 sql%rowcount 和 sql server 中的 @@RowCount。

 

但是 row_count(卡塔尔 的结果和 mysql 的JDBC driver的暗中同意行为却是不均等的,mysql jdbc中的 Connection.getUpdateCount(卡塔尔函数重回的是被找到的行数,并不是实际被改换的行数,尽管要再次回到被实际修改的行,要采用存款和储蓄进程,相关链接验证:

 

 

 

(这里带有了装有mysql jdbc 链接可安装的参数卡塔尔国

 

 

 useAffectedRows

 

Don't set the CLIENT_FOUND_ROWS flag when connecting to the server (not JDBC-compliant, will break most applications that rely on "found" rows vs. "affected rows" for DML statements), but does cause "correct" update counts from "INSERT ... ON DUPLICATE KEY UPDATE" statements to be returned by the server.

 

Default: false

 

Since version: 5.1.7 

 

有关对mysql复制的熏陶:

 

Important

 

FOUND_ROWS() is not replicated reliably using statement-based replication. This function is automatically replicated using row-based replication.

Important

 

ROW_COUNT() is not replicated reliably using statement-based replication. This function is automatically replicated using row-based replication.

注意:found_rows() 和 row_count(卡塔尔(قطر‎ 在依照 语句的复制 蒙受中是不可信赖的,它们活动使用 基于行的复制行为。

FOUND_ROWS() 与 ROW_COUNT(卡塔尔 函数 移植sql server 的仓库储存进程到mysql中,蒙受了sql server中的: IF @@ROWCOUNT 1 对应到mysql中得以行使 FOUND_ROWS(...

digdeep

举凡过去,都已经开始。Read the fucking manual and source code.

 博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: :: 管理 ::

237 随笔 :: 0 文章 :: 107 评论 :: 0 引用

< 2016年12月 >

日 一 二 三 四 五 六

27 28 29 30 1 2 3

4 5 6 7 8 9 10

11 12 13 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30 31

1 2 3 4 5 6 7

公告

昵称:digdeep

园龄:2年

粉丝:86

关注:46

加关注

搜索

找找看

谷歌查寻

常用链接

本身的小说

自个儿的比手画脚

自己的参加

风行业评比论

自身的标签

自己的竹签

HTTPS(3)

ssl(2)

tls(2)

高清缩略图(1卡塔尔国

缩略图(1)

pdf/itext(1)

Javaweb(1)

Java图片管理(1卡塔尔(قطر‎

jsonp跨域原理(1卡塔尔

js命名空间函数namespace(1卡塔尔(قطر‎

更多

小说分类

eclipse/maven/svn/git(10)

HTML5/CSS3(5)

HTTP/HTTPS(10)

Java(51)

Java 十二线程与产出(18卡塔尔

Java 加密/解密(5)

Java 设计方式(1卡塔尔(英语:State of Qatar)

Java-dubbo/dubbox(3)

Java-ibatis/mybatis(13)

Java-IO/NIO/network(5)

Java-jni/jna(4)

Java-jsp/servlet(23)

Java-jvm(5)

Java-shiro(2)

Java-SiteMesh(1)

Java-spring/springmvc(20)

Java-ZooKeeper

js(27)

js-inside(4)

js-node.js(1)

js-React(2)

js-require.js(4)

Linux(18)

Linux C/C (2)

Linux TCP/IP(3)

LVS/Keepalived(4)

memcached/redis

MySQL(19)

MySQL 备份/恢复(5)

MySQL 开发(5)

MySQL 优化(14)

MySQL 原理/源码(6)

nginx/lua/openresty(6)

Oracle(3)

SQL Server(6)

web安全(12)

Windows(3)

其他(3)

Wechat支付(8卡塔尔国

小说档案

2016年11月 (2)

2016年9月 (2)

2016年8月 (4)

2016年7月 (3)

2016年6月 (5)

2016年5月 (3)

2016年4月 (11)

2016年3月 (9)

2016年2月 (4)

2016年1月 (2)

2015年12月 (6)

2015年11月 (9)

2015年10月 (23)

2015年9月 (31)

2015年8月 (15)

2015年7月 (12)

2015年6月 (21)

2015年5月 (20)

2015年4月 (18)

2015年3月 (13)

2015年2月 (1)

2015年1月 (12)

2014年12月 (11)

新颖商量

  1. Re:Spring, MyBatis 好多据源的配备和拘系

@digdeep这里还会有多个难题, 和 开启了proxy-target-class="true"后,order不起功效了,不知你是或不是遇到过此种意况。...

--无敌小瘪四

  1. Re:Wechat调用照相录像等 js 接口的权位配置 和 照片上传和下载达成

很棒对本身很有辅助

--小人物小世界

  1. Re:MySQL 后生可畏致性读 深刻钻研

小结地精确

--天士梦

  1. Re:Java 权限框架 Shiro 实战后生可畏:理论底子

写的实心不错!赞

--learnerzhang

  1. Re:利用 filter 机制 给 静态财富 url 加上岁月戳,来堤防js和css文件的缓存,利于开采调试

打听了,相叉了。那样实在有益。

--NZuoF

翻阅排行的榜单

  1. 行使国内 maven 镜像 代替国外 mirror(8593卡塔尔(قطر‎

  2. Spring, MyBatis 大多据源的安插和管理(6962卡塔尔(قطر‎

  3. Mybatis 数据库物理分页插件 PageHelper(4970卡塔尔国

  4. SpringMVC 的 Controller 再次回到各样视图的管理形式(4044卡塔尔(英语:State of Qatar)

  5. SpringMVC4 Spring MyBatis3 基于表明的最简配置(3229卡塔尔(英语:State of Qatar)

商量排名榜

  1. Java中有关 BigDecimal 的叁个产生double精度损失的"bug"(25卡塔尔国

  2. Spring, MyBatis 好些个据源的安插和治本(15卡塔尔国

  3. 微信支付(01卡塔尔(英语:State of Qatar)之怎么着成为开垦者(8卡塔尔(英语:State of Qatar)

  4. 肯爹的 StringUtils.isNumeric(String str)(6)

  5. Java二十四线程中的死锁难点(6卡塔尔(قطر‎

引入排行的榜单

  1. Spring AOP 深刻分析(6卡塔尔国

  2. Spring, MyBatis 大多据源的陈设和保管(6卡塔尔(英语:State of Qatar)

  3. SpringMVC 的 Controller 再次来到各个视图的管理形式(4卡塔尔

  4. 深入解析jsonp跨域原理(3卡塔尔(قطر‎

  5. MySQL 生机勃勃致性读 深入钻探(2卡塔尔(قطر‎

MySQL 中的 FOUND_ROWS() 与 ROW_COUNT() 函数

移植sql server 的积攒进程到mysql中,碰着了sql server中的:

IF @@ROWCOUNT < 1

对应到mysql中能够使用 FOUND_ROWS(卡塔尔 函数来替换。

  1. found_rows() 函数

文书档案地址:

1)found_rows(卡塔尔 的第大器晚成种采用状态(带有SQL_CALC_FOUND_ROWS,也带有 limit):

A SELECT statement may include a LIMIT clause to restrict the number of rows the server returns to the client. In some cases, it is desirable to know how many rows the statement would have returned without the LIMIT, but without running the statement again. To obtain this row count, include a SQL_CALC_FOUND_ROWS option in the SELECT statement, and then invoke FOUND_ROWS() afterward:

本文由澳门正规赌博十大网站发布于澳门游戏网站,转载请注明出处:无标题文章