程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> where 1=1 和 count(1) 與 count(*)

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

編輯:關於SqlServer

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會幫你完成優化的.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved