首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
Coding
V2EX  ›  MySQL

这两种查询的实现,有什么区别?什么场景下使用 join?

  •  
  •   liunaijie · 62 天前 · 3010 次点击
    这是一个创建于 62 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有这么两张表
    学生表 a
    (id,name)
    成绩表 b
    (id,a_id,score)
    然后查询张三的成绩。
    我之前都是用:

    select b.score from a,b where a.name = '张三' and a.id = b.a_id
    

    这两天面试的时候一个面试官问我,这个用 join 怎么写。

    select b.score from b left join a on a.id = b.a_id where a.name = '张三'
    

    请问一下,这两种实现在性能上有什么区别吗?我一般不会去用 join 写,什么场景下要用 join 这么写?

    17 回复  |  直到 2019-10-15 09:06:13 +08:00
        1
    clarkyi   62 天前
    explain 一下你就知道了
        2
    lihongjie0209   62 天前
    select b.score from a,b 这是笛卡尔积, 要爆炸的。
        3
    liprais   62 天前   ♥ 1
    select b.score from a,b where a.name = '张三' and a.id = b.a_id
    等价于
    select b.score from b inner join a on a.id = b.a_id where a.name = '张三'
        4
    reus   62 天前
    首先学会用 explain,然后你就能自己分析,不需要问人了。
        5
    qwerthhusn   62 天前
    from a join b on a.c = b.d 这个是内连接和 inner join 是一样的效果
    from a join b on a.c = b.d(+) 这个是左连接还是右连接忘记了,MySQL 不支持(+)连接符,Oracle 是支持的,但是一般都是推荐用 left|right join...on...这种,因为(+)有点不好理解


    @lihongjie0209 where 条件会限制不是笛卡尔集的
        6
    newtype0092   62 天前
    什么情况下都应该使用 join,from a,b 这种是满足特定条件的简便写法,你不知道原本含义的话就不要使用简便写法防止踩坑。
    inner join 的问题在于如果学生没有成绩结果里是没有这行的,如果有 3 个张三,某个没有成绩,你这个结果只会返回 2 行(假设 1 个学生最多只有 1 个成绩的情况下)
    left join 能保证左表数据是完整的
        7
    wangyzj   62 天前
    永远用 join
    用笛卡尔积会炸
        8
    zsy979   62 天前
    第一个 sql 是 a*b 行数的临时表再 where
    第二个 sql 是 on 后的临时表再 where
        9
    zhuyichen1017   62 天前
    我觉得 Mysql 的优化器应该不会去做笛卡尔积吧
        10
    Aresxue   62 天前
    扫描行数的区别,看下执行计划
        11
    x66   62 天前
    MySQL 8.0 实测并不会生成笛卡尔积。。
    从 explain 上来看也并没有什么区别。。
        12
    huijiewei   62 天前
    这两种实现的数据结果完全是不一样的。所以没有性能区别
        13
    huijiewei   62 天前
    up 我看到了 a 表的限定,所以没有区别,没有 A 表限定的话就有区别了
        14
    sadfQED2   62 天前 via Android
    @x66 MySql5.7 实测也没生成笛卡尔积,而且 explain 也没有什么区别
        15
    Shaw314   62 天前
    如果第一句写成 inner join on 的话,可能性能会好一点,查询优化器可以选择查询成本较小的连接循序🙄
        16
    NotFoundEgg   62 天前
    个人认为在像你例子中这种简单的 sql 两者是等价的,但是在以后的实际工作中多表联查使用你第一种写法会爆炸的,所以养成好习惯,能 left join 的请一律 left join
        17
    liouop   61 天前 via Android
    select from 两张表 是隐式调用 inner join,直接产生笛卡尔积。具体可以看一下 mysql 必知必会,查一下隐式与显式的区别。主要区别在于前面有人讲到的,on 与 where,on 会先筛选再连接,where 也是连接再条件判断
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2264 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 10:04 · PVG 18:04 · LAX 02:04 · JFK 05:04
    ♥ Do have faith in what you're doing.