平時在sql查詢中都要注意not in後面的條件中不能有null,如果有null就沒有返回結果了,而in後面有null依然可以有返回結果。
說下我的理解:
in後面的子句可以理解爲or拼接
比如
select * from t_student where height in(175, 177, null)
後面的height in (175, 177, null)
可以理解爲height =175 || =177 || =null
只要滿足一項判斷,整條判斷就算true,於是這條記錄就會被放到結果集裏面
而not in 後面的子句可以理解爲and 拼接
height not in (175, 177, null) 可以理解爲 height != 175 && != 177 && != null
在數據庫中任何有null參與的比較運算都會被算做false,所以一項判斷爲false,整條判斷就算false,於是記錄就不會被放到結果集裏面。
再放上幾個關於null的“坑”
- 如果null參與算術運算,則該算術表達式的值爲null。(例如:+,-,*,/ 加減乘除)
- 如果null參與比較運算,則結果可視爲false。(例如:>=,<=,<> 大於,小於,不等於)
- 如果null參與聚集運算,則聚集函數都置爲null(使用isnull(字段,0)等方式可以避免這種情況)。除count(*), count(1), count(0)等之外(count(字段) 字段爲null的行不參與計數)。
- 如果在not in子查詢中有null值的時候,則不會返回數據。