關於連接的愚蠢初學者問題
我以前沒有 SQL 經驗,但我現在有一個任務,我應該使用不同類型的連接(在物理紙上,而不是在編輯器中)連接 2 個表。
表 1 稱為城市,有 2 列,城市和國家。表 2 稱為國家,有 2 列,國家和貨幣。
關鍵是 Cities.Countries > Country.Countries
因此,連接很容易理解,我的問題更多是關於輸出表中的順序以及顯示的列(觀看了大量教程,但我無法掌握這兩個細節)。
這是第一個命令:
SELECT Cities.*, Countries.* FROM Cities INNER JOIN Countries ON Cities.Countries = Countries.Countries
我想知道兩件事,
- 這部分是否
SELECT Cities.*, Countries.*
意味著輸出將顯示所有 4 列,因此 2 列具有相同的值,或者 KeyA 和 KeyB 是否會合併為一列?- 如果我在 Cities 表的 Country 列(不同的城市)中有幾個“Italy”,但它們在表中不是一個接一個,輸出是否會對它們進行排序,以便所有意大利值相鄰或只是一起原始表的順序?
我確定非常基本的問題,但我無法使用任何類型的模擬器!:)
提前致謝!
- 是的。如評論中所述,您應該自己嘗試一下。
- 沒有一個。
學習這一點並將其深入腦海是非常重要的
數據庫不會按順序儲存事物。
如果您希望按特定順序輸出,則必須指定該
ORDER BY
子句。在您給出一個
ORDER BY
子句之前,沒有“第一行”之類的東西。
為了澄清邁克爾的回答並添加其他資訊:
- 關鍵字是語法簡寫,
*
表示所有列。因此,當您說SELECT Cities.*, Countries.*
您正在指示數據庫返回Cities 表中的所有列,然後是Country 表中的所有列時。也就是說,將返回所有 4 列,包括Countries
兩次作為結果集一部分的列。
SELECT
此外,您可以通過字面書寫將您的速記語句轉換為更短的語句SELECT *
。儘管最佳做法是僅顯式列出您想要返回的列,而不是使用的快捷方式*
(臨時一次性查詢或非常罕見的情況除外)。如果不涉及太多細節,如果您使用關鍵字作弊,它可能會影響性能和/或損害程式碼的可維護性。*
因此,您實際上可以像這樣專門列出列
SELECT Cities.Cities, Cities.Countries, Countries.Currency
。請注意,通過顯式列出列名,我不必告訴數據庫冗餘地返回該Countries
列兩次。此外,在這種情況下,您從哪個表請求
Countries
列並不重要,因為這是您在兩個表之間使用的關鍵欄位INNER JOIN
(任一列中的值始終相同Countries
)。在我的範例中,我選擇從Cities
表格中請求它,但如果您Countries
像這樣從表格中請求它,它與輸出沒有什麼不同SELECT Cities.Cities, Countries.Countries, Countries.Currency
。 2. 除非您專門使用ORDER BY
子句,否則無法保證查詢結果的順序。因此,第一次執行查詢時,您可能會得到一個排序,而第二次執行時,您可能會得到不同的結果排序,除非您添加ORDER BY
子句。話雖如此,為了澄清邁克爾所說的一點,一張桌子本身並不知道以特定的順序儲存東西。最重要的是,來自查詢的結果集不能保證返回結果的順序(如我上一段所述),但數據庫可以 按特定順序儲存事物。
更具體地說,當創建索引時,它會按照索引鍵中的欄位定義的順序在邏輯上持久化數據。通常這是通過諸如 B-Tree 之類的資料結構來完成的。此處的關鍵區別在於,數據在邏輯上以特定順序儲存,但這並不能保證查詢以任何特定順序返回數據。我的上一段仍然成立,即使定義了索引(例如在表上),並且數據已按邏輯排序,也不能保證在查詢時數據將以任何特定順序返回 - 除非
ORDER BY
子句是用過的。