理解加入

时间:2010-12-01 20:55:28

标签: mysql sql join

我正在看这段代码:

select customers.name
from customers, orders, order_items, books
where customers.customerid = orders.customerid
and orders.orderid = order_items.orderid
and order_items.isbn = books.isbn
and books.title like '%java%';

并且发现很难理解它。

首先我有4个表,代码正在制作一个动态表,
我应该看一下不同的顺序来更好地理解它吗?

首先,我选择customer.name,但只有在最后一个代码运行后才有我的动态表,对吧?

我应该尝试使用先前成为一行的动态表逐行排列每个2个表吗?

并且在制作表格的同时,表格中的所有数据是写入的还是仅仅是我在哪里写的?

感谢你的帮助。

2 个答案:

答案 0 :(得分:3)

就理论而言,当您尝试连接所有表时查询多个表时,会计算所有相关表的临时交叉产品。这意味着总行数是每个表的行数的乘积。

然而,在实践中,SQL(在您的情况下为MySQL)的实现将注意有效地计算查询。根据各种参数计算查询执行路径,并用于获取所需的输出。

编写上述语句的更好方法是遵循新语法:

SELECT customers.name FROM customers
INNER JOIN orders ON customers.customerid = orders.customerid
INNER JOIN order_items ON orders.orderid = order_items.orderid
INNER JOIN books ON order_items.isbn = books.isbn
WHERE books.title LIKE '%java%'

了解更多here的原因。

答案 1 :(得分:0)

Rapid Fire在解释“跨产品”方面做得很好。这里有一些额外的提示。

首先:SQL不是程序代码。它是一个查询。整个查询同时进行。您需要阅读整个查询才能理解这一切。您没有读取查询的“顺序”。对于类比,X = Y与Y = X相同...同样,您将整个查询作为单个单元读取。

接下来,SQL将您从表创建过程中抽象出来。试着从数学角度考虑它,基于关系代数。也就是说,表是关系(或元组)等。查阅C. J. Date的书籍并阅读它们。有一种数学语言是SQL设计的,学习可以大大提高你理解数据库的能力。