返回文章列表

PostgreSQL資料表設計與匯入技術解析

本文探討 PostgreSQL 資料表設計的最佳實務,並解析 CSV 檔案匯入的技巧與流程,包含欄位定義、主鍵設定、COPY 指令應用、資料篩選、部分匯入、新增預設值等,並輔以實際案例說明,有效提升資料處理效率。

資料函式庫 資料科學

PostgreSQL 提供強大的 COPY 指令,能有效率地匯入與匯出資料,特別適用於處理 CSV 檔案。本文將會詳細說明如何運用 COPY 指令,搭配適當的資料表設計,有效管理和分析人口普查資料。從欄位定義、主鍵設定開始,逐步講解如何使用 COPY 指令匯入 CSV 檔案,包含處理標頭、指定分隔符號等技巧。同時,文章也涵蓋了進階應用,例如使用 WHERE 子句篩選特定資料、部分欄位匯入,以及透過暫存表新增預設值等。此外,文章也示範如何運用 SQL 進行基本數學運算和統計分析,例如計算百分比變化、出生率等,讓讀者能更全面地理解 PostgreSQL 在資料處理方面的應用。

人口普查資料表設計與匯入流程解析

在進行人口普查資料的處理時,我們首先需要設計一個合適的資料表來儲存相關資料。以下將詳細介紹資料表的設計考量以及資料匯入的流程。

資料表欄位設計考量

us_counties_pop_est_2019 資料表中,每一行代表一個郡的人口估計資料以及年度變化成分(出生、死亡和遷徙)。欄位的設計充分考慮了資料的特性及未來可能的運算需求。

行政區劃程式碼

  • state_fipscounty_fips 欄位分別儲存州和郡的聯邦標準程式碼。由於這些程式碼可能包含前導零,因此使用文字型別(text)儲存,以避免數值型別(integer)儲存時丟失前導零。

地區分類別與名稱

  • region 欄位使用 smallint 型別,因為其值範圍在 1 到 4 之間,代表美國的四大地區。
  • state_namecounty_name 欄位以文字型別儲存州和郡的全名。

面積資料

  • area_landarea_water 欄位分別記錄郡的陸地面積和水域面積,使用 bigint 型別以處理可能超過整數型別最大值的大數值。

內部點經緯度

  • internal_point_latinternal_point_lon 欄位儲存郡中心附近點的經緯度座標,使用 numeric(10, 7) 型別以滿足小數點後七位的精確度需求。

人口估計與變化成分

一系列表格欄位用於儲存郡的人口估計資料及變化成分,如下表所示:

欄位名稱描述
pop_est_20182018 年 7 月 1 日的人口估計
pop_est_20192019 年 7 月 1 日的人口估計
births_20192018 年 7 月 1 日至 2019 年 6 月 30 日的出生人數
deaths_20192018 年 7 月 1 日至 2019 年 6 月 30 日的死亡人數
international_migr_20192018 年 7 月 1 日至 2019 年 6 月 30 日的國際淨遷徙人數
domestic_migr_20192018 年 7 月 1 日至 2019 年 6 月 30 日的國內淨遷徙人數
residual_2019用於調整估計資料的一致性數字

主鍵約束

資料表的設計最後指定了 state_fipscounty_fips 的組合作為主鍵,確保每行資料的唯一性。

使用 COPY 命令匯入資料

完成資料表設計後,接下來使用 COPY 命令將 CSV 檔案中的資料匯入資料表。匯入過程中需要注意檔案路徑的正確性。

COPY us_counties_pop_est_2019
FROM 'C:\YourDirectory\us_counties_pop_est_2019.csv'
WITH (FORMAT CSV, HEADER);

執行匯入命令後,若成功則會顯示匯入的行數。若出現錯誤,如 CSV 檔案的行欄位數與資料表定義不符,則會報錯並提供錯誤訊息幫助修正。

檢查匯入結果

匯入完成後,執行 SELECT * FROM us_counties_pop_est_2019; 以視覺化檢查匯入資料的正確性。檢查過程中應特別關注那些因資料型別選擇而需特別處理的欄位,以確保資料完整且正確。

相關檢查重點

  • 確認匯入的行數是否正確。
  • 核對各欄位的資料是否符合預期,特別是那些需要特殊處理的欄位,如經緯度資料。
  • 若有必要,執行特定的查詢來驗證某些關鍵欄位的資料正確性。

詳細解說

