2011-12-21 39 views
2

,如果我有一個像SQL語句:SQL與條件

Select * from Order, OrderDetail 
where Order.ID = OrderDetail.OrderID and OrderDetail.Amount > 5 

意思循環時的OrderDetail訂單工會找到一行滿足的條件金額> 5的所有行?

請幫我一把。

我的問題是:如果加入2個表後,Do數據庫循環創建的所有行中查找行符合條件。

回答

4

該查詢通過Order.ID = OrderDetail.OrderID加入兩個表。在I/O期間還是在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 
+0

我第二.. – Vineeth

3

改寫爲...

Select * 
from Order, OrderDetail 
where Order.ID = OrderDetail.OrderID 
and OrderDetail.Amount > 5 

...這個查詢使用舊的等值連接語法(從訂單,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.


你提到了一個聯盟,我想說明一點,JOIN和UNION是不同的東西。 UNION將合併成一個集合,而JOIN將合併合併成一個集合。