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

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   strong   資料   ar   

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的區別用法這裡就不在講述,大家可以查詢相關資料

對於in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了 ,另外IN是不對NULL進行處理。
http://www.cnblogs.com/xiaoqiangzhou/p/3919270.html
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.