MySQL:高效的查询

时间:2011-05-28 02:22:52

标签: mysql sql join query-optimization

  

可能重复:
  SQL left join vs multiple tables on FROM line?

   SELECT messages.message_title, 
          messages.message_content, 
          messages.message_timestamp, 
          user_message_relations.sender_id
     FROM messages 
LEFT JOIN global_messages ON messages.message_id = global_messages.message_id
LEFT JOIN user_messages ON messages.message_id = user_messages.message_id, user_message_relations
    WHERE user_message_relations.receiver_id = 3

OR

SELECT messages.message_title, 
       messages.message_content, 
       messages.message_timestamp, 
       user_message_relations.sender_id
  FROM messages,  
       global_messages, 
       user_messages, 
       user_message_relations
 WHERE user_message_relations.receiver_id = 3

我的主要问题是,如果我可以像第二个查询一样直接调用表格,那么使用LEFT OUTER JOIN(或任何类型的JOIN)的重点是什么?有好处吗?


我看到第二种方法不被视为“最佳做法”......考虑到这一点,如果我想填充id为3的用户的收件箱,那么下面的查询是否正确?

SELECT messages.message_id, 
    messages.message_title, 
    messages.message_content, 
    messages.message_timestamp, 
    user_messages.message_id, 
    user_message_relations.sender_id
FROM user_message_relations 
INNER JOIN user_messages ON user_message_relations.user_message_id = user_messages.user_message_id
INNER JOIN messages ON user_messages.message_id = messages.message_id
WHERE user_message_relations.receiver_id = 3

2 个答案:

答案 0 :(得分:1)

正如OMG小马所说的那样,没有"呼叫表"直。在SQL中,可以通过三种方式组合多个表:

  • 外部联接,您可以匹配表的行,但允许其中一个表没有匹配行的情况
  • 笛卡尔积,其中第一个表中的每一行都与第二个表的每一行组合(因此"产品")
  • 内部联接,其中行在两个表中都匹配

碰巧,按照我列出的顺序,你的三个例子各有一个。没有更多"高效"比另一个;他们返回非常不同的结果!

之所以出现混淆,是因为这些语法有两种不同的格式;您的示例2使用较旧的SQL89语法,其中表名由逗号分隔,组合是笛卡尔积,除非WHERE子句中的某些内容表示要加入它们。

答案 1 :(得分:0)

左外连接将为您提供LEFT表中的所有元素,即使右表中没有匹配的元素也是如此。逗号运算符是一个INNER JOIN别名,表示您只需要在某些字段上匹配的元素(来自您要发布的查询,因为表之间没有限制因素,那么您最终会得到表的笛卡尔积)。

此查询仅获取表1和表2中字段相同的元组

Table1 LEFT OUTER JOIN Table2 ON(Table1.field = Table2.field)

此查询将以笛卡尔产品形式获取所有可能的元组

Table1, Table2