两个小问题where 1=1 和 count(1) 与 count(*)

news/2024/7/10 4:07:50 标签: sql, table, 优化, null, string, 数据库
 

where 1=1有什么用?在SQL语言中,写这么一句话就跟没写一样。

select * from table1 where 1=1与select * from table1完全没有区别,甚至还有其他许多写法,1<>2,'a'='a','a'<>'b',其目的就只有一个,where的条件为永真,得到的结果就是未加约束条件的。

在SQL注入时会用到这个,例如select * from table1 where name='lala'给强行加上select * from table1 where name='lala' or 1=1这就又变成了无约束的查询了。

最近发现的妙用在于,在不定数量查询条件情况下,1=1可以很方便的规范语句。例如一个查询可能有name,age,height,weight约束,也可能没有,那该如何处理呢?

String sql=select * from table1 where 1=1

为什么要写多余的1=1?马上就知道了。

if(!name.equals("")){
 sql=sql+"name='"+name+"'";
}
if(!age.equals("")){
 sql=sql+"age'"+age+"'";
}
if(!height.equals("")){
 sql=sql+"height='"+height+"'";
}
if(!weight.equals("")){
 sql=sql+"weight='"+weight+"'";
}

如果不写1=1呢,那么在每一个不为空的查询条件面前,都必须判断有没有where字句,否则要在第一个出现的地方加where

 

where 1=1的写法是为了检化程序中对条件的检测
打个比方有三个参数a, b, c
@sql=select * from tb'
这三个参数都可能为空
这时你要构造语句的话,一个个检测再写语句就麻烦
比如
if @a is not null
 @sql=@sql + " where a=' + @a
if @b is not null
 这里你怎么写?要不要加where 或直接用 and ?,你这里还要对@a是否为空进行检测

用上 where 1=1 之后,就不存在这样的问题, 条件是 and 就直接and ,是or就直接接 or

----------------------------------count(1) 与 count(*)

这个要看你自己数据库设计的结构啦
如果你的数据表没有主键,那么count(1)比count(*)快
如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快
如果你的表只有一个字段的话那count(*)就是最快的啦
 
 
count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
因为count(*),自动会优化指定到那一个字段。所以没必要去count(?),用count(*),sql会帮你完成优化的.
 

http://www.niftyadmin.cn/n/1415972.html

相关文章

系统架构——可移植性,对称多处理,可扩展性

2019独角兽企业重金招聘Python工程师标准>>> 可移植性 windows被设计成可在多种硬件平台上运行。windows NT最初的版本支持x86和MIPS架构。对于DEC&#xff08;被康柏收购&#xff0c;后与惠普合并&#xff09;公司的Alpha AXP平台&#xff0c;尽管它是一个64位处理…

基站 小区 扇区 载频

基站 基站的百度百科定义是公用移动通信基站是无线电台站的一种形式&#xff0c;是指在一定的无线电覆盖区中&#xff0c;通过移动通信交换中心&#xff0c;与移动电话终端之间进行信息传递的无线电收发信电台。 简单的说&#xff0c;基站就是由天线和RRU组成的无线电收发装置…

列转行

问: 表结构如下 time ne RegUser OpenUserCount Sysrate2006-10-13 15:00WHMSC141.61288254 2569152006-10-13 15:00WHMSC236.12255287 2264572006-10-13 15:00WHMSC324.34191782 1699632006-10-13 15:00WHMSC418.04150165 1332022006-…

python 正整数的反转_Python程序将正整数的位反转?

首先使用bin()函数将数字转换为二进制。然后跳过二进制表示形式的前两个字符&#xff0c;因为bin()在数字的二进制表示形式中将0b附加为前缀&#xff0c;并反转其余部分。从另一个字符开始&#xff0c;并将其反转&#xff0c;直到从左数倒数第二个字符。将反向的二进制字符串转…

重发,改版数据库乱码的问题

ALTER DATABASE portal SET SINGLE_USER WITH ROLLBACK IMMEDIATE ALTER DATABASE portal COLLATE Chinese_PRC_CI_AS ALTER DATABASE portal SET MULTI_USER

MapX和MapXtreme区别

2005年5月&#xff0c;MapInfo发布了新产品Mapinfo MapXtreme 2004 6.2 版。MapXtreme 2004是MapInfo为了支持Microsoft的 Windows.NET框架&#xff0c;重新设计MapX和MapXtreme for Windows代码库体系结构的新产品。 MapXtreme 6.2 针对性能和易配置。一个新的应用程序向导使客…

iOS 一张图片引发的崩溃SEGV_ACCERR

出错日志一直报SEGV_ACCERR&#xff0c;原因原来是第三方库SDWebImage下载图片&#xff0c;远程图片的json文件不对导致的闪退 解决方法&#xff1a; 1.command B 编译工程&#xff08;最好在编译工程时&#xff0c;清除下缓存 按commandshiftk&#xff09; 2.打开终端&#x…

TDD与FDD

FDD和TDD主要区别就在于采用不同的双工方式&#xff0c;为频分双工(FDD) 和时分双工(TDD) 是两种不同的双工方式。 FDD是在分离的两个对称频率信道上进行接收和发送&#xff0c;用保护频段来分离接收和发送信道。FDD的缺点就是必须采用成对的频率&#xff0c;依靠频率来区分上…