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
  • 相关阅读:
    九度OJ 1136:Number Steps(步数) (基础题)
    九度OJ 1135:字符串排序 (排序)
    九度OJ 1134:密码翻译 (翻译)
    day 2克隆虚拟机器minimal需要注意的问题和制作本地yum源和常用的Linux的命令
    ssh 免 密码登录另一台机器 和 secureCRT的乱码问题
    Select2 用法
    JS常用功能
    虚拟机CentOS的NAT模式联网和SecureCRT远程登录管理工具
    2.网络配置和shell获取ip
    1.安装虚拟机遇到到问题和内存拓展
  • 原文地址:https://www.cnblogs.com/softidea/p/3919330.html
Copyright © 2011-2022 走看看