• mysql exists用法


    在mysql中,有个关键字exists比较难理解,今天就来搞明白其含义和应用

    exists的使用总是跟子查询关联起来,一种是不相关子查询,对于exists来说更常用的是相关子查询

    不相关子查询:子查询和父查询没有直接的关系。只要子查询为真,则返回父查询的所有结果。否则返回空

    select A.id from A where exists (select B.name from B where B.name = "hello world");

    相关子查询:

    select A.id from A where exists (select B.id from B where B.id = A.bid);

    分析上面这句相关子查询的工作步骤:

      步骤1,首先从表A取出一条数据,然后其中把A.bid列数据代入到子查询中,

      步骤2,执行子查询,当子查询结果不为空时,返回true,否则返回false,

      步骤3,父查询根据子查询的结果,如果为true,则把该条数据加入返回结果集中,否则跳过

      遍历表A的所有数据,重复执行以上3个步骤,完成后把结果集返回

    分析exists和in的使用场景。

    原则:小表查询内嵌,大表查询外套

    查询效率分析,从减少遍历查询次数角度优化:

      当父查询表的数据量大,子查询表数据量小时,使用in;因为使用in,子查询是嵌套在父查询里面的,因此需要遍历父查询,遍历次数为子查询返回结果的大小;

      当父查询表的数据量小,子查询表数据量大时,使用exists;使用exists,从结果来说其父查询是嵌套在子查询里面的,因此需要遍历子查询,遍历次数为父查询的数据量。

    例子,下面的例子是为了说明in和exist的区别,实际上并不是最优写法,实际上此处使用join查询可能更好。

      假设有两个表A和B,并且A表的数据量远大于B表,A包含了B的主键,假设A是父查询,则使用in比较好

    select A.* from A where A.bid in (select id from B where B.id = A.bid);

       同上假设,不过数据量关系相反,A表的数据量远小于B表的数据量

    select A.* from A where exists (select id from B where B.id = A.bid);

    从语义上来说,in和exists的意思是相近的,比如上面这两个例子,两个sql语句的意思都是:从A中筛选出bid存在于B表的数据 

  • 相关阅读:
    How do I add elements to a Scala List?
    Can you share some Scala List class examples?
    How to add elements to a List in Scala
    数据结构和算法学习三,之递归和堆栈
    数据结构和算法学习二,之循环和递归
    数据结构和算法学习一,开篇
    Android Skia和2D图形系统 .
    EGL接口介绍-----Android OpenGL ES底层开发
    OpenGL网络资源
    OpenGL—Android 开机动画源码分析二
  • 原文地址:https://www.cnblogs.com/zhangxuezhi/p/11963721.html
Copyright © 2020-2023  润新知