2014-10-20 36 views
0

是什麼以下兩個查詢之間的區別: -MySql「FROM」子句如何處理多個表名?

  1. 查詢1: SELECT ORD * FROM訂單奧德order_hotels哦(返回空)
  2. 查詢2: SELECT ORD * FROM。命令ord(返回所有記錄)

那麼,通過在「FROM」子句(查詢1)中指定多個表名稱,即使我沒有使用其他表將影響查詢結果?如何?

感謝

+2

簡單的規則:從不在'from'子句中使用逗號。始終使用明確的「連接」。 – 2014-10-20 12:10:50

+0

需要一些幫助來理解上述兩個查詢。 – 2014-10-20 12:13:31

+0

http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/幫助解釋表連接。如果2返回記錄,則1將返回更多。訂單中的記錄數量(例如1000)*在我的示例中,order_Hotels(例如10000)(例如1000萬)中的記錄數量。也許它只是需要很長時間才能運行。當使用兩個表格時,你需要告訴數據庫表格如何關聯,如何加入;像ORDERS.ID和order_Hotels.Order_ID假設一個主鍵外鍵關係,否則你得到一個笛卡爾積(A * B)而不是A相交B. – xQbert 2014-10-20 12:15:18

回答

1

您與空的結果集的查詢是這樣的,闡述了可讀性

SELECT ord.* 
    FROM orders AS ord, order_hotels AS oh 

正是由於這個查詢

 SELECT ord.* 
     FROM orders AS ord 
INNER JOIN order_hotels AS oh 
表的帶點兒懷舊逗號分隔的列表,語法

此查詢,INNER JOIN沒有任何ON子句,爲orders和0123中的每個可能的行配對返回一行。您已經聲明order_hotels不包含任何行。所以,這個查詢是盡職盡責地返回每一個可能的配對,這是沒有行。

如果你試圖做一些與你填充order_hotels表甚至在這兩個表有意思,你可以嘗試這樣的事:

 SELECT ord.*, oh.hotel_name 
     FROM orders AS ord 
    LEFT JOIN order_hotels AS oh ON ord.hotel_id = oh.hotel_id 

(我猜列名,我可以有)LEFT JOIN返回一個結果集,該結果集顯示orders中的所有行以及order_hotels中的匹配行。 ON子句指定行匹配的含義。