`
afunti
  • 浏览: 105415 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

where 1=1 count(1)和count(*)

阅读更多

http://blog.csdn.net/dingwb/archive/2007/06/15/1653402.aspx

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会帮你完成优化的
分享到:
评论

相关推荐

    为什么阿里巴巴禁止使用 count(列名)或 count(常量)来替代 count(*)1

    MyISAM由于使用表级锁,可以在没有`WHERE`子句的情况下直接返回预先计算好的行数,而InnoDB支持事务和行级锁,无法做这样的优化,因此`COUNT(*)`的执行可能涉及全表扫描。 总结起来,阿里巴巴禁止使用`count(列名)`...

    sql的left join和count应用

    在SQL语言中,`LEFT JOIN` 和 `COUNT` 是两种非常重要的操作,它们在数据库查询中扮演着关键角色。在这个问题中,我们看到一个数据表 `TPL_WORD1`,它包含字段 `Wordid`(主键)、`idFuid`(上一级节点ID)和 `Name`...

    C# 自动检测用户名是否存在

    string query = "SELECT COUNT(*) FROM Users WHERE Username = @Username"; using (SqlCommand cmd = new SqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@Username", username); int count = (int...

    查询至少学习了1号课程和2号课程的学生的学号,姓名的八种写法

    在数据库查询中,有时我们需要找出同时满足多个条件的记录,比如在这个问题中,我们要找到至少学习了1号课程(cno='001')和2号课程(cno='002')的学生的学号(sno)和姓名(sname)。以下是八种不同的SQL查询方法...

    homework_2_ch3_20150413_SQL参考答案1

    Where 1 = some (select count(*) from W where W.eno = E.eno) 答案 2: Select ename from E where eno IN (select eno from W group by eno having count(*) = 1) 答案 3: Select ename From E, (select eno, ...

    啊D注入工具中使用的SQL注入语句-1.txt

    Id=1659 and (select len(cstr(count(*))) from admin where 1=1)=2 and 1=1` - 使用`len`函数获取密码长度。这里假设`count(*)`返回的结果即为密码长度,通过不断尝试不同的数值来确定具体的长度。 5. **获取管理...

    监控oracle数据DG状态超详细版

    ssion count" from v$session where status='ACTIVE ******** total sessions count *************** sion count" from v$session; ******** top 30 big objects name ********** a35 a15 -----部分截断sql---

    经典SQL语句大全

    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 2、收缩数据库 --重建索引 DBCC REINDEX DBCC INDEXDEFRAG --收缩数据和日志 。。。。。。。。。。。。。。。。等等...

    数据库精选sql语句练习题 sql语句练习题

    SELECT AVG(DEGREE), CNO FROM SCORE JOIN STUDENT ON SCORE.SNO = STUDENT.SNO WHERE CNO LIKE '3%' GROUP BY SCORE.CNO HAVING COUNT(SCORE.CNO) &gt;= 5; ``` 这个查询涉及到多个表的联接、分组、筛选和聚合运算。 ...

    上机实验四五六参考答案1

    7. **COUNT函数**:`COUNT`用于计算记录数,`SELECT COUNT(DISTINCT sno) AS 选课人数 FROM grade`可以得到选修了课程的学生总数,而`SELECT COUNT(DISTINCT sno) AS 选课人数 FROM grade WHERE gmark IS NOT NULL`...

    获取top前10个Oracle的进程(支持多实例)

    jdbcUrl=jdbc:oracle:thin:@193.0.10.110:1521:MG01 username=DBUSROMS1 password=**** count=1 数据库连接 DELETE FROM SELLMAIL WHERE SMKEY = :B1 当前正执行SQL jdbcUrl=jdbc:oracle:thin:@193.0.10.110:1521:...

    where和having区别

    3. **支持表达式**:可以在`WHERE`子句中使用逻辑运算符(如AND、OR)和其他比较运算符(如=、&lt;、&gt;等),但不支持聚合函数(如SUM、AVG、COUNT等)。 **示例:** ```sql SELECT SUM(num) AS rmb FROM orders WHERE ...

    sql中null值对count的影响

    SELECT COUNT(*), COUNT(pid), COUNT(ISNULL(pid, '')) FROM tbl_user WHERE pid IS NOT NULL; ``` 结果是`(2, 2, 2)`,因为只有两行的`pid`不是`NULL`,且这两行中的`pid`被成功计数。 2. **只考虑`NULL`值的...

    where和having的区别

    ### Oracle SQL 中 WHERE 和 HAVING 的区别 在数据库查询语言SQL中,`WHERE`和`HAVING`子句都是用于过滤数据的关键字,但它们的应用场景和语法结构有着明显的不同。下面将详细介绍这两个关键字的区别。 #### 1. ...

    SQL一条语句统计记录总数及各状态数

    代码如下:SELECT SUM(正确数)+SUM(错误数) AS 总记录数,SUM(正确数),SUM(错误数) FROM ( SELECT COUNT(1) 正确数,0 错误数 FROM TB WHERE STATUS=1 UNION ALL SELECT 0 正确数,COUNT(1) 错误数 FROM TB WHERE ...

    数据库实验报告二.doc

    - **求员工总数**:使用COUNT函数,如SELECT COUNT(EmployeeID) AS TotalEmployees FROM Employees WHERE DepartmentID IN (SELECT DepartmentID FROM Departments WHERE DepartmentName = '财务部'); ##### 分组...

    数据库课后习题答案

    - **COUNT**: 计算指定列的非空值数量。 - **AVG**: 计算指定列的平均值。 - **示例**: - 统计不同教师的数量:`SELECT COUNT(DISTINCT teacher) FROM c;` - 计算选修了课程`C04`的女性学生的平均年龄:`SELECT ...

    SQL常见命令及使用方法

    - 示例:`SELECT * FROM Employees WHERE DepartmentID = 1 ORDER BY LastName DESC` - **模糊查询**: - `SELECT * FROM 表名 WHERE 字段名 LIKE '%字段值%' ORDER BY 字段名 [DESC]`:与上面类似,但是这里使用...

    homework_2_ch3_SQL参考答案1

    答案 1:select ename from E where 1=some (select count(distinct pno) from W where W.eno=E.eno); 答案 2:select ename from E, (select eno, count(distinct pno) as pnumber from W group by eno) X where E....

    城院数据库系统原理实验9.doc

    1. 子查询:子查询是嵌套在另一个查询中的查询,可以返回单个值、一组值或结果集。在文件中,相关子查询和不相关子查询被用来查询没有生成过订单的职工。不相关子查询(也称为独立子查询)在外部查询中不依赖于任何...

Global site tag (gtag.js) - Google Analytics