如果我有一个sql语句,如:
Select * from Order, OrderDetail
where Order.ID = OrderDetail.OrderID and OrderDetail.Amount > 5
是否意味着当订单联合使用OrderDetail查找行符合条件时所有行中的循环数量> 5 ??
请帮帮我。
我的问题是:如果在连接2个表之后,在创建的所有行中执行数据库循环以查找行满足条件。
答案 0 :(得分:4)
该查询通过Order.ID = OrderDetail.OrderID
加入两个表。是否在I / O期间或之后过滤结果行到达数据库。如果您在Amount
上有索引,则可以想象它会查找匹配的行然后加入。最好查看查询的EXPLAIN
。
但您的查询更好地表达为:
select *
from Order
join OrderDetail on Order.ID = OrderDetail.OrderID
where OrderDetail.Amount > 5
此语法非常清楚了什么是连接条件,以及什么是行过滤条件。像这样格式化也可以更容易阅读!
通常,表格都有别名,使其更容易阅读:
Select *
from Order o
join OrderDetail od on o.ID = od.OrderID
where od.Amount > 5
答案 1 :(得分:3)
重写为......
Select *
from Order, OrderDetail
where Order.ID = OrderDetail.OrderID
and OrderDetail.Amount > 5
...此查询使用旧的equijoin语法(来自Order,OrderDetail)。这与进行连接相同,例如:
Select *
from Order
join OrderDetail ON ID=OrderId
where OrderDetail.Amount > 5
我写这个的方式可能是:
SELECT *
FROM Order o
JOIN OrderDetail od ON o.ID = od.OrderId AND od.Amount > 5
此查询获取订单中所有在OrderDetail中具有匹配记录且金额大于5的记录。
你提到了一个UNION,我想说明一个JOIN和UNION是不同的东西。 UNION会将行合并到一个集合中,而JOIN会将列合并到一个集合中。