zoukankan      html  css  js  c++  java
  • 关于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的区别用法这里就不在讲述,大家可以查询相关资料

    对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN是不对NULL进行处理。
    http://www.cnblogs.com/xiaoqiangzhou/p/3919270.html
  • 相关阅读:
    Java 异常
    【转】Java 内部类总结
    【转】Java中的static关键字解析
    【转】事务及事务隔离级别
    【转】事务并发的问题
    【转】hibernate对象三种状态
    iOS指南针
    CoreLocation 定位
    swift 2.2 语法 (下)
    swift 2.2 语法 (中)
  • 原文地址:https://www.cnblogs.com/softidea/p/3919330.html
Copyright © 2011-2022 走看看