• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Le4fun
V2EX  ›  程序员

问个简单 sql 问题

  •  
  •   Le4fun · Oct 11, 2017 · 2481 views
    This topic created in 3309 days ago, the information mentioned may be changed or developed.

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

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

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

    效率等方面

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

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

    left join 和 in 在效率上的区别, 差距不大。 我瞎猜的。
    jason2017
    jason2017
    Oct 11, 2017
    6
    @enenaaa
    left join 和 in 完全不是一回事,一个是联表查询,一个是子查询。
    说到子查询,绝大部分情况下,exists 都要比 in 好。
    Le4fun
    Le4fun
    OP
    Oct 12, 2017
    7
    @jason2017 效果相同情况下 用哪个比较好
    Le4fun
    Le4fun
    OP
    Oct 12, 2017
    8
    @jason2017 联表和子查询
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5053 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 111ms · UTC 01:39 · PVG 09:39 · LAX 17:39 · JFK 20:39
    ♥ Do have faith in what you're doing.