zoukankan      html  css  js  c++  java
  • SQL中EXISTS和IN用法

    SQLEXISTS的用法 

    指定一个子查询,检测行的存在。

    语法:EXISTS subquery

    参数:subquery

    是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。  

    结果类型:Boolean

    结果值:如果子查询包含行,则返回 TRUE。否则返回False。

     

    select  Resc_id  from  dbo.Res_Coach

    where  EXISTS (select * from  Res_Coach  where  Resc_id  is  null)

     

    查询原理:

    遍历dbo.Res_Coach每一条,同时处理where条件(EXISTS (select * from Res_Coach where Resc_id=0) 判断结果为true或者false),为true时拿出该条,false时,放弃该条记录。

     

    1)  where条件中的子查询和主查询没关系

    select  Resc_id

    from  dbo.Res_Coach

    where  EXISTS (select  Rese_id  from  dbo.Res_Excellent  where  Rese_id  Is  null )

     

    2)  where条件中得子查询和主查询有关系

    select  Resc_id

    from  dbo.Res_Coach

    where  EXISTS (select  Resc_id  from  dbo.Res_Coach  where  Resc_id  Is  null )

     

    注:不管where条件中得子查询和主查询有没有关系,遍历主查询中得每一条时,判断where条件,exists结果为真,where条件返回true,拿出该条记录,where条件返回false,不返回该记录。

     

    SQLINEXISTS用法的区别

     

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

    这两个函数是差不多的, 但是由于优化方案的不同:

    NOT  EXISTS要比NOT  IN 快。not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。因为NOT  EXISTS可以使用结合算法而NOT  IN 就不行了。

    IN 要比EXISTS快, 因为这时候IN可能更多的使用结合算法。如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in

    exits 相当于存在量词:表示集合存在,也就是集合不为空(只作用一个集合)。例如 exist  P 表示P不空时为真;not exist P表示p为空时为真。in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时为真; s not in P 表示s与P中的每一个值都不相等时为真

    例:

    select getdate()
    select * from tab_Resource where  Res_TypeTree_Id in  (select * from Split('1,3,361,16619,16620,16621,16622',','))
    select getdate()

    select getdate()
    select * from tab_Resource
    where  exists((select col from Split('1,3,361,16619,16620,16621,16622',',') where Res_TypeTree_Id=col))
    select getdate()

    SQL in =的区别

    select name from student where name in ('zhang','wang','li','zhao');

    select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

    的查询结果是相同的。

  • 相关阅读:
    ORACLE 按照指定顺序排序输出某些字段
    jsp 选择年份产生周下拉框
    jsp标签foreach
    润乾报表个人笔记
    eclipse加大服务器容器内存
    jsp input中使用fmt 格式化时间
    log4j简单使用java web项目--后台打印以及输出到文件
    log4j简单使用java项目--后台打印以及输出到文件
    声明:放弃博客园平台,近日将所有随笔转移到CSDN,并删除所有已公开的随笔。
    项目 Java 2 go的一些准备活动
  • 原文地址:https://www.cnblogs.com/BluceLee/p/3643500.html
Copyright © 2011-2022 走看看