为什么要使用join语句?

时间:2014-06-16 07:28:09

标签: mysql sql performance join

我想知道为什么join语句非常流行,因为许多字段可能在结果行中重复。

Supplier(id, name, address)
Product(id, name, detail)
Product_Supplier(id, productId, supplierId, quantity)

SELECT Product.*,
       Product_Supplier.supplierId,
       Product_Supplier.quantity
FROM Product
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId

结果可能如下所示:

Product.id  Product.name  Product.detail  Product_Supplier.supplierId  Product_Supplier.quantity
1           'Product 1'   'bla bla'       100                          20
1           'Product 1'   'bla bla'       101                          30
1           'Product 1'   'bla bla'       102                          20
1           'Product 2'   'bla bla'       100                          120

因此如果product.detail是大文本,那么性能会变慢,对吗?如果这是真的,为什么加入声明很受欢迎?

2 个答案:

答案 0 :(得分:3)

JOIN不受欢迎,需要使用来自多个表的数据来组合结果。

假设您有一个包含产品和其他产品的表格,您希望开发一个程序,生成包含所有销售的详细信息的报告。你需要撰写每一行,怎么做?您可以在程序中使用查询和中间数据结构,或者您可以请求数据库为您执行此操作。因此加入两个表。

在这种情况下,如果product.detail过大且您不希望在结果中使用,则应避免将其包含在所选列中。类似的东西:

SELECT Product.name,
   Product_Supplier.supplierId,
   Product_Supplier.quantity
FROM Product
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId

取而代之的是SELECT Product.* ...

答案 1 :(得分:1)

加入是在一个语句中从不同来源(表,函数,视图等)获取数据的唯一方法。

考虑到您的样本,如何在没有加入的情况下从产品供应商和产品获取所有信息?

当然,您可以在自己的照片中放置多张桌子,而且差异并不大。当关系变得复杂时,联接非常有用。

如果您遇到名称冲突问题,请添加别名:

SELECT Product.id product_id
,      ...
FROM   Product
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId

考虑到您的效果标记:联接并不总是比其中的多个表表现更好。例如,Oracle在视图关系和ANSI连接中存在一些问题。