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 and在SQL Server中不影響性能
因為篩選條件里1=1成立 ,該表達式將始終返回布爾值True(真)
"Where 1=1 and "實際等于 Where 表達式1(1=1)=true and 表達式2
當表達式2=True 時
Where true and true
兩個條件都為“真”,“真”與“真”返回“真”
當表達式2=false 時
Where true and false
兩個條件一“真”一“假”,“真”與“假”返回“假”
所以SQL語句篩選表達式(1=1)對整體條件判斷結果無影響,實質篩選取決于and后面的條件篩選結果。
我們擴展看一下另一種寫法"Where 1>1 and "
1>1不成立,該表達式將始終返回布爾值False(假)
當表達式2=True 時
兩個條件一“假”一“真”,“假”與“真”返回“假”
當表達式2=False 時
兩個條件均為“假”,假”與“假”返回“假”
此時不管and后面的條件篩選結果如何,"Where 1>1 and "整體結果將始終為”假“,SQL語句將始終返回空記錄集,and 后面的條件對整體結果無影響。
當我們只需要表結構而不需要數據時,我們可以運行下列語句,例如:
select * from tableName where 1>1;
該語句將返回空記錄集,對于只需要知道數據結構的情形下,這種寫法對于減輕網絡負擔節約系統開銷特別有幫助。
簡述sql語句中where和having的區別,和使用的地方,謝謝
"Where"是一個約束聲明,使用Where來約束來之數據庫的數據,Where是在結果返回之前起作用的,且Where中不能使用聚合函數。"Having"是一個過濾聲明,是在查詢返回結果集以后對查詢結果進行的過濾操作,在Having中可以使用聚合函數。
HAVING子句可以讓我們篩選成組后的各組數據,WHERE子句在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后對組記錄進行篩選。用實例來理解GROUP BY 和 HAVING 子句:
SQL實例:
一、顯示每個地區的總人口數和總面積:
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回記錄分成多個組,這就是GROUP BY的字面含義。分完組后,然后用聚合函數對每組中的不同字段(一或多條記錄)作運算。
二、顯示每個地區的總人口數和總面積.僅顯示那些人口數量超過1000000的地區。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(population)>1000000
注意:不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。
相反,HAVING子句可以讓我們篩選成組后的各組數據.
如果想根據sum后的字段進行排序可以在后面加上:order by sum(population) desc/asc
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語句whereand