V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Le4fun
V2EX  ›  程序员

问个简单 sql 问题

  •  
  •   Le4fun · 2017-10-11 16:27:21 +08:00 · 1890 次点击
    这是一个创建于 2381 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写查询的时候,查 A 表数据,条件是 A.a 等于 B.b(这个也是个查询)

    select * from A where A.a=( select b From B WHERE b.c='')

    也就是 select 嵌套和 left join 写法有什么区别么

    效率等方面

    8 条回复    2017-10-12 10:44:24 +08:00
    jason2017
        1
    jason2017  
       2017-10-11 16:41:00 +08:00
    先吐槽一下:
    b.c 是啥?
    也不说下是 mysql 还是 oracle。
    你这个语句,( select b From B WHERE b.c='')如果查出多条你猜会报什么错?

    推测一下,你应该问的是 exists 用法。
    msg7086
        2
    msg7086  
       2017-10-11 16:44:05 +08:00
    SQL 的具体实现是软件决定的。可能 Oracle 秒出的结果,MySQL 要暴力搜半天。
    saulshao
        3
    saulshao  
       2017-10-11 16:48:47 +08:00
    与 Join 有区别的,SQL 的写法数学基础来自于集合论。
    子查询的优点是写法更直观(肉眼可读),并且有助于逻辑分析。
    但是不是所有的都适合写子查询,大多数时候,子查询都应该写为 A.a in 而不是 A.a =
    neoblackcap
        4
    neoblackcap  
       2017-10-11 16:50:40 +08:00
    如果效果等价的话,现在很多查询优化器都是可以直接优化成一样的,具体你可以用 explain 命令看看。
    enenaaa
        5
    enenaaa  
       2017-10-11 16:56:53 +08:00
    @jason2017 可能是 in 子句。

    left join 和 in 在效率上的区别, 差距不大。 我瞎猜的。
    jason2017
        6
    jason2017  
       2017-10-11 17:01:28 +08:00
    @enenaaa
    left join 和 in 完全不是一回事,一个是联表查询,一个是子查询。
    说到子查询,绝大部分情况下,exists 都要比 in 好。
    Le4fun
        7
    Le4fun  
    OP
       2017-10-12 10:42:08 +08:00
    @jason2017 效果相同情况下 用哪个比较好
    Le4fun
        8
    Le4fun  
    OP
       2017-10-12 10:44:24 +08:00
    @jason2017 联表和子查询
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1355 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:34 · PVG 01:34 · LAX 10:34 · JFK 13:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.