2014-06-06 23 views
-1

我是SQL和PHP編程的新手,所以我需要一些幫助才能充分理解來自別人代碼的SQL SELECT語句。瞭解加入和組的SQL語句

$sql = "SELECT a.*, b.name as city, c.name as state, c.code as state_code 
FROM hotel a 
JOIN city b on a.IDCity = b.IDCity 
JOIN state c on b.IDState = c.IDState"; 

這是我的理解(或者我的猜測):

  • 它選擇了從酒店表。
  • 它從城市表中選擇名稱?
  • 它從狀態表
  • 它從狀態表
  • 選擇代碼它加入了城市的名字,一切從酒店表中創建IDCITY選擇的名字?
  • 它加入州名與城市名稱來創建IDState字段。

這是我完全不明白:

  • 這是怎麼select語句抓取來自不同表中的字段,但它只是指出,「從酒店是」
  • 什麼是一個。灣C。在這個代碼中?我猜他們的團體,但爲什麼他們的兩個C的名稱爲國家和代碼作爲國家代碼?
  • 如果a。灣C。是團體,我猜他們也指出要從哪個表中獲取信息?這甚至如何工作?
+1

爲了理解它,你必須知道'JOIN'是如何工作的。我不想詳細說明他們是如何工作的,但是一個真正的好地方是閱讀這篇文章:http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ – Bjoern

+0

謝謝你對這篇文章,我會閱讀它以更多地理解聯合聲明。欣賞它! – user3436399

回答

4

。它選擇了從酒店表:

