2012-03-19 91 views
58

我有这样的跨数据库查询...差异在MySQL JOIN VS LEFT JOIN

SELECT 
      `DM_Server`.`Jobs`.*, 
      `DM_Server`.servers.Description AS server, 
      digital_inventory.params, 
      products.products_id, 
      products.products_pdfupload, 
      customers.customers_firstname, 
      customers.customers_lastname 
     FROM `DM_Server`.`Jobs` 
     INNER JOIN `DM_Server`.servers ON servers.ServerID = Jobs.Jobs_ServerID 
     JOIN `cpod_live`.`digital_inventory` ON digital_inventory.jobname = Jobs.Jobs_Name 
     JOIN `cpod_live`.`products` ON products.products_pdfupload = CONCAT(digital_inventory.jobname, ".pdf") 
     JOIN `cpod_live`.`customers` ON customers.customers_id = products.cID 
     ORDER BY `DM_Server`.`Jobs`.Jobs_StartTime DESC LIMIT 50 

它运行良好,直到我让他们LEFT JOIN秒。我认为,通过不指定一种类型的连接,它被假定为LEFT JOIN。这不是这种情况吗?

+0

请显示你得到的错误,thx。 – 2012-03-19 12:41:36

回答

159

我认为,通过不指定一种类型的连接,它被认为是一个左连接。这不是这种情况吗?

不,默认连接是INNER JOIN。

这里是a visual explanation of SQL joins

内连接

enter image description here

左加入

enter image description here

+0

通过跨数据库TS可能意味着他的查询使用来自多个数据库的表。 – 2012-03-19 12:47:36

+0

@Lex:谢谢,我编辑过。 – 2012-03-19 12:47:53

+2

为什么'LEFT JOIN'比'INNER JOIN'要慢得多? – Webnet 2012-03-19 12:55:51

13

号当没有指定类型,一个INNER JOIN被使用。阅读差异; wikipedia

9

如果您只指定JOIN,我相信默认值为INNER JOIN

7

如果您刚才在默认查询时提到了JOIN,它将被视为 作为INNER JOIN。

左连接:左连接将从左表中获取所有元素,并仅将来自右表的匹配记录作为Follows。 例如:

SELECT column_name(s) 
FROM table_name1 #(Left table) 
LEFT JOIN table_name2 #(Right table) 
ON table_name1.column_name=table_name2.column_name 

希望这有助于。