广告合作
  • 今日头条

    今日头条

  • 百度一下

    百度一下,你就知道

  • 新浪网

    新浪网 - 提供新闻线索,重大新闻爆料

  • 搜狐

    搜狐

  • 豆瓣

    豆瓣

  • 百度贴吧

    百度贴吧——全球领先的中文社区

  • 首页 尚未审核订阅工具 订阅

    Mysql中in, exists与or关键字的区别

    来源:网络收集  点击:  时间:2024-02-23
    【导读】:
    使用Mysql的同学都知道,在实现功能的基础上,最好还要考虑安全性,扩展性,性能等方面的问题。有时候实现一个功能可以有多种不同的方法。俗话说条条大路通罗马,但有些是大路,有些是小路,还有些是近路。我们应该具备智慧的眼光去选择一条合适的路。今天要讲的内容是在Mysql中in,exists与or关键字有撒区别,在不同的情况下使用有什么差别。方法/步骤1/7分步阅读

    写法上的区别:

    假设有表A,A表中有字段name。name的值可能为x,y,z。现要找出A表中name为y,z的记录:

    or的写法:

    select * from A where name=y orname=z

    in的写法:

    select * from A where namein (y, z)

    2/7

    in,or执行效率大比拼:

    如果字段name是主键或者有索引的话,那上述or和in两条SQL语句的执行效率是差不多的。

    否则的话,随着or的个数越多,执行效率下降得就越利害。当然在表中记录不多的情况下,影响也不会太大。

    但or越多写着也越麻烦不是,而且还不容易维护。

    3/7

    exists也来凑热闹:

    要使用exists,我们再来新建一个B表。B表中也有字段name。name的值可能为w,x,y(注意A表可能值为x,y,z)。现要找出A表中name与B表中name相同的记录:

    exists的写法:

    SELECT * FROM A WHERE EXISTS (SELECT B.name FROM b WHERE a.name = b.name)

    4/7

    in,exists执行原理介绍:

    先来看个例子,下面代码1和代码2哪个的执行效率高(只是把循环次数的位置调换了一下):

    代码1:

    for(i=1; i100; i++)

    {

    for(j=1; j10000; j++)

    {

    call fun(); // 调用函数

    }

    }

    代码2:

    for(i=1; i10000; i++)

    {

    for(j=1; j100; j++)

    {

    call fun(); // 调用函数

    }

    }

    都执行相同的循环次数。难道效率不是一样的吗?其实不然,代码1要优于代码2。原因如下:

    虽然在函数的调用上没有区别,便在变量【i】,【j】运算上效率却是不同的。

    代码1中【i】为赋值了100次,而【j】被赋值了100*10000次。

    代码2中【i】为赋值了10000次,而【j】被赋值了100*10000次。

    说上面的原理的目的在于引入in和exists执行机制。

    我们假设i循环代表了外表也就是之前提到的A表,而j循环代表了内表,也就是之前提到的B表。

    【in】相当于先选择j循环(内表,B表),后执行i循环(外表,A表);

    【exist】相当于先选择i循环(外表,A表),后执行j循环(内表,B表);

    这么类比有可能不一定很准确,但大概意思差不多。先想想它

    5/7

    in,exists执行效率大比拼:

    还是以下面的SQL语句为例:

    SELECT * FROM A WHERE EXISTS (SELECT B.name FROM b WHERE a.name = b.name)

    结合上述的理论,推出以下结论:

    1. 如果A表记录条数多于B表,则选择为in效率更高;

    2. 如果A表记录条数少于B表,则选择为exists效率更高;

    还不明白的,再通过上面的代码1和代码2来理解一下,应该就清楚了。

    6/7

    扩展说明1:

    in操作符不仅能像下面这样用字符数组的形式,

    select * from A where namein (y, z)

    也可以向exists一样,用子查询:

    select * from A where A.namein (select B.name from B)

    7/7

    扩展说明2:

    在In与exists的查询结果基本之上,如果想取反,加上NOT关键字就可以了。

    select * from A where namein (y, z) 变成:

    select * from A where name not in (y, z)

    exists 变成 not exists。

    是不是很方便呢。

    注意事项

    如果有帮助请投票+收藏哦。

    SQLINEXISTSOR
    本文关键词:

    版权声明:

    1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

    2、本站仅提供信息发布平台,不承担相关法律责任。

    3、若侵犯您的版权或隐私,请联系本站管理员删除。

    4、文章链接:http://www.1haoku.cn/art_125202.html

    ©2019-2020 http://www.1haoku.cn/ 国ICP备20009186号06-04 15:00:09  耗时:0.029