天天看點

關于sql語句in的使用注意規則( 轉)

select * from tuser where userno not in(select userno from filter_barcode)

上面這條語句子查詢裡,userno 并不存在filter_barcode表中,但是整個語句确能正常執行(執行子查詢的話會報字段不存在的提示),而且傳回的是tuser表中所有的結果集。如果大家不注意這種情況,一旦不是用來查詢,是用來删除的,那整個表資料就被不知不覺給删除了。

原因:原來是在不使用表别名的前提下如果in子查詢裡字段在内表找不到就會去引用外表的。

以下四條是我從其他地方看到的,貼出來給大家參考

1.子表引用父表列,而自己沒有,在子表有資料的情況下,傳回所有非空鍵的父表記錄,子表為空,則結果無

2.子表引用父表屬性,隻有最外層子查詢才能引用

3.有字首辨別,按字首,如果子表父表字首一樣,按4的規則

4.如果無字首辨別唯一性,子查詢表也有此字段,那麼以局部子查詢為準

    如果字首一樣,子查詢存在此字段,則以子查詢表為準,否則以父表的為準

總結;為了避免這種問題有幾個方法供大家參考

1、當需要用到in子查詢時,先執行下in裡面的子查詢語句是否有誤,如果誤則進行相應修改

2、使用表字首(别名)才是硬道理,例如

3、使用exists語句來代替in語句

關于exists和in的差別用法這裡就不在講述,大家可以查詢相關資料