我正在看这段代码:
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个表吗?
并且在制作表格的同时,表格中的所有数据是写入的还是仅仅是我在哪里写的?
感谢你的帮助。答案 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设计的,学习可以大大提高你理解数据库的能力。