2014-10-03 48 views
6

我是SQL新手,無法理解爲什麼在JOIN語句中有FROM關鍵字,如果我使用點符號來選擇我想要的tables.columns。這兩個選擇我選哪張?我在w3schools定義中沒有看到關於哪個表是FROM表的任何解釋。在下面的例子中,我如何知道FROM選擇哪張表?由於我基本上已經選擇了哪個table.column來選擇,它可以嗎?解釋在JOIN語句中選擇「FROM」的表格

例如:

SELECT Customers.CustomerName, Orders.OrderID 
FROM Customers 
INNER JOIN Orders 
ON Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 
+2

代碼兩者都在從表......,你可以從命令說,加入客戶和查詢將返回相同的如果它是內連接,則返回結果。在左連接中,「從」表是左表。當我開始使用sql時,這讓我感到困惑,所以請注意,左連接和左外連接是相同的,唯一的區別是語法 – CSharper 2014-10-03 18:30:40

+0

是的。它可以是。在你的例子中,兩個表名可以交換,並且返回的行將是相同的。 (表名放置的重要性在於「外部」連接操作,即「左連接b」等同於「b右連接a」,但不同於「右連接b」。 – spencer7593 2014-10-03 18:41:03

+0

就像'FROM'表的定義:你實際選擇的「from」是連接操作的結果,而不是一個表或另一個表.SQL指定的是兩個表上的「連接」操作。 Customers JOIN Orders ON ...'「。查詢選擇」from「作爲連接操作的結果(相等比較中表達式的順序無關緊要,'a.col = b.col'爲相當於指定'b.col = a.col';等於比較運算符的一個屬性。)最佳做法是在查詢中限定*所有*列引用(如您的示例所示)。 – spencer7593 2014-10-03 19:18:41

回答

6

訂單在INNER JOIN並不重要。

但是,它在LEFT JOINRIGHT JOIN中確實很重要。在LEFT JOIN中,FROM子句中的表是主表;結果將包含從該表中選擇的每一行,而LEFT JOIN表中指定的行可能會丟失(結果中這些列將爲NULL)。 RIGHT JOIN類似,但相反:在FROM中指定的表中可能缺少行。

例如,如果您將查詢更改爲使用LEFT JOIN,您將看到沒有訂單的客戶。但是,如果您交換表格的順序並使用LEFT JOIN,則不會看到這些客戶。你會看到沒有客戶的訂單(儘管這樣的行可能不應該存在)。

1

對於inner join不要緊哪個表是from子句中,哪個是join子句。 對於outer join這當然確實重要,因爲允許outer join中的表具有「缺失」記錄。

4

from語句引用連接而不是表。表的連接將創建一個集合,您將從中選擇列。

+1

+1。查詢是選擇「from」是由join操作指定的結果集,而不是一個表或另一個表。 – spencer7593 2014-10-03 19:24:15

1

對於內部連接無關緊要:優化程序將計算出正確讀取表的順序,無論您選擇何種順序。

對於定向外連接,它確實很重要,因爲它們不是對稱的。您選擇要在第一個FROM表中將所有行保留在左外連接中的表;對於正確的外部連接,這是另一種方式。

對於完整的外部連接,它無關緊要,因爲完整的外部連接中的表格是相互對稱使用的。

在排序無關緊要的情況下,您可以選擇對您的SQL語句的讀者是「自然」的順序,無論這對您的模型意味着什麼。 SQL查詢很快就會變得很難閱讀,因此表格的正確排序對於查詢的讀者來說很重要。

0

那麼在你現在的例子中,from運算符可以應用在兩個表上。

SELECT Customers.CustomerName, Orders.OrderID 
FROM Customers,Orders 
WHERE Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 

- >會像你的代碼

逗號將加入兩個表。

從只意味着你正在檢索數據的表。

在你的例子中,你使用不同的語法加入了兩個表。 它也可能是:

SELECT Customers.CustomerName, Orders.OrderID 
FROM Orders 
INNER JOIN Customers 
ON Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 

所有書面會產生相同的結果

+6

好的示例萊斯,但我會強烈建議不要像你在第一個例子 – CSharper 2014-10-03 18:35:47

+0

中那樣寫查詢,你能解釋爲什麼嗎? – 2014-10-03 18:37:58

+1

語法潦草,調試難度更大,更不用說讀取了。如果你加入4張桌子,它會很快變得凌亂。看看這篇文章,我剛剛發現http://stackoverflow.com/questions/11251751/which-join-syntax-is-better – CSharper 2014-10-03 18:41:24