在上述檢查過程中,我們使用了簡單的 SELECT 陳述式來檢視整個資料表的內容。這種方法能夠直觀地檢查資料是否正確匯入。然而,對於大型的資料表,這種方法可能會帶來效能上的問題。因此,在實際操作中,我們可能需要根據具體情況選擇更有效率的檢查方法。

結語

透過上述步驟,我們完成了人口普查資料表的設計與資料匯入工作。在此過程中,我們充分考慮了資料的特性及未來可能的運算需求,選擇了合適的資料型別和主鍵約束,並透過 COPY 命令高效地匯入了 CSV 檔案中的資料。最後,透過檢查匯入結果確保了資料的正確性和完整性。這一系列的操作為後續的資料分析和處理奠定了堅實的基礎。

資料匯入與匯出技術深度解析

在資料函式倉管理中,資料的匯入與匯出是至關重要的操作。本文將探討使用 PostgreSQL 進行資料匯入的技巧,特別是使用 COPY 命令的各種應用場景。

使用 COPY 命令匯入資料

COPY 命令是 PostgreSQL 中用於資料匯入和匯出的強大工具。它允許使用者將資料從檔案匯入資料函式庫表,或將資料從資料函式庫表匯出到檔案。

匯入完整資料

首先,我們來看看如何使用 COPY 命令匯入完整的 CSV 檔案。假設我們有一個名為 us_counties_pop_est_2019 的表,並且我們有一個對應的 CSV 檔案。

COPY us_counties_pop_est_2019
FROM 'C:\YourDirectory\us_counties_pop_est_2019.csv'
WITH (FORMAT CSV, HEADER);

排序與限制資料

在進行資料分析時,我們經常需要對資料進行排序和限制。以下是一個例子,展示如何查詢最大的 area_land 值:

SELECT county_name, state_name, area_land
FROM us_counties_pop_est_2019
ORDER BY area_land DESC
LIMIT 3;

內容解密:

  1. SELECT county_name, state_name, area_land:選擇要顯示的欄位,分別是縣名、州名和土地面積。
  2. FROM us_counties_pop_est_2019:指定資料來源表。
  3. ORDER BY area_land DESC:按土地面積降序排序。
  4. LIMIT 3:限制輸出結果為前三行。

執行結果顯示,阿拉斯加州的 Yukon-Koyukuk 人口普查區面積最大。

處理經緯度資料

在處理地理資料時,經緯度是非常重要的資訊。以下是一個例子,展示如何查詢最大的 internal_point_lon 值:

SELECT county_name, state_name, internal_point_lat, internal_point_lon
FROM us_counties_pop_est_2019
ORDER BY internal_point_lon DESC
LIMIT 5;

內容解密:

  1. SELECT county_name, state_name, internal_point_lat, internal_point_lon:選擇要顯示的欄位,包括縣名、州名、緯度和經度。
  2. FROM us_counties_pop_est_2019:指定資料來源表。
  3. ORDER BY internal_point_lon DESC:按經度降序排序。
  4. LIMIT 5:限制輸出結果為前五行。

結果顯示,阿拉斯加州的 Aleutians West 人口普查區經度最大,這是因為阿留申群島跨越了 180 度經線。

匯入部分欄位

有時,CSV 檔案可能不包含所有需要的欄位。在這種情況下,我們可以指定要匯入的欄位。以下是一個例子:

CREATE TABLE supervisor_salaries (
    id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    town text,
    county text,
    supervisor text,
    start_date date,
    salary numeric(10,2),
    benefits numeric(10,2)
);

假設我們只有包含 townsupervisorsalary 的 CSV 檔案,我們可以使用以下命令匯入資料:

COPY supervisor_salaries (town, supervisor, salary)
FROM 'C:\YourDirectory\supervisor_salaries.csv'
WITH (FORMAT CSV, HEADER);

內容解密:

  1. COPY supervisor_salaries (town, supervisor, salary):指定要匯入的欄位。
  2. FROM 'C:\YourDirectory\supervisor_salaries.csv':指定 CSV 檔案路徑。
  3. WITH (FORMAT CSV, HEADER):指設定檔案格式為 CSV,並包含標頭。

匯入部分資料列

PostgreSQL 12 版本之後,我們可以在 COPY 命令中使用 WHERE 子句來過濾要匯入的資料列。以下是一個例子:

DELETE FROM supervisor_salaries;

