MySQL 数据库中 left outer join 和 left join 啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 数据库中 left outer join 和 left join 啥区别相关的知识,希望对你有一定的参考价值。

参考技术A 无区别

left join 是left outer join的简写,

left join默认是outer属性的。本回答被提问者采纳
参考技术B 左连接连接时以左面的关系为主,有面的关系如果没有匹配项的全部用空代替

MySQL中的LEFT OUTER JOIN vs SUBSELECT

【中文标题】MySQL中的LEFT OUTER JOIN vs SUBSELECT【英文标题】:LEFT OUTER JOIN vs SUBSELECT in MySQL 【发布时间】:2012-06-22 04:46:42 【问题描述】:

我有一张表说table1,它有 3 列 column1, column2 and column3

column1column2FOREIGN KEY 和另外 2 个表。但是column3 中的数据来自 n 个表。

例如让我们考虑一下 Facebook。为了显示活动,它可能会维护一个可能有user1 photoliked photo1user1 statusliked status1 的表。所以在这种情况下,column3 不能是带有特定表的FOREIGN KEY

现在有两种获取真实数据的方法 -

第一种方式-

SELECT user_id,
       verb_id,
       CASE WHEN verb_id = photoliked THEN
            (SELECT photo_name FROM photos WHERE photo_id = column3) -- getting the desired data from the third column
         WHEN verb_id = statusliked THEN
            (SELECT status FROM statustable WHERE status_id = column3) 
         ELSE '' END AS performedon
FROM table1
     JOIN table2 ON user_id = user_id  -- joining the first column
     JOIN table3 ON verb_id = verb_id  -- joining the second column

第二种方式-

SELECT user_id,
       verb_id,
       CASE WHEN verb_id = photoliked THEN
            p.photo_name
         WHEN verb_id = statusliked THEN
            s.status
         ELSE '' END AS performedon
FROM table1
     JOIN table2 ON user_id = user_id  -- joining the first column
     JOIN table3 ON verb_id = verb_id  -- joining the second column
     LEFT JOIN photos p ON p.photo_id = column3  -- joining the column3 with specific table 
     LEFT JOIN statustable s ON s.status_id = column3

问题

这两种方法中哪一种更好地检索数据? 两个查询中哪一个更便宜?

【问题讨论】:

可能重复***.com/a/10684539/1239506 不,它不是重复的。在那个问题中,WHERE 子句中有一个INSUBSELECT 不依赖于主查询的任何列。 第二个查询更好... 可以做一个解释来分析查询。 第二个查询更好、优化、独立且更快。虽然第一个查询是依赖的并且需要更多的执行时间。 【参考方案1】:

第二个会更快,原因是第一个包含所谓的相关子查询。子查询与主查询中的记录相关。因此,对于主查询中的每个匹配记录,子查询都需要运行一次。在您的情况下,它无法运行子查询,直到它确定主查询中的 verb_id 值。需要运行很多查询。

第一个查询中的 EXPLAIN 应表明此问题。当您在 EXPLAIN 中看到它时,这通常是一个危险信号。

【讨论】:

【参考方案2】:

我认为JOIN 会更快,因为它对查询执行一次,而且我会尝试在JOIN 中过滤verb_id

SELECT user_id,
   verb_id,
   COALESCE(p.photo_name, s.status) AS performedon
FROM table1
    JOIN table2 ON user_id = user_id  -- joining the first column
    JOIN table3 ON verb_id = verb_id  -- joining the second column
    LEFT JOIN photos p ON verb_id = 'photoliked' AND p.photo_id = column3  -- joining the column3 with specific table 
    LEFT JOIN statustable s ON verb_id = 'statusliked' AND s.status_id = column3

【讨论】:

【参考方案3】:

您可以使用这种方法:

SELECT t.user_id,
       t.verb_id,
       p.photo_name  AS performedon
FROM table1 AS t
     JOIN table2 AS t2  ON t2.user_id = t.user_id  
     JOIN table3 AS t3  ON t3.verb_id = t.verb_id 
     JOIN photos AS p  ON  p.photo_id = t.column3  
                       AND t.verb_id = 'photoliked'

UNION ALL

SELECT t.user_id,
       t.verb_id,
       s.status  
FROM table1 AS t
     JOIN table2 AS t2  ON t2.user_id = t.user_id
     JOIN table3 AS t3  ON t3.verb_id = t.verb_id
     JOIN statustable AS s  ON  s.status_id = t.column3
                            AND t.verb_id = 'statusliked' ;

【讨论】:

以上是关于MySQL 数据库中 left outer join 和 left join 啥区别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 数据库中 left outer join 和 left join 啥区别?

关于mysql中的left join和left outer join的区别

mysql where not in to left outer join

在 MYSQL 中执行 LEFT OUTER JOIN 时插入零而不是 NULL

让 LEFT OUTER JOIN 工作的问题

MYSQL FULL OUTER JOIN - 使用 LEFT-UNION-LEFT JOIN 时的所有 NULL 结果