不完全是這樣,它是從酒店表中選擇每(不一定每

。它從城市表中選擇名字?

正確

。它從狀態表

正確

選擇的名稱。它從狀態表

正確

選擇的代碼。它加入城市的名稱與酒店 表中的所有內容創建IDCITY? 。狀態與 城市的名稱及其連接的名稱創建IDState場...

Hotels有一個名爲IdCity列識別城市,酒店。因此,您正在使用該表中的該列與City表結合,該表還具有IdCity列(可能是該表的關鍵)。該聯接是INNER JOIN,因此將返回表Hotels中具有與City表中的現有IdCity對應的IdCity的行。然後,該結果以與State表格相同的方式結合在一起(在這種情況下,使用存在於CityState表格中的公共列IdState)。

。怎麼是這樣的select語句抓取來自不同表 領域,但它只是指出,「從酒店一」

這不是,那是什麼JOIN s的做,與使用普通的表列來從這些表中獲取數據。

。什麼是a。灣C。在這個代碼中?我猜他們的團體,但 那麼爲什麼他們的兩個c的名稱爲國家和代碼作爲國家代碼?

這些是表別名。你使用它們是爲了可讀性和清晰度。您所說的Hotels表格將被稱爲aCity表格將被稱爲bState表格將被稱爲c。那麼你使用這些作爲前綴時,使用您的列,所以b.name意味着the column name from the City tableas something正在重命名您的SELECT中的列,因此​​3210表示您的結果集將調用該列表state

。如果a。灣C。是羣體,我猜他們也指示哪個 表抓取信息?這甚至如何工作?

它們不是,正如我在前面的要點中所說的那樣,它們是表別名。

2

這是怎麼select語句抓取來自不同表中的字段,但它只是指出,「從酒店一」

從酒店,意味着基本信息從酒店表,拉其現在別名爲「a」,所以名爲hotel的酒店現在也被稱爲「a」

什麼是a。灣C。在這個代碼中?我猜他們的團體,但爲什麼他們的兩個C的名稱爲國家和代碼作爲國家代碼?

基表酒店和它的數據正與兩個表,表的城市,被稱爲這是現在命名爲c

JOIN city b on a.IDCity = b.IDCity 
JOIN state c on b.IDState = c.IDState"; 

c.name B和表狀態增強實際上是表「C」列名稱。表狀態別名爲「c」

如果a。灣C。是團體,我猜他們也指出要從哪個表中獲取信息?這甚至如何工作?

表中有行,這可以說有1排5場(又名列),你可以,如果你知道一些數據間接在另一個表中添加第6列。如果我們知道你有車,而且我們知道,所有的汽車有一個方向盤,我們可以間接地說,你有一個車輪

+0

謝謝你的解釋。這真的幫助我更好地理解這一點。 – user3436399

1
FROM hotel a 

抓住從hotel表中的所有行和使用a速記指這些行。

JOIN city b on a.IDCity = b.IDCity 

返回a和行的所有可能組合的city表,並使用b速記對於最初在city表中的列。然後過濾結果並保留條件爲on a.IDCity = b.IDCity爲真的行。換句話說,請保留aIDCity列與bIDCity列相匹配的行。

JOIN state c on b.IDState = c.IDState 

對於從加入ab結果的每一行,從state與匹配IDState返回所有行,並調用這些行c

作爲練習,請用on 1=1替換on a.IDCity = b.IDCity並解釋結果。

+0

感謝您的解釋。我基本上改變他的代碼來抓取城市的位置。但是這幫了我很多。欣賞它。 – user3436399

1

查詢是從Hotels中選擇每一列。 a是一個別名,用作代碼中代表Hotels的指針。這完全是可選的。如果沒有使用別名,那麼加入將會是ON HOTELS.IDCITY=CITY.IDCITY等。

Hotels表中的記錄將有一個名爲IDCity的字段。該ID與名爲IDCityCity表中的對應ID匹配。 bCity表也是一個別名。

「JOIN」的使用默認爲INNER JOIN(在SQL Server中),這意味着只返回兩個表匹配的地方。如果酒店記錄沒有IDCity(它的NULL),您將不會在結果集中看到它。

從那裏你「加入」到Statec(再次,c只是一個別名)。加入在字段IDState上完成,回到每個城市的IDState

同樣,由於它是「JOIN」,它只會返回兩個表都有匹配的地方......所以在此查詢中,所有3個表必須具有匹配的參考ID值。

所以這個查詢不是「創建」ID的,它們是從一個表到另一個表的引用指針。

該ID被稱爲主鍵(IDCityCity上的主鍵)並且外鍵(IDCityHotels中是外鍵)。

例如:酒店餐桌中的「希爾頓酒店」有IDCity爲7,在CityIDCity7中有相應的名稱「拉斯維加斯」。 7 /拉斯維加斯的City表格的IDState爲12,在State表格中,IDState 12的名稱爲「Nevada」。

這可讓您爲每家酒店指定一個城市/州的價值,而不用爲「200家酒店」編寫「LAS VEGAS」和「NEVADA」,您只需輸入7的IDCity。城市名稱和州名稱通過對基礎表的引用。

不反覆寫入相同的值對SQL性能和數據庫規範化是不可或缺的。

1

在此代碼中找到的a,b和c名稱是「別名」。別名是引用SQL語句的FROM段中的表的一種方式。在你的情況下,與部分看起來是這樣的:

FROM hotel a 
JOIN city b on a.IDCity = b.IDCity 
JOIN state c on b.IDState = c.IDState 

因此,是分配給酒店的「別名」,B被分配到城市,和C被分配到狀態。 JOINS顯示哪些字段已連接,在這種情況下,IDCity字段連接酒店和城市,字段IDState連接城市和州。

由於該SQL語句被解析爲一個單元,SELECT部分​​知道每個別名引用哪個表與FROM語句。因此,在您的SELECT語句中:

SELECT a.*, b.name as city, c.name as state, c.code as state_code 

因爲a是指酒店,它是從酒店中選擇一切。由於b指的是城市,因此選擇city.name,但該字段在結果集中將被稱爲「城市」。由於c引用了表狀態,所以SELECT也拉動了state.name和state.code,但是這些字段在結果集中將被稱爲「state」和「state_code」。

要理解的主要問題是,a,b和c基本上是綽號,寫這個查詢的人給了這個表,以使組織和多餘的輸入更容易。別名在更復雜的查詢中用於其他原因,但此概述將用於理解此查詢如何執行的目的。