SQL語句的where
where id = 1 AND (sno = xxx OR 1 = 1)
用這試一下,sql注入的做法.
可是我要的是當sno沒值傳進來的時候就永遠成立,有值傳進來就要判斷的
這個恐怕做不到。
只能做到說是給sno一個默認值(一個sno永遠不可能的值),然后沒有參數進來的時候,程序自然去判斷1=1從而忽略掉sno = xxxx, 不去判斷后面的sno =xxx,
如果有參數進來的時候,程序首先判斷sno = 傳遞來得值,而忽略后面的1=1。
因此必須確保or前后的語句的次序以實現這個
select * from table where id=1 and (sno = xx OR 1 = 1)
sql注入個人能力范圍內只能到這個程度了。
sql語句中where 1=1是什么意思
這段代碼應該是由程序(例如Java)中生成的,where條件中 1=1 之后的條件是通過 if 塊動態變化的。例如:
String sql="select * from table_name where 1=1";
if( conditon 1) {
sql=sql+" and var2=value2";
}
if(conditon 2) {
sql=sql+" and var3=value3";
}
where 1=1 是為了避免where 關鍵字后面的第一個詞直接就是 “and”而導致語法錯誤。
基本說明:
1、這個SQL語句很明顯是全表掃描,需要大量的IO操作,數據量越大越慢,建議查詢時增加必輸項,即where 1=1后面追加一些常用的必選條件,并且將這些必選條件建立適當的索引,效率會大大提高;
2、主要是一些程序員的為了拼湊動態的sql語句,如果使用不好會起到副作用的,是根據個人的一些習慣,是為了避免where 關鍵字后面的第一個詞直接就是“and”而導致語法錯誤,是為了后面附加and方便程序邏輯處理用的。
SQL中的where子句和haveing子句的區別where子句
where是對記錄限定條件的,having是對一組記錄限定條件的。
所以不用group by也用不上having;用了group by即可用where也可用having。 group by是依據指定的字段,將具有相同數值的幾條記錄合并成一條。
好比,數據庫有一個存學生成績的表叫“成績表”,里面有(班級,學號,數學,語文)四個字段,現在要按班級為單位求每個班的數學平均分,就是 select 班級,avg(數學) from 成績表 group by 班級 如果想知道每個班語文成績在80分以上的人的數學平均成績,那就用where,因為這個條件是對個人的考察,相當于先select出所有班所有語文成績在80分以上的人,對這些人按班級group,再做數學成績的avg。 寫成 select 班級,avg(數學) from 成績表 where 語文>80 group by 班級 如果想知道語文成績平均分在90分以上的班級的數學平均分,那就要用having了,因為這個條件是對整個班級來評價的,相當于先按班級把記錄分成幾個group,然后看每個group是否符合語文平均分在90以上,符合這個having的班級的數學平均分將被顯示出來。
寫成 select 班級,avg(數學) from 成績表 group by 班級 having avg(語文)>90 兩個一起用也可以啊,比如寫成 select 班級,avg(數學) from 成績表 where 語文>80 group by 班級 having avg(語文)>90 相當于先把語文是80分以上的人找到,然后讓他們按班級分組,再看每個班這寫語文分上80的人的平均分到沒到90,連班里80分以上的學生的平均分都達不到90的班級,這樣的班級的數學平均分也不想知道了。 其實看select和having寫的位置也很能體現這種處理先后的感覺,一個跟在from后面,比group by優先;另一個要先group by了再寫。
轉載請注明出處華閱文章網 » sql語句與where