COPY supervisor_salaries (town, supervisor, salary)
FROM 'C:\YourDirectory\supervisor_salaries.csv'
WITH (FORMAT CSV, HEADER)
WHERE town = 'New Brillig';

內容解密:

  1. DELETE FROM supervisor_salaries;:清除表中的現有資料。
  2. COPY supervisor_salaries (town, supervisor, salary):指定要匯入的欄位。
  3. FROM 'C:\YourDirectory\supervisor_salaries.csv':指定 CSV 檔案路徑。
  4. WITH (FORMAT CSV, HEADER):指設定檔案格式為 CSV,並包含標頭。
  5. WHERE town = 'New Brillig':過濾條件,只匯入 town 為 ‘New Brillig’ 的資料列。

使用 COPY 指令匯入與匯出資料

在 PostgreSQL 中,COPY 指令提供了一個強大的方法來匯入和匯出資料。本文將探討如何使用 COPY 來處理 CSV 檔案,並介紹一些進階技巧,例如在匯入過程中新增預設值和使用暫存表。

從 CSV 檔案匯入資料

要從 CSV 檔案匯入資料到 PostgreSQL 表格,可以使用 COPY 指令。以下是一個基本的例子:

COPY supervisor_salaries (town, supervisor, salary)
FROM 'C:\YourDirectory\supervisor_salaries.csv'
WITH (FORMAT CSV, HEADER);

內容解密:

  1. COPY 指令用於將資料從檔案複製到表格。
  2. supervisor_salaries 是目標表格名稱,後面括號內的欄位名稱指定了要匯入的欄位。
  3. FROM 子句指定了來源檔案的路徑。
  4. WITH (FORMAT CSV, HEADER) 表示來源檔案是 CSV 格式,並且第一行包含欄位名稱。

使用 WHERE 子句篩選匯入的資料列

有時,我們只需要匯入滿足特定條件的資料列。這時,可以在 COPY 指令中使用 WHERE 子句:

COPY supervisor_salaries (town, supervisor, salary)
FROM 'C:\YourDirectory\supervisor_salaries.csv'
WITH (FORMAT CSV, HEADER)
WHERE town = 'New Brillig';

內容解密:

  1. WHERE 子句用於篩選要匯入的資料列。
  2. 在這個例子中,只有當 town 欄位的值為 'New Brillig' 的資料列才會被匯入。

在匯入過程中新增欄位值

假設 CSV 檔案中缺少某些欄位的值,但我們知道應該新增什麼值。這時,可以使用暫存表來處理:

CREATE TEMPORARY TABLE supervisor_salaries_temp
(LIKE supervisor_salaries INCLUDING ALL);

COPY supervisor_salaries_temp (town, supervisor, salary)
FROM 'C:\YourDirectory\supervisor_salaries.csv'
WITH (FORMAT CSV, HEADER);

INSERT INTO supervisor_salaries (town, county, supervisor, salary)
SELECT town, 'Mills', supervisor, salary
FROM supervisor_salaries_temp;

DROP TABLE supervisor_salaries_temp;

內容解密:

  1. 首先,建立一個暫存表 supervisor_salaries_temp,其結構與 supervisor_salaries 表格相同。
  2. 將 CSV 檔案的內容匯入到暫存表中。
  3. 使用 INSERT INTO ... SELECT 陳述式,將暫存表中的資料插入到 supervisor_salaries 表格中,並在 county 欄位中新增值 'Mills'
  4. 最後,刪除暫存表。

使用 COPY 匯出資料

要將資料從 PostgreSQL 表格匯出到檔案,可以使用 COPY 指令的 TO 子句。以下是一個例子:

COPY us_counties_pop_est_2019
TO 'C:\YourDirectory\us_counties_export.txt'
WITH (FORMAT CSV, HEADER, DELIMITER '|');

內容解密:

  1. us_counties_pop_est_2019 表格的所有資料匯出到指定的檔案中。
  2. 使用 | 符號作為欄位分隔符號。

匯出特定的欄位

如果只需要匯出特定的欄位,可以在 COPY 指令中指定欄位名稱:

COPY us_counties_pop_est_2019
(county_name, internal_point_lat, internal_point_lon)
TO 'C:\YourDirectory\us_counties_latlon_export.txt'
WITH (FORMAT CSV, HEADER, DELIMITER '|');

內容解密:

  1. 只匯出 county_nameinternal_point_latinternal_point_lon 三個欄位。
  2. 使用 | 符號作為欄位分隔符號。

