首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:高效查询

问MySQL:高效查询
EN

Stack Overflow用户
提问于 2011-05-28 02:22:52
回答 2查看 330关注 0票数 0

可能重复:

SQL left join vs multiple tables on FROM line?

代码语言:javascript
复制
   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

或

代码语言:javascript
复制
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填充用户的收件箱,下面的查询是否正确?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-28 03:21:06

就像OMG小马说的那样,没有所谓的“直接调用表”的东西。在SQL中,可以通过三种方式组合多个表:

  • 外层联接,其中匹配表的行,但允许其中一个表没有匹配行
  • Cartesian积,其中第一个表的每一行与第二个表(因此是“产品”)的每一行组合为一个内部联接,其中两个表(

)中的行都匹配。

碰巧,您的三个示例都有其中一个,按我列出的顺序排列。没有一个比另一个更“有效率”,他们返回的结果非常不同!

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-28 02:30:00

即使右边的表中没有匹配的元素,左侧的外部联接也会为您提供来自左侧表中的所有元素。逗号运算符是一个内部联接别名,它指示您只需要在某些字段上匹配的元素(从您正在发布的查询中,您在表之间没有限制因素,那么您将得到表的笛卡儿积)。

此查询只获得元组,其中字段在Table1和Table2中是相同的。

代码语言:javascript
复制
Table1 LEFT OUTER JOIN Table2 ON(Table1.field = Table2.field)

此查询将以笛卡尔乘积形式获取所有可能的元组。

代码语言:javascript
复制
Table1, Table2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6159296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档