![]() |
|---|
| 使用數據:關聯式資料庫 - 由 @nitya 繪製的速記筆記 |
你可能曾經使用過電子表格來存儲信息。電子表格由一組行和列組成,其中行包含信息(或數據),列描述信息(有時稱為元數據)。關聯式資料庫正是基於表格中的行和列這一核心原則構建的,允許你在多個表格中分散存儲信息。這使得你可以處理更複雜的數據,避免重複,並在探索數據時擁有更大的靈活性。讓我們一起來探索關聯式資料庫的概念。
關聯式資料庫的核心是表格。就像電子表格一樣,表格是由列和行組成的集合。行包含我們希望處理的數據或信息,例如城市名稱或降雨量。列則描述它們存儲的數據。
讓我們開始探索,建立一個表格來存儲有關城市的信息。我們可以從城市名稱和國家開始。你可以將其存儲在如下表格中:
| 城市 | 國家 |
|---|---|
| 東京 | 日本 |
| 亞特蘭大 | 美國 |
| 奧克蘭 | 新西蘭 |
注意,城市、國家和人口這些列名描述了存儲的數據,每一行都包含一個城市的信息。
上述表格可能看起來對你來說相當熟悉。讓我們開始向我們的新興資料庫添加一些額外的數據——年度降雨量(以毫米為單位)。我們將重點放在2018年、2019年和2020年。如果我們要為東京添加數據,可能看起來像這樣:
| 城市 | 國家 | 年份 | 降雨量 |
|---|---|---|---|
| 東京 | 日本 | 2020 | 1690 |
| 東京 | 日本 | 2019 | 1874 |
| 東京 | 日本 | 2018 | 1445 |
你注意到我們的表格有什麼問題嗎?你可能注意到我們重複了城市的名稱和國家多次。這可能會佔用相當多的存儲空間,而且大部分情況下是不必要的。畢竟,東京只有一個名稱是我們感興趣的。
好吧,讓我們嘗試另一種方法。讓我們為每一年添加新的列:
| 城市 | 國家 | 2018 | 2019 | 2020 |
|---|---|---|---|---|
| 東京 | 日本 | 1445 | 1874 | 1690 |
| 亞特蘭大 | 美國 | 1779 | 1111 | 1683 |
| 奧克蘭 | 新西蘭 | 1386 | 942 | 1176 |
雖然這避免了行的重複,但它增加了其他一些挑戰。我們每次有新的一年時都需要修改表格的結構。此外,隨著數據的增長,將年份作為列會使得檢索和計算值變得更加困難。
這就是為什麼我們需要多個表格和關聯。通過分解數據,我們可以避免重複,並在處理數據時擁有更大的靈活性。
讓我們回到我們的數據,並確定如何分解它。我們知道我們想要存儲城市的名稱和國家,因此這可能最適合存儲在一個表格中。
| 城市 | 國家 |
|---|---|
| 東京 | 日本 |
| 亞特蘭大 | 美國 |
| 奧克蘭 | 新西蘭 |
但在創建下一個表格之前,我們需要弄清楚如何引用每個城市。我們需要某種形式的標識符、ID或(在技術資料庫術語中)主鍵。主鍵是一個用於識別表格中特定行的值。雖然這可以基於值本身(例如,我們可以使用城市的名稱),但它幾乎應該始終是一個數字或其他標識符。我們不希望ID發生變化,因為這會破壞關聯。你會發現,在大多數情況下,主鍵或ID通常是自動生成的數字。
✅ 主鍵通常縮寫為PK
| city_id | 城市 | 國家 |
|---|---|---|
| 1 | 東京 | 日本 |
| 2 | 亞特蘭大 | 美國 |
| 3 | 奧克蘭 | 新西蘭 |
✅ 在本課程中,你會注意到我們交替使用“id”和“主鍵”這些術語。這些概念也適用於DataFrame,你稍後會進一步探索。雖然DataFrame不使用“主鍵”這一術語,但你會注意到它們的行為非常相似。
創建了城市表格後,讓我們存儲降雨量。與其重複城市的完整信息,我們可以使用ID。我們還應確保新創建的表格有一個id列,因為所有表格都應該有一個id或主鍵。
| rainfall_id | city_id | 年份 | 降雨量 |
|---|---|---|---|
| 1 | 1 | 2018 | 1445 |
| 2 | 1 | 2019 | 1874 |
| 3 | 1 | 2020 | 1690 |
| 4 | 2 | 2018 | 1779 |
| 5 | 2 | 2019 | 1111 |
| 6 | 2 | 2020 | 1683 |
| 7 | 3 | 2018 | 1386 |
| 8 | 3 | 2019 | 942 |
| 9 | 3 | 2020 | 1176 |
注意新創建的降雨量表格中的city_id列。這一列包含引用城市表格中ID的值。在技術關聯數據術語中,這被稱為外鍵;它是另一個表格中的主鍵。你可以簡單地將其視為一個引用或指針。city_id 1引用東京。
Note
外鍵通常縮寫為FK
將數據分成兩個表格後,你可能會想知道如何檢索它。如果我們使用像MySQL、SQL Server或Oracle這樣的關聯式資料庫,我們可以使用一種名為結構化查詢語言(SQL)的語言。SQL(有時讀作sequel)是一種標準語言,用於在關聯式資料庫中檢索和修改數據。
要檢索數據,你可以使用命令SELECT。其核心是,你選擇你想要查看的列,從它們所在的表格中。如果你只想顯示城市的名稱,你可以使用以下命令:
SELECT city
FROM cities;
-- Output:
-- Tokyo
-- Atlanta
-- AucklandSELECT是你列出列名的地方,FROM是你列出表格名的地方。
Note
SQL語法不區分大小寫,這意味著select和SELECT是相同的。然而,根據你使用的資料庫類型,列名和表格名可能區分大小寫。因此,最佳實踐是始終將編程中的所有內容視為區分大小寫。在編寫SQL查詢時,常見的約定是將關鍵字全部用大寫字母表示。
上述查詢將顯示所有城市。假設我們只想顯示新西蘭的城市。我們需要某種形式的篩選。SQL的關鍵字是WHERE,即“某些條件為真”。
SELECT city
FROM cities
WHERE country = 'New Zealand';
-- Output:
-- Auckland到目前為止,我們已經從單個表格中檢索數據。現在我們希望將城市和降雨量中的數據結合起來。這可以通過連接它們來完成。你將有效地在兩個表格之間創建一個接縫,並將每個表格中的列值匹配起來。
在我們的例子中,我們將匹配降雨量中的city_id列和城市中的city_id列。這將把降雨量值與其相應的城市匹配起來。我們將執行的連接類型稱為內部連接,這意味著如果任何行與另一個表格中的行不匹配,它們將不會顯示。在我們的例子中,每個城市都有降雨量,因此所有內容都會顯示。
讓我們檢索所有城市2019年的降雨量。
我們將分步進行。第一步是通過指示接縫的列來連接數據——如前所述的city_id。
SELECT cities.city
rainfall.amount
FROM cities
INNER JOIN rainfall ON cities.city_id = rainfall.city_id我們已經突出顯示了我們想要的兩列,以及我們希望通過city_id連接表格的事實。現在我們可以添加WHERE語句來篩選出只有2019年的數據。
SELECT cities.city
rainfall.amount
FROM cities
INNER JOIN rainfall ON cities.city_id = rainfall.city_id
WHERE rainfall.year = 2019
-- Output
-- city | amount
-- -------- | ------
-- Tokyo | 1874
-- Atlanta | 1111
-- Auckland | 942關聯式資料庫的核心是將信息分成多個表格,然後將其重新組合以進行顯示和分析。這提供了高度的靈活性來進行計算或其他數據操作。你已經了解了關聯式資料庫的核心概念,以及如何在兩個表格之間進行連接。
網絡上有許多關聯式資料庫可供使用。你可以通過使用上述學到的技能來探索這些數據。
Microsoft Learn 上有多種資源可供你繼續探索SQL和關聯式資料庫的概念
- 描述關聯數據的概念
- 開始使用Transact-SQL進行查詢(Transact-SQL是SQL的一個版本)
- Microsoft Learn上的SQL內容
免責聲明:
本文件使用 AI 翻譯服務 Co-op Translator 進行翻譯。儘管我們致力於提供準確的翻譯,請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
