Join

關於連接的愚蠢初學者問題

  • October 27, 2021

我以前沒有 SQL 經驗,但我現在有一個任務,我應該使用不同類型的連接(在物理紙上,而不是在編輯器中)連接 2 個表。

表 1 稱為城市,有 2 列,城市和國家。表 2 稱為國家,有 2 列,國家和貨幣。

關鍵是 Cities.Countries > Country.Countries

因此,連接很容易理解,我的問題更多是關於輸出表中的順序以及顯示的列(觀看了大量教程,但我無法掌握這兩個細節)。

這是第一個命令:

SELECT Cities.*, Countries.* 
FROM Cities 
INNER JOIN Countries ON Cities.Countries = Countries.Countries

我想知道兩件事,

  1. 這部分是否SELECT Cities.*, Countries.*意味著輸出將顯示所有 4 列,因此 2 列具有相同的值,或者 KeyA 和 KeyB 是否會合併為一列?
  2. 如果我在 Cities 表的 Country 列(不同的城市)中有幾個“Italy”,但它們在表中不是一個接一個,輸出是否會對它們進行排序,以便所有意大利值相鄰或只是一起原始表的順序?

我確定非常基本的問題,但我無法使用任何類型的模擬器!:)

提前致謝!

  1. 是的。如評論中所述,您應該自己嘗試一下。
  2. 沒有一個。

學習這一點並將其深入腦海是非常重要的

數據庫不會按順序儲存事物。

如果您希望按特定順序輸出,則必須指定該ORDER BY子句。

在您給出一個ORDER BY子句之前,沒有“第一行”之類的東西。

為了澄清邁克爾的回答並添加其他資訊:

  1. 關鍵字是語法簡寫,*表示所有列。因此,當您說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子句是用過的。

引用自:https://dba.stackexchange.com/questions/301684