匯出查詢結果

也可以將查詢結果匯出到檔案:

COPY (
    SELECT county_name, state_name
    FROM us_counties_pop_est_2019
    WHERE county_name ILIKE '%mill%'
)
TO 'C:\YourDirectory\counties_with_mill.txt'
WITH (FORMAT CSV, HEADER);

內容解密:

  1. 使用子查詢來篩選出縣名中包含 'mill' 的資料列。
  2. 將查詢結果匯出到指定的檔案中,使用逗號作為預設的分隔符號。

基本數學運算與統計分析在SQL中的應用

在處理資料時,經常需要進行各種數學運算和統計分析。SQL提供了豐富的數學運算元和函式,能夠滿足大多數的計算需求。本章將介紹基本的數學運算元、數學函式,以及如何使用SQL進行統計分析。

瞭解數學運算元和函式

基本的數學運算包括加、減、乘、除等。表6-1列出了常用的數學運算元。

表6-1:基本數學運算元

運算元描述
+加法
-減法
*乘法
/除法(僅傳回商,不包含餘數)
%模數(傳回餘數)
^指數運算
|/平方根
||/立方根
!階乘

這些運算元可以用於簡單的SQL查詢中,對數字進行各種運算。

SELECT 5 + 3;  -- 加法
SELECT 10 - 4;  -- 減法
SELECT 7 * 2;   -- 乘法
SELECT 10 / 2;  -- 除法
SELECT 10 % 3;  -- 模數
SELECT 2 ^ 3;   -- 指數運算
SELECT |/ 16;   -- 平方根
SELECT ||/ 27;  -- 立方根
SELECT 5 !;     -- 階乘

內容解密:

  1. SELECT 5 + 3;:進行加法運算,傳回結果8。
  2. SELECT 10 - 4;:進行減法運算,傳回結果6。
  3. SELECT 7 * 2;:進行乘法運算,傳回結果14。
  4. SELECT 10 / 2;:進行除法運算,傳回結果5。
  5. SELECT 10 % 3;:計算10除以3的餘數,傳回結果1。
  6. SELECT 2 ^ 3;:進行指數運算,傳回結果8。
  7. SELECT |/ 16;:計算16的平方根,傳回結果4。
  8. SELECT ||/ 27;:計算27的立方根,傳回結果3。
  9. SELECT 5 !;:計算5的階乘,傳回結果120。

資料型別與數學運算

在進行數學運算時,瞭解結果的資料型別非常重要。資料型別的選擇取決於運算元和輸入數字的資料型別。對於加、減、乘、除等基本運算,結果的資料型別遵循一定的規則。

統計分析與SQL

除了基本的數學運算外,SQL還支援各種統計分析功能。可以使用聚合函式如AVG()SUM()MAX()MIN()等來計算平均值、總和、最大值和最小值等統計指標。

SELECT AVG(column_name) FROM table_name;  -- 計算平均值
SELECT SUM(column_name) FROM table_name;  -- 計算總和
SELECT MAX(column_name) FROM table_name;  -- 尋找最大值
SELECT MIN(column_name) FROM table_name;  -- 尋找最小值

內容解密:

  1. SELECT AVG(column_name) FROM table_name;:計算指定欄位的平均值。
  2. SELECT SUM(column_name) FROM table_name;:計算指定欄位的總和。
  3. SELECT MAX(column_name) FROM table_name;:找出指定欄位的最大值。
  4. SELECT MIN(column_name) FROM table_name;:找出指定欄位的最小值。

百分比與百分比變化

在資料分析中,計算百分比和百分比變化是非常常見的需求。可以使用基本的數學運算來實作這些計算。

SELECT (current_value - previous_value) / previous_value * 100 AS percentage_change
FROM table_name;

內容解密:

  1. (current_value - previous_value):計算當前值與前一個值的差異。
  2. / previous_value:將差異除以前一個值,得到變化比例。
  3. * 100:將比例轉換為百分比。

練習與應用

為了更好地掌握SQL中的數學運算和統計分析,請嘗試以下練習:

  1. 使用第5章匯入的人口普查資料,計算每個縣的出生率。
  2. 使用聚合函式計算某個欄位的平均值、總和、最大值和最小值。
  3. 練習使用不同的數學運算元進行各種計算。

透過這些練習,您將能夠更好地理解如何在SQL中應用數學運算和統計分析,從而更有效地處理和分析資料。