Polars DataFrame 提供了豐富的資料轉換和聚合功能,讓資料分析工作更加便捷高效。在資料科學的領域中,資料的型態和結構往往需要根據分析的需求進行調整。Polars 提供了許多內建函式,可以輕鬆地對資料進行轉換、排序、分組和聚合,從而提取有價值的資訊。
Polars 的 with_columns 方法允許新增或修改 DataFrame 中的欄位。這個方法接受一個或多個表示式作為引數,每個表示式定義一個新的欄位或修改現有欄位。
以下程式碼示範如何使用 with_columns 方法新增一個名為 Engine_Total 的欄位,該欄位的值是 Engine_Min 和 Engine_Max 兩個欄位之和:
df.with_columns(
(pl.col('Engine_Min') + pl.col('Engine_Max')).alias('Engine_Total')
)
除了新增欄位,with_columns 方法還可以修改現有欄位。例如,以下程式碼將 Year 欄位的值都加上 1:
df.with_columns(
(pl.col('Year') + 1).alias('Year')
)
Polars 也提供了類別似 SQL 的 GROUP BY 功能,可以根據指定的欄位對資料進行分組,然後對每組資料應用聚合函式。
以下程式碼示範如何根據 Company 欄位對資料進行分組,並計算每家公司的平均年份:
df.groupby('Company').agg(
pl.col('Year').mean()
)
除了 mean 函式外,Polars 還提供了許多其他的聚合函式,例如 sum、min、max、count 等。
以下程式碼示範如何計算每家公司生產的 AWD 車款數量:
df.groupby('Company').agg(
pl.col('AWD').sum()
)
在實際應用中,經常需要根據多個欄位進行分組。以下程式碼示範如何根據 Company 和 AWD 兩個欄位進行分組,並計算每組的平均年份:
df.groupby(['Company','AWD']).agg(
pl.col('Year').mean()
)
Polars 提供了 sort 方法,可以根據指定的欄位對 DataFrame 進行排序。以下程式碼示範如何根據 Year 欄位進行排序:
df.sort('Year')
預設情況下,sort 方法會按照升序排序。如果需要按照降序排序,可以設定 descending=True:
df.sort('Year', descending=True)
也可以根據多個欄位進行排序。以下程式碼示範如何先根據 Year 欄位升序排序,然後再根據 Engine_Max 欄位降序排序:
df.sort(['Year', 'Engine_Max'], descending=[False, True])
Polars 的 melt 方法可以將寬表格轉換為長表格。在資料分析中,長表格通常更易於處理和分析。
以下程式碼示範如何使用 melt 方法將 DataFrame 轉換為長表格:
df.melt(
id_vars=['Model', 'Company'],
value_vars=['Engine_Min', 'Engine_Max']
)
Polars 的 pivot 方法可以將長表格轉換為寬表格。
以下程式碼示範如何使用 pivot 方法將 DataFrame 轉換為寬表格:
df.pivot(
values='variable',
index='Model',
columns='Company',
aggregate_function='first'
)
Polars 的 join 方法可以將兩個 DataFrame 根據指定的欄位連線起來。
以下程式碼示範如何使用 join 方法將兩個 DataFrame 連線起來:
df1.join(df2, on='key', how='left')
Polars 提供了多種 how 引數,例如 left、right、inner 和 outer,可以根據不同的需求選擇不同的連線方式。
Polars 的資料轉換和聚合功能非常強大,可以滿足各種資料分析的需求。透過熟練運用這些技巧,可以更有效率地處理和分析資料,從而提取有價值的資訊。
玄貓解密:DuckDB資料匯入技巧,從Excel到MySQL無痛轉移
在資料分析的世界裡,快速與有效地匯入資料是至關重要的一環。身為資料科學家,玄貓深知其重要性。這篇文章將帶領大家深入瞭解如何使用 DuckDB 從各種資料來源匯入資料,包括 Excel 和 MySQL。透過實戰範例和精闢解析,讓你能輕鬆駕馭 DuckDB,提升資料處理效率。
玄貓教你將Excel表格變身DuckDB資料
DuckDB 雖然沒有直接支援 Excel 檔案,但別擔心,玄貓提供你兩種解決方案:
-
GDAL大法: DuckDB 支援使用 GDAL(Geospatial Data Abstraction Library)匯入各種檔案格式,其中也包含 Excel。
COPY airlines TO 'airlines.xlsx' WITH (FORMAT GDAL, DRIVER 'xlsx');這段程式碼會將
airlines資料表儲存為airlines.xlsx檔案。FORMAT GDAL選項讓你能夠匯出資料到 GDAL 支援的檔案格式。玄貓提醒: 如果目標檔案已存在,DuckDB 會丟擲錯誤。此外,
xlsx寫入器驅動程式不支援日期和時間戳記,如果你的資料表包含這些型別的欄位,請在建立xlsx檔案之前將它們轉換為VARCHAR型別。 -
CSV 中轉: 先將 Excel 檔案轉換為 CSV 格式,再使用 DuckDB 匯入 CSV 檔案。
玄貓帶你打通MySQL與DuckDB的任督二脈
許多時候,你的資料可能儲存在 MySQL 等資料函式庫伺服器中。將 MySQL 中的資料匯入 DuckDB,可以讓你更方便地進行分析。玄貓提供兩種方法:
方法一:手動搬運
-
建立連線: 分別建立 DuckDB 和 MySQL 的連線。
-
撈取資料: 從 MySQL 伺服器檢索資料。
-
開發藍圖: 在 DuckDB 資料函式庫中建立一個與 MySQL 資料表具有相同結構的資料表。
-
逐行搬運: 迭代從 MySQL 取得的每一列資料,並將其插入到 DuckDB 資料表中。
-
關閉通道: 關閉與 MySQL 和 DuckDB 的連線。
以下程式碼示範了這些步驟:
import mysql.connector import duckdb # MySQL 連線資訊 mysql_host = 'localhost' mysql_user = 'user1' mysql_password = 'password' mysql_database = 'My_DB' mysql_table = 'airlines' # 建立 DuckDB 連線 duckdb_conn = duckdb.connect() # 連線到 MySQL mysql_conn = mysql.connector.connect( host = mysql_host, user = mysql_user, password = mysql_password, database = mysql_database ) # 建立 MySQL 的遊標 mysql_cursor = mysql_conn.cursor() # 從 MySQL 查詢資料 mysql_query = f'SELECT * FROM {mysql_table}' mysql_cursor.execute(mysql_query) # 建立一個與 MySQL 具有相同結構的 DuckDB 資料表 duckdb_create_table_query = \ f'CREATE TABLE airlines (IATA_CODE VARCHAR(2), AIRLINES VARCHAR)' duckdb_conn.execute(duckdb_create_table_query) # 從 MySQL 結果取得欄位名稱 mysql_columns = [column[0] for column in mysql_cursor.description] # 從 MySQL 提取資料並插入到 DuckDB 資料表中 duckdb_insert_query = \ f'INSERT INTO airlines VALUES ({", ".join(["?" for _ in mysql_columns])})' for row in mysql_cursor.fetchall(): duckdb_conn.execute(duckdb_insert_query, row) # 查詢 DuckDB 中的資料 display(duckdb_conn.execute('SELECT * FROM airlines').df()) # 關閉 MySQL 和 DuckDB 連線 mysql_cursor.close() mysql_conn.close() duckdb_conn.close()內容解密:
mysql.connector:用於建立與 MySQL 資料函式庫的連線。duckdb.connect():建立與 DuckDB 資料函式庫的連線。mysql_cursor = mysql_conn.cursor():建立一個遊標物件,用於執行 MySQL 查詢。mysql_query = f'SELECT * FROM {mysql_table}':定義要執行的 MySQL 查詢,從指定的資料表中選取所有資料。duckdb_create_table_query:建立一個與 MySQL 資料表結構相同的 DuckDB 資料表。mysql_columns = [column[0] for column in mysql_cursor.description]:從 MySQL 查詢結果中取得欄位名稱。duckdb_insert_query:定義將資料插入 DuckDB 資料表的查詢。duckdb_conn.execute(duckdb_insert_query, row):執行插入查詢,將從 MySQL 檢索的每一列資料插入 DuckDB 資料表。display(duckdb_conn.execute('SELECT * FROM airlines').df()):查詢 DuckDB 資料表中的資料並顯示結果。mysql_cursor.close()、mysql_conn.close()、duckdb_conn.close():關閉 MySQL 和 DuckDB 的連線,釋放資源。
方法二:MySQL Extension 一鍵搞定
DuckDB 支援 MySQL extension,可以直接從 MySQL 資料函式庫載入資料表。
import duckdb
# 建立 DuckDB 連線
conn = duckdb.connect()
# 安裝並載入 MySQL extension
conn.execute('INSTALL mysql')
conn.execute('LOAD mysql')
# 定義 MySQL 連線引數
mysql_host = 'localhost'
mysql_user = 'user1'
mysql_password = 'password'
mysql_database = 'My_DB'
mysql_table = 'airlines'
mysql_port = 3306
# 建立 MySQL 連線字串
mysql_connection = \
f'mysql://{mysql_user}:{mysql_password}@{mysql_host}/{mysql_database}'
# 使用驗證資訊附加 MySQL 資料函式庫
attach_command = f'''
ATTACH 'host={mysql_host}
user={mysql_user}
password={mysql_password}
port={mysql_port}
database={mysql_database}'
AS mysqldb (TYPE MYSQL);
'''
conn.execute(attach_command)
conn.execute('USE mysqldb;')
display(conn.execute(f'''
SELECT * FROM {mysql_table}
''').df())
display(conn.execute(f'''
show tables
''').df())
# 關閉 DuckDB 連線
conn.close()
內容解密:
conn.execute('INSTALL mysql'): 安裝 MySQL 擴充套件,讓 DuckDB 能夠連線到 MySQL 資料函式庫。conn.execute('LOAD mysql'): 載入 MySQL 擴充套件,啟用連線 MySQL 資料函式庫的功能。ATTACH ... AS mysqldb (TYPE MYSQL): 使用指定的連線資訊連線到 MySQL 資料函式庫,並將其命名為mysqldb。TYPE MYSQL指明要連線的資料函式庫型別為 MySQL。conn.execute('USE mysqldb;'): 切換到mysqldb資料函式庫,後續的 SQL 查詢將在這個資料函式庫上執行。display(conn.execute(f'''SELECT * FROM {mysql_table}''').df()): 從mysqldb資料函式庫中選取指定的資料表 (mysql_table) 中的所有資料,並將結果顯示為 DataFrame。display(conn.execute(f'''show tables''').df()): 顯示mysqldb資料函式庫中的所有資料表。
玄貓的選擇:Extension vs. 手動?
- 追求簡潔高效: 如果你需要簡單、高效,與能直接存取 MySQL 資料,
mysql extension是你的首選。 - 需要高度彈性: 如果你需要更大的彈性來控制資料結構、執行轉換,或者在無法使用 extension 的環境中工作,手動方法更適合你。
對於大多數需要頻繁存取和分析資料的使用情境,mysql extension 由於其效率和易用性,可能是更好的選擇。
為何我開始擁抱 DuckDB CLI:資料函式庫互動新體驗
在資料分析的旅程中,我們經常需要在不同的資料來源之間穿梭,並且對這些資料進行各種操作。在第 2 章中,你已經學會如何使用 Python 將各種資料來源(CSV、Parquet、Excel 和資料函式庫)匯入到 DuckDB 中。現在,讓我們更進一步,學習如何使用 SQL 來操作匯入到 DuckDB 中的資料。畢竟,在 DuckDB 中使用 SQL 是其主要功能之一。
本章將重點介紹以下兩個方面:
- 使用 DuckDB CLI(命令列介面)來操作 DuckDB 資料函式庫,而無需使用 Python 等程式語言。
- 在 DuckDB 資料函式庫中使用 SQL。我們將透過實際範例來學習,而不是對 SQL 進行詳盡的探索。
準備好了嗎?讓我們開始吧!
DuckDB CLI:資料函式庫操作的瑞士刀
DuckDB CLI 是一個允許使用者直接從命令列與 DuckDB 互動的工具。在第 2 章中,你已經瞭解如何使用 Python 與 DuckDB 互動。然而,有時候你可能只是想直接操作資料函式庫,例如建立新表格、從不同的資料來源匯入資料,以及執行與資料函式庫相關的任務。在這種情況下,直接使用 DuckDB CLI 會更有效率。
DuckDB CLI 已經針對各種平台進行了預編譯:Windows、macOS 和 Linux。你可以在 DuckDB 網站的安裝頁面找到針對你的平台安裝 DuckDB CLI 的說明。
例如,對於 macOS,你可以使用像 brew 這樣的套件管理器來安裝 DuckDB CLI(無需管理員許可權):
$ brew install duckdb
Homebrew,通常被稱為 “brew”,是一個流行的 macOS 和 Linux 套件管理器。它簡化了在這些作業系統上安裝、更新和管理軟體套件和相依性的過程。你可以使用以下命令在你的機器上安裝 brew(單行):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com
/Homebrew/install/HEAD/install.sh)"
對於 Windows,你可以使用 Windows 套件管理器在命令提示字元下載 DuckDB CLI:
winget install DuckDB.cli
一旦 DuckDB CLI 被下載,你可以使用以下語法來使用它:
$ duckdb [OPTIONS] [FILENAME]
你可以從 DuckDB 網站取得完整的命令列引數選項列表。或者,你可以使用 -help 選項來顯示選項列表:
$ duckdb -help
Usage: duckdb [OPTIONS] FILENAME [SQL]
FILENAME is the name of an DuckDB database. A new database is created
if the file does not previously exist.
OPTIONS include:
-append append the database to the end of the file
-ascii set output mode to 'ascii'
-bail stop after hitting an error
-batch force batch I/O
-box set output mode to 'box'
-column set output mode to 'column'
-cmd COMMAND run "COMMAND" before reading stdin
-c COMMAND run "COMMAND" and exit
-csv set output mode to 'csv'
-echo print commands before execution
-init FILENAME read/process named file
-[no]header turn headers on or off
-help show this message
-html set output mode to HTML
-interactive force interactive I/O
-json set output mode to 'json'
-line set output mode to 'line'
-list set output mode to 'list'
-markdown set output mode to 'markdown'
-newline SEP set output row separator. Default: '\n'
-nofollow refuse to open symbolic links to database files
-no-stdin exit after processing options instead of reading stdin
-nullvalue TEXT set text string for NULL values. Default ''
-quote set output mode to 'quote'
-readonly open the database read-only
-s COMMAND run "COMMAND" and exit
-separator SEP set output column separator. Default: '|'
-stats print memory stats before each finalize
-table set output mode to 'table'
-unredacted allow printing unredacted secrets
-unsigned allow loading of unsigned extensions
-version show DuckDB version
如果你不提供 FILENAME 引數,DuckDB CLI 將會開啟一個暫時的記憶體資料函式庫,並顯示版本號碼、連線資訊,以及一個以 D: 開頭的提示符號:
$ duckdb
v0.10.1 4a89d97db8
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Using the DuckDB CLI | 53
Use ".open FILENAME" to reopen on a persistent database.
D
當你建立一個記憶體資料函式庫時,當你離開 DuckDB CLI 時,所有東西都會遺失。因此,只有當你想實驗 DuckDB 如何運作時,這個選項才有用。
要離開 DuckDB CLI,在 macOS 和 Linux 上按 Ctrl+C 兩次,或在 Windows 上按 Ctrl+C 一次。
更常見的 DuckDB CLI 用法是使用永續性資料函式庫。這確保了資料在會話之間被儲存,允許長期使用和重複使用,而無需每次都重新載入或重新處理資料。
以下範例顯示瞭如何將 DuckDB CLI 與永續性資料函式庫(名為 mydb.duckdb)一起使用:
$ duckdb mydb.duckdb
v0.10.1 4a89d97db8
Enter ".help" for usage hints.
D
現在資料函式庫已經被建立,你可以學習如何將資料匯入到其中。
資料匯入:讓 DuckDB 成為你的資料中心
當你在 DuckDB CLI 中時,你可以透過先建立一個表格,然後從 CSV 檔案匯入資料,來將資料匯入到你的資料函式庫中。
以下陳述式假設目前有一個名為 airlines.csv 的檔案,位於你啟動 DuckDB CLI 的同一個目錄中:
D CREATE TABLE airlines as FROM airlines.csv;
玄貓提醒:第 2 章討論了你可以用來從資料來源將檔案載入到 DuckDB 的各種函式。對於本章,重點是使用 SQL 操作表格。因此,為了簡單起見,我們將直接將 CSV 檔案讀取到 DuckDB 中。
請確保你的命令以分號 (;) 結尾。省略它將會提示 DuckDB CLI 在按下 Enter 鍵後等待進一步的陳述式。只有在增加分號後才會執行。
如果你在永續性資料函式庫(例如,mydb.duckdb)上執行上述命令,永續性資料函式庫將會在檔案系統中被建立。
這個陳述式會在資料函式庫中建立一個名為 airlines 的表格,然後讀取 airlines.csv 檔案並將其匯入到 airlines 表格中。要確認 airlines 表格的存在,你可以使用 show tables 陳述式:
DuckDB CLI 管理與常用指令:提升資料函式庫操作效率
在資料分析的旅程中,DuckDB 作為一個高效能的嵌入式資料函式庫,提供了強大的 SQL 處理能力。為了更有效地管理和操作 DuckDB,熟悉其命令列介面(CLI)提供的點指令(Dot Commands)至關重要。這些指令讓你能直接在 CLI 環境中執行資料倉管理任務,提升開發效率。
驗證資料載入
首先,讓我們確認 CSV 檔案是否已成功載入到 airlines 資料表中。使用 SHOW TABLES 指令可以檢視目前有哪些資料表:
D show tables;
┌──────────┐
│ name │
│ varchar │
├──────────┤
│ airlines │
└──────────┘
接著,使用 SELECT 陳述式來檢視 airlines 表中的資料:
D SELECT * FROM airlines;
┌───────────┬──────────────────────────────┐
│ IATA_CODE │ AIRLINE │
│ varchar │ varchar │
├───────────┼──────────────────────────────┤
│ UA │ United Air Lines Inc. │
│ AA │ American Airlines Inc. │
│ US │ US Airways Inc. │
│ F9 │ Frontier Airlines Inc. │
│ B6 │ JetBlue Airways │
│ OO │ Skywest Airlines Inc. │
│ AS │ Alaska Airlines Inc. │
│ NK │ Spirit Air Lines │
│ WN │ Southwest Airlines Co. │
│ DL │ Delta Air Lines Inc. │
│ EV │ Atlantic Southeast Airlines │
│ HA │ Hawaiian Airlines Inc. │
│ MQ │ American Eagle Airlines Inc. │
│ VX │ Virgin America │
├───────────┴──────────────────────────────┤
│ 14 rows 2 columns │
└──────────────────────────────────────────┘
探索點指令
DuckDB CLI 提供了許多以點(.)開頭的指令,用於執行特定的管理任務。要檢視所有可用的點指令,可以使用 .help 指令:
D .help
.bail on|off Stop after hitting an error. Default OFF
.binary on|off Turn binary output on or off. Default OFF
.cd DIRECTORY Change the working directory to DIRECTORY
.changes on|off Show number of rows changed by SQL
.check GLOB Fail if output since .testcase does not match
.columns Column-wise rendering of query results
.constant ?COLOR? Sets the syntax highlighting color used for
constant values
.constantcode ?CODE? Sets the syntax highlighting terminal code
used for constant values
.databases List names and files of attached databases
.dump ?TABLE? Render database content as SQL
.echo on|off Turn command echo on or off
.excel Display the output of next command in spreadsheet
.exit ?CODE? Exit this program with return-code CODE
.explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto
.fullschema ?--indent? Show schema and the content of sqlite_stat tables
.headers on|off Turn display of headers on or off
.help ?-all? ?PATTERN? Show help text for PATTERN
.highlight [on|off] Toggle syntax highlighting in the shell on/off
.import FILE TABLE Import data from FILE into TABLE
.indexes ?TABLE? Show names of indexes
.keyword ?COLOR? Sets the syntax highlighting color used for keywords
.keywordcode ?CODE? Sets the syntax highlighting terminal code used
for keywords
.lint OPTIONS Report potential schema issues.
.log FILE|off Turn logging on or off. FILE can be stderr/stdout
.maxrows COUNT Sets the maximum number of rows for display
(default: 40). Only for duckbox mode.
.maxwidth COUNT Sets the maximum width in characters. 0 defaults
to terminal width. Only for duckbox mode.
.mode MODE ?TABLE? Set output mode
.nullvalue STRING Use STRING in place of NULL values
.once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE
.open ?OPTIONS? ?FILE? Close existing database and reopen FILE
.output ?FILE? Send output to FILE or stdout if FILE is omitted
.parameter CMD ... Manage SQL parameter bindings
.print STRING... Print literal STRING
.prompt MAIN CONTINUE Replace the standard prompts
.quit Exit this program
.read FILE Read input from FILE
.rows Row-wise rendering of query results (default)
.schema ?PATTERN? Show the CREATE statements matching PATTERN
.separator COL ?ROW? Change the column and row separators
.sha3sum ... Compute a SHA3 hash of database content
.shell CMD ARGS... Run CMD ARGS... in a system shell
.show Show the current values for various settings
.system CMD ARGS... Run CMD ARGS... in a system shell
.tables ?TABLE? List names of tables matching LIKE pattern TABLE
.testcase NAME Begin redirecting output to 'testcase-out.txt'
.timer on|off Turn SQL timer on or off
.width NUM1 NUM2 ... Set minimum column widths for columnar output
與一般的 DuckDB 查詢不同,點指令不需要以分號結尾。
常用點指令詳解
接下來,玄貓將介紹幾個常用的點指令,幫助你更好地管理 DuckDB 資料函式庫。
.database:檢視當前資料函式庫
使用 .database 指令可以檢視目前正在使用的資料函式庫:
D .database
mydb: mydb.duckdb
這個指令顯示目前使用的資料函式庫是 mydb.duckdb,別名為 mydb。
如果啟動 DuckDB CLI 時沒有指設定檔案名稱,.database 指令會顯示:
D .database
memory:
這表示你正在使用一個記憶體資料函式庫。
.open:開啟資料函式庫
如果在啟動 DuckDB CLI 時沒有指設定檔案名稱,但之後想要開啟一個現有的或新的 DuckDB 資料函式庫,可以使用 .open 指令:
% duckdb
v0.10.1 4a89d97db8
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D .open mydb2.duckdb
D CREATE TABLE airports as FROM 'airports.csv';
D show tables;
┌──────────┐
│ name │
│ varchar │
├──────────┤
│ airports │
└──────────┘
在這個例子中,玄貓首先啟動了沒有指設定檔案名稱的 DuckDB CLI。然後,使用 .open 指令開啟了名為 mydb2.duckdb 的資料函式庫。由於 mydb2.duckdb 是一個新的資料函式庫檔案,它將在啟動 DuckDB CLI 的目錄中建立。
接著,玄貓將 airports.csv 檔案載入到一個新建立的資料表 airports 中。
.open 指令會關閉現有的資料函式庫並開啟一個新的資料函式庫。如果想要保持當前資料函式庫開啟並使用另一個資料函式庫,可以使用 ATTACH 陳述式:
D ATTACH 'mydb.duckdb';
你可以選擇為要附加的資料函式庫指定一個別名。以下範例與先前的陳述式相同。如果不指定別名,預設會使用檔案名稱作為別名:
D ATTACH 'mydb.duckdb' as mydb;
內容解密
SHOW TABLES: 此 SQL 指令用於列出當前資料函式庫中的所有資料表名稱。SELECT * FROM airlines: 此 SQL 指令用於從airlines資料表中選取所有欄位和所有列,以便檢視資料表的完整內容。.help: 這是 DuckDB CLI 中的一個點指令,用於顯示所有可用的點指令及其簡要說明。.database: 這是 DuckDB CLI 中的一個點指令,用於顯示當前連線的資料函式庫名稱和檔案路徑。.open: 這是 DuckDB CLI 中的一個點指令,用於開啟一個已存在的 DuckDB 資料函式庫檔案,或建立一個新的資料函式庫檔案。ATTACH 'mydb.duckdb' AS mydb: 此 SQL 指令用於將另一個 DuckDB 資料函式庫檔案mydb.duckdb附加到當前連線,並指定別名為mydb。
DuckDB CLI 進階指令:資料函式倉管理與資料匯出技巧
身為一個資料函式庫愛好者,我發現 DuckDB CLI 不僅輕巧好用,還內建了不少方便的指令。今天,就讓我玄貓來分享幾個我常用的指令,讓你在資料倉管理上更加得心應手。
資料函式庫切換:USE 指令
當你同時管理多個 DuckDB 資料函式庫時,USE 指令就像是你的遙控器,讓你輕鬆切換。
D USE mydb2;
這個指令會將 mydb2 設定為目前使用的資料函式庫。
表格一覽:.table 指令
想快速檢視目前有哪些表格? .table 指令絕對是你的好幫手。
D .table
airlines airports
這個指令會列出所有資料函式庫中的表格,方便你快速掌握資料函式庫的結構。
資料匯出成 SQL:.dump 指令
有時候,我們需要將 DuckDB 的資料匯出到其他資料函式庫(例如 MySQL)。這時, .dump 指令就能派上用場,它可以將表格內容轉換成一連串的 SQL 語法。
D .dump airlines
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE airlines(IATA_CODE VARCHAR, AIRLINE VARCHAR);;
INSERT INTO airlines VALUES('UA','United Air Lines Inc.');
INSERT INTO airlines VALUES('AA','American Airlines Inc.');
INSERT INTO airlines VALUES('US','US Airways Inc.');
INSERT INTO airlines VALUES('F9','Frontier Airlines Inc.');
INSERT INTO airlines VALUES('B6','JetBlue Airways');
INSERT INTO airlines VALUES('OO','Skywest Airlines Inc.');
INSERT INTO airlines VALUES('AS','Alaska Airlines Inc.');
INSERT INTO airlines VALUES('NK','Spirit Air Lines');
INSERT INTO airlines VALUES('WN','Southwest Airlines Co.');
INSERT INTO airlines VALUES('DL','Delta Air Lines Inc.');
INSERT INTO airlines VALUES('EV','Atlantic Southeast Airlines');
INSERT INTO airlines VALUES('HA','Hawaiian Airlines Inc.');
INSERT INTO airlines VALUES('MQ','American Eagle Airlines Inc.');
INSERT INTO airlines VALUES('VX','Virgin America');
COMMIT;
這個指令會將 airlines 表格匯出成 SQL 語法,方便你匯入到其他資料函式庫。
執行 SQL 指令碼:.read 指令
如果你有一大段 SQL 語法想要執行, .read 指令可以讓你從檔案讀取並執行 SQL 語法。
假設我們有一個名為 commands.sql 的檔案,內容如下:
CREATE TABLE airports2 as FROM airports.csv;
SELECT * FROM airports2;
你可以使用以下指令執行 commands.sql 檔案中的 SQL 語法:
D .read commands.sql
這個指令會建立一個名為 airports2 的表格,並顯示其內容。
將記憶體資料函式庫持久化:EXPORT DATABASE 與 IMPORT DATABASE
DuckDB 預設使用記憶體資料函式庫,這代表當你關閉 DuckDB CLI 時,所有資料都會消失。但別擔心,DuckDB 提供了 EXPORT DATABASE 和 IMPORT DATABASE 指令,讓你將記憶體資料函式庫持久化到硬碟中。
匯出資料函式庫:EXPORT DATABASE
D EXPORT DATABASE 'airports_db';
這個指令會在目前目錄下建立一個名為 airports_db 的資料夾,裡麵包含以下檔案:
airports.csv:原始的 CSV 檔案。load.sql:將 CSV 檔案載入到表格的 SQL 語法。schema.sql:建立表格的 SQL 語法。
匯入資料函式庫:IMPORT DATABASE
D IMPORT DATABASE 'airports_db';
D show tables;
┌──────────┐
│ name │
│ varchar │
├──────────┤
│ airports │
└──────────┘
這個指令會將 airports_db 資料夾中的檔案匯入到一個新的 DuckDB 資料函式庫中。
DuckDB SQL 語法入門:開發你的迷你圖書館
學會了資料倉管理,接下來就是學習 SQL 語法了。與其死背語法,不如透過實際例子來學習。因此,玄貓將帶領大家建立一個迷你圖書館的資料函式庫,包含以下四個表格:
Authors:作者資訊(姓名、國籍、出生年份)。Books:書籍資訊(書名、作者、型別、出版年份)。Borrowers:借閱者資訊(姓名、Email、加入會員日期)。Borrowings:借閱紀錄(借閱日期、歸還日期、借閱狀態)。
DuckDB 在很大程度上與 SQL 標準相容(特別是 SQL:1999),並且對於大多數操作都遵循典型的 SQL 語法。因此,以下關於 DuckDB SQL 的討論應與標準 SQL 相似。
DuckDB 資料函式庫中表的模式如下圖所示:
[顯示 Authors、Books、Borrowers 和 Borrowings 表格之間關係的 ER 圖]
在下一節中,我們將深入研究 SQL 語法,並學習如何使用它來操作這些表格。
總而言之,DuckDB CLI 提供了許多方便的指令,讓你可以輕鬆管理資料函式庫和表格。學會這些指令,你就能更有效率地使用 DuckDB。
DuckDB資料函式庫結構:表格設計與操作實務
在資料函式庫的世界中,表格如同組織資訊的根本。本文將探討如何使用DuckDB CLI建立、管理和操作資料函式庫中的表格,並分享一些表格設計的最佳實踐。
資料函式庫表格結構概覽
圖 3-3 展示了資料函式庫中各個表格的結構。接下來,我們將學習如何使用DuckDB CLI建立這些表格,並使用SQL陳述式進行資料的增刪查改。
建立DuckDB資料函式庫:起步篇
首先,使用DuckDB CLI建立一個DuckDB資料函式庫。以下指令將建立一個名為 library.duckdb 的資料函式庫:
% duckdb library.duckdb
v0.10.1 4a89d97db8
Enter ".help" for usage hints.
D
在這個範例中,資料函式庫被命名為 library.duckdb。接下來,我們將在這個資料函式庫中建立不同的表格。
SQL表格建立:語法與例項
讓我們先使用SQL建立四個表格:
CREATE TABLE Authors (
author_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
nationality TEXT,
birth_year INTEGER
);
CREATE TABLE Borrowers (
borrower_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT,
member_since DATE
);
CREATE TABLE Books (
book_id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
author_id INTEGER NOT NULL,
genre TEXT,
publication_year INTEGER,
FOREIGN KEY (author_id) REFERENCES Authors(author_id)
);
CREATE TABLE Borrowings (
borrowing_id INTEGER PRIMARY KEY,
book_id INTEGER NOT NULL,
borrower_id INTEGER NOT NULL,
borrow_date DATE,
return_date DATE,
status TEXT,
FOREIGN KEY (book_id) REFERENCES Books(book_id),
FOREIGN KEY (borrower_id) REFERENCES Borrowers(borrower_id)
);
在SQL中,CREATE TABLE 陳述式用於建立表格,後接表格名稱以及包含欄位名稱、資料型別和約束的欄位列表。
內容解密
CREATE TABLE:SQL指令,用於建立新的資料表。Authors、Borrowers、Books、Borrowings:資料表的名稱,分別代表作者、借閱者、書籍和借閱紀錄。author_id、borrower_id、book_id、borrowing_id:各資料表的主鍵(Primary Key),用於唯一識別每一筆紀錄。INTEGER:整數型別,用於儲存數值資料。TEXT或VARCHAR:文字型別,用於儲存字串資料。NOT NULL:約束條件,表示該欄位不能為空值。PRIMARY KEY:主鍵約束,確保該欄位的值是唯一的與不為空。FOREIGN KEY:外部索引鍵約束,用於建立資料表之間的關聯。REFERENCES:指定外部索引鍵參考的資料表和欄位。DATE:日期型別,用於儲存日期資料。
FOREIGN KEY 和 REFERENCES 關鍵字用於建立表格之間的關係,確保資料的參考完整性。例如,在建立 Books 表格時,以下SQL陳述式確保 Books 表格中的 author_id 必須存在於 Authors 表格的 author_id 欄位中:
FOREIGN KEY (author_id) REFERENCES Authors(author_id)
確認表格建立:驗證步驟
可以使用以下指令確認表格是否成功建立:
show tables;
如果看到以下輸出,則表示表格已成功建立:
┌────────────┐
│ name │
│ varchar │
├────────────┤
│ Authors │
│ Books │
│ Borrowers │
│ Borrowings │
└────────────┘
表格結構檢視:DESCRIBE與SHOW指令
要檢視錶格的結構,可以使用 DESCRIBE 陳述式。例如,檢視 Authors 表格的結構:
DESCRIBE Authors;
內容解密
DESCRIBE Authors;:這行程式碼會顯示Authors資料表的結構,包括欄位名稱、資料型別、是否允許空值(NULL)、主鍵(Key)、預設值(Default)以及額外資訊(Extra)。
輸出結果如下:
┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │ null │ key │ default │ extra │
│ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │
├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ author_id │ INTEGER │ NO │ PRI │ │ │
│ name │ VARCHAR │ NO │ │ │ │
│ nationality │ VARCHAR │ YES │ │ │ │
│ birth_year │ INTEGER │ YES │ │ │ │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘
或者,您可以使用 SHOW 陳述式:
SHOW Authors;
若要檢視整個資料函式庫的結構,可以使用 .schema 指令:
.schema
內容解密
這段程式碼會顯示建立資料函式庫中所有資料表的 SQL 陳述式,包括資料表的名稱、欄位、資料型別、約束條件(例如主鍵和外部索引鍵)等。這對於瞭解資料函式庫的整體結構非常有用。
輸出結果如下:
CREATE TABLE Authors(author_id INTEGER PRIMARY KEY, "name" VARCHAR
NOT NULL, nationality VARCHAR, birth_year INTEGER);
CREATE TABLE Books(book_id INTEGER PRIMARY KEY, title VARCHAR NOT NULL,
author_id INTEGER NOT NULL, genre VARCHAR, publication_year INTEGER,
FOREIGN KEY (author_id) REFERENCES Authors(author_id));
CREATE TABLE Borrowers(borrower_id INTEGER PRIMARY KEY, "name" VARCHAR
NOT NULL, email VARCHAR, member_since DATE);
CREATE TABLE Borrowings(borrowing_id INTEGER PRIMARY KEY, book_id
INTEGER NOT NULL, borrower_id INTEGER NOT NULL, borrow_date DATE,
return_date DATE, status VARCHAR, FOREIGN KEY (book_id) REFERENCES
Books(book_id), FOREIGN KEY (borrower_id) REFERENCES
Borrowers(borrower_id));
刪除表格:DROP TABLE語法
如果需要刪除DuckDB中的表格,可以使用 DROP TABLE 陳述式。例如,如果建立了一個名為 OverdueBorrowers 的表格,但不再需要它,可以這樣刪除:
CREATE TABLE OverdueBorrowers (
borrower_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT,
member_since DATE
);
DROP TABLE OverdueBorrowers;
內容解密
CREATE TABLE OverdueBorrowers (...):這段程式碼用於建立一個名為OverdueBorrowers的資料表,其中包含借閱者ID(borrower_id)、姓名(name)、電子郵件(email)和成為會員的日期(member_since)等欄位。DROP TABLE OverdueBorrowers;:這行程式碼用於刪除名為OverdueBorrowers的資料表。執行此指令後,該資料表將從資料函式庫中永久移除。
如果嘗試刪除被其他表格參照的表格,會收到錯誤訊息。例如,如果嘗試刪除 Authors 表格,會看到以下錯誤:
Catalog Error: Could not drop the table because this table is
main key table of the table "Books"
這是因為 Authors 表格包含 author_id 欄位,該欄位被 Books 表格參照。
表格操作:CRUD實戰
現在您已經瞭解如何建立資料函式庫和其中的表格,接下來將學習如何使用SQL填充表格、更新表格中的記錄、刪除記錄、查詢表格、連線表格以及執行資料聚合和分析。
前四個操作通常被稱為CRUD操作:建立(Create)、檢索(Retrieve)、更新(Update)和刪除(Delete)。
讓我們先從如何填充表格開始。
資料填充:INSERT INTO語法
在 Authors 表格建立完成後,讓我們插入一些作者資料:
-- 插入作者資料
INSERT INTO Authors (author_id, name, nationality, birth_year) VALUES
(1, 'J.K. Rowling', 'British', 1965),
(2, 'George Orwell', 'British', 1903),
(3, 'Haruki Murakami', 'Japanese', 1949);
內容解密
這段程式碼使用 INSERT INTO 陳述式將資料插入到 Authors 資料表中。
INSERT INTO Authors (author_id, name, nationality, birth_year):指定要插入資料的資料表 (Authors) 和欄位 (author_id,name,nationality,birth_year)。VALUES (1, 'J.K. Rowling', 'British', 1965), ...:指定要插入的資料值。每組括號代表一筆記錄,其中包含對應欄位的值。
玄貓(BlackCat)認為,透過實際操作這些SQL語法,能更深入瞭解資料函式庫的運作方式。
SQL 資料函式庫操作:新增、更新與刪除資料
在資料倉管理中,SQL 提供了強大的指令來操作資料表中的資料。本文玄貓將探討如何使用 INSERT、UPDATE 和 DELETE 指令,並透過例項說明其用法。
資料表結構
首先,我們假設有四個資料表:Authors(作者)、Borrowers(借閱者)、Books(書籍)和 Borrowings(借閱紀錄)。
- Authors:包含作者的
author_id、name、nationality和birth_year。 - Borrowers:包含借閱者的
borrower_id、name、email和member_since。 - Books:包含書籍的
book_id、title、author_id、genre和publication_year。 - Borrowings:包含借閱紀錄的
borrowing_id、book_id、borrower_id、borrow_date、return_date和status。
新增資料 (INSERT)
INSERT 指令用於將新資料列加入資料表中。以下是一些範例:
範例 1:新增多筆作者資料
INSERT INTO Authors (author_id, name, nationality, birth_year)
VALUES
(1, 'Jane Austen', 'British', 1775),
(2, 'Charles Dickens', 'British', 1812),
(3, 'Agatha Christie', 'British', 1890),
(4, 'J.K. Rowling', 'British', 1965),
(5, 'Tolkien', 'British', 1892);
這個 SQL 語法會將五位作者的資料一次性插入 Authors 資料表。每個作者的資料都用括號括起來,並用逗號分隔。
範例 2:新增單筆作者資料
INSERT INTO Authors (author_id, name, nationality, birth_year)
VALUES (6, 'Mark Twain', 'American', 1835);
這個 SQL 語法會將馬克·吐溫的資料插入 Authors 資料表。
範例 3:檢視作者資料表
SELECT * FROM Authors;
這個 SQL 語法會選取 Authors 資料表中的所有欄位和資料列,並將結果顯示出來。
範例 4:新增借閱者資料
INSERT INTO Borrowers (borrower_id, name, email, member_since)
VALUES
(1, 'John Smith', 'john.smith@example.com', '2022-01-01'),
(2, 'Emma Johnson', 'emma.johnson@example.com', '2021-12-15'),
(3, 'Michael Brown', 'michael.brown@example.com', '2022-02-20'),
(4, 'Sophia Wilson', 'sophia.wilson@example.com', '2022-03-10'),
(5, 'William Taylor', 'william.taylor@example.com', '2022-04-05'),
(6, 'Jane Doe', 'jane.doe@example.com', '2022-03-05');
這個 SQL 語法會將六位借閱者的資料插入 Borrowers 資料表。
範例 5:檢視借閱者資料表
SELECT * FROM Borrowers;
這個 SQL 語法會選取 Borrowers 資料表中的所有欄位和資料列,並將結果顯示出來。
範例 6:新增書籍資料
INSERT INTO Books (book_id, title, author_id, genre, publication_year)
VALUES
(1, 'Pride and Prejudice', 1, 'Classic', 1813),
(2, 'Oliver Twist', 2, 'Novel', 1837),
(3, 'Murder on the Orient Express', 3, 'Mystery', 1934),
(4, 'Harry Potter and the Philosopher''s Stone', 4, 'Fantasy', 1997),
(5, 'The Hobbit', 5, 'Fantasy', 1937);
這個 SQL 語法會將五本章籍的資料插入 Books 資料表。注意,author_id 欄位參考 Authors 資料表的 author_id 欄位,因此必須是有效的作者 ID。
範例 7:檢視書籍資料表
SELECT * FROM Books;
這個 SQL 語法會選取 Books 資料表中的所有欄位和資料列,並將結果顯示出來。
範例 8:新增借閱紀錄資料
INSERT INTO Borrowings (borrowing_id, book_id, borrower_id,
borrow_date, return_date, status)
VALUES
(1, 1, 1, '2022-04-10', '2022-04-25', 'Returned'),
(2, 3, 2, '2022-03-20', NULL, 'On Loan'),
(3, 4, 3, '2022-04-05', NULL, 'On Loan'),
(4, 2, 4, '2022-04-15', NULL, 'On Loan'),
(5, 5, 5, '2022-03-30', '2022-04-20', 'Returned'),
(6, 1, 3, '2022-04-26', NULL, 'On Loan');
這個 SQL 語法會將六筆借閱紀錄插入 Borrowings 資料表。book_id 和 borrower_id 欄位分別參考 Books 和 Borrowers 資料表的相應欄位,因此必須是有效的書籍 ID 和借閱者 ID。
範例 9:檢視借閱紀錄資料表
SELECT * FROM Borrowings;
這個 SQL 語法會選取 Borrowings 資料表中的所有欄位和資料列,並將結果顯示出來。
更新資料 (UPDATE)
UPDATE 指令用於修改資料表中現有資料列的資料。它通常與 SET 和 WHERE 關鍵字一起使用。
範例 1:更新借閱紀錄的狀態
假設我們想將 borrowing_id 為 3 的借閱紀錄的狀態更新為 “Returned”,並設定 return_date 為 ‘2022-04-05’。
UPDATE Borrowings
SET return_date = '2022-04-05',
status = 'Returned'
WHERE borrowing_id = 3;
這個 SQL 語法會更新 Borrowings 資料表中 borrowing_id 為 3 的資料列,將 return_date 設定為 ‘2022-04-05’,status 設定為 ‘Returned’。
範例 2:檢視更新後的借閱紀錄資料表
SELECT * FROM Borrowings;
這個 SQL 語法會選取 Borrowings 資料表中的所有欄位和資料列,並將結果顯示出來,以確認更新是否成功。
刪除資料 (DELETE)
DELETE 指令用於從資料表中刪除資料列。它通常與 WHERE 關鍵字一起使用,以指定要刪除的資料列。
範例 1:刪除借閱者資料
假設我們想從 Borrowers 資料表中刪除名為 “Jane Doe” 的借閱者。
DELETE FROM Borrowers
WHERE name = 'Jane Doe';
這個 SQL 語法會從 Borrowers 資料表中刪除所有名為 “Jane Doe” 的資料列。
範例 2:檢視刪除後的借閱者資料表
SELECT * FROM Borrowers;
這個 SQL 語法會選取 Borrowers 資料表中的所有欄位和資料列,並將結果顯示出來,以確認刪除是否成功。
透過這些 SQL 指令,可以有效地管理和操作資料函式庫中的資料,確保資料的準確性和完整性。
總之,玄貓認為熟練掌握 INSERT、UPDATE 和 DELETE 指令對於任何資料倉管理員或開發者來說都是至關重要的。
資料函式庫瘦身:精準刪除與高效查詢的藝術
在資料倉管理中,資料的刪除與查詢是日常操作中不可或缺的一環。如何精準地刪除不再需要的資料,以及如何高效地從龐大的資料集中提取所需資訊,是每個資料倉管理員和開發者都需要掌握的技能。玄貓將探討 SQL 中 DELETE 和 SELECT 陳述式的妙用,並分享一些實戰技巧。
擺脫冗餘:精準 DELETE 語法解析
DELETE 陳述式是用於從資料表中移除資料的。最常見的用法是根據 borrower_id 來刪除特定的記錄。例如,要刪除 borrowers 資料表中 borrower_id 為 6 的記錄,可以使用以下語法:
DELETE FROM Borrowers
WHERE borrower_id = 6;
上述語法結構簡單明瞭,但實際應用中,我們可能需要根據更複雜的條件來刪除資料。這時,LIKE 關鍵字就派上用場了。
假設我們要刪除所有名字中包含 “Jane” 的記錄,可以使用以下語法:
DELETE FROM Borrowers
WHERE name LIKE '%Jane%';
在這個語法中,% 符號是 SQL 中的萬用字元,表示可以比對任何字元。因此,'%Jane%' 表示比對任何包含 “Jane” 的名字。
提升效率:SELECT 語法深度解析
SELECT 陳述式是用於從資料表中查詢資料的。最基本的用法是選擇所有欄位:
SELECT *
FROM 表格名稱;
但更多時候,我們需要根據特定的條件來篩選資料。WHERE 子句就是用來實作這一功能的。
例如,要查詢所有出生年份距今超過 100 年的作者,可以使用以下語法:
SELECT *
FROM Authors
WHERE (YEAR(CURRENT_DATE) - birth_year) > 100;
這個語法中,CURRENT_DATE 函式傳回當前日期,YEAR 函式則提取日期中的年份。透過計算當前年份與作者出生年份的差值,我們可以篩選出符合條件的作者。
另一個常見的應用場景是根據日期欄位進行篩選。例如,要查詢所有在 2022 年 1 月 1 日之後成為會員的借閱者,可以使用以下語法:
SELECT *
FROM Borrowers
WHERE member_since >= '2022-01-01';
資料整合:JOIN 語法應用場景
在實際的資料函式庫應用中,資料通常分散在多個資料表中。要查詢需要的資訊,我們需要將這些資料表連線起來。JOIN 陳述式就是用來實作這一功能的。DuckDB 支援多種型別的 JOIN,包括:
- 左向外連線(LEFT JOIN)
- 右向外連線(RIGHT JOIN)
- 內部連線(INNER JOIN)
- 全連線(FULL JOIN)
- 交叉連線(CROSS JOIN)
玄貓將以 LEFT JOIN 為例,說明 JOIN 語法的應用。假設我們需要查詢所有書籍的書名以及對應的作者姓名,可以使用以下語法:
SELECT b.book_id, b.title, a.name
FROM Books b
LEFT JOIN Authors a ON b.author_id = a.author_id;
在這個語法中,LEFT JOIN Authors a ON b.author_id = a.author_id 表示將 Books 資料表(左表)與 Authors 資料表(右表)進行左向外連線。這意味著,結果集中將包含 Books 資料表中的所有記錄,以及 Authors 資料表中與之比對的記錄。如果 Authors 資料表中沒有與之比對的記錄,則結果集中 Authors 資料表的欄位將顯示為 NULL。
JOIN 語法是資料函式庫查詢中非常重要的一部分。透過靈活運用不同型別的 JOIN,我們可以從多個資料表中提取所需的資訊,實作複雜的資料分析和報表功能。
在資料倉管理中,DELETE 和 SELECT 陳述式是基本但至關重要的工具。掌握這些語法的精髓,能夠幫助我們更有效地管理和利用資料,從而提升應用程式的效能和使用者經驗。
SQL Join 的奧秘:玄貓帶你駕馭資料表關聯
在資料函式庫的世界裡,資料通常分散在多個表格中,而 SQL Join 正是將這些表格巧妙連線起來的橋樑。透過 Join,我們可以從多個表格中提取相關的資料,組合成有意義的資訊。今天,玄貓就帶領大家深入探索 SQL Join 的各種用法,讓你在資料處理上更加得心應手。
LEFT JOIN:保留左側表格的完整性
LEFT JOIN(左向外連線)會包含左側表格的所有列,即使在右側表格中沒有找到比對的列。當右側表格中沒有比對的列時,結果中來自右側表格的欄位將顯示為 NULL。
舉例來說,假設我們有 Authors(作者)和 Books(書籍)兩個表格,我們想要列出所有作者以及他們所寫的書籍(如果有的話)。這時,LEFT JOIN 就非常適合:
SELECT a.name, b.book_id, b.title
FROM Authors a
LEFT JOIN Books b ON a.author_id = b.author_id;
這個查詢會列出 Authors 表格中的所有作者,以及他們在 Books 表格中對應的書籍 ID 和書名。如果某位作者沒有任何書籍記錄,book_id 和 title 欄位將顯示為 NULL。
範例解密
以上述查詢為例,如果作者 Mark Twain 沒有在 Books 表格中列出任何書籍,查詢結果仍然會顯示 Mark Twain 的名字,但 book_id 和 title 欄位會是 NULL。這在需要完整作者列表的場景下非常有用。
RIGHT JOIN:確保右側表格的資料不遺漏
RIGHT JOIN(右向外連線)與 LEFT JOIN 類別似,但它會包含右側表格的所有列,即使在左側表格中沒有找到比對的列。當左側表格中沒有比對的列時,結果中來自左側表格的欄位將顯示為 NULL。
以下是一個 RIGHT JOIN 的範例:
SELECT b.book_id, b.title, a.name
FROM Books b
RIGHT JOIN Authors a ON b.author_id = a.author_id;
這個查詢會列出 Authors 表格中的所有作者,以及他們在 Books 表格中對應的書籍 ID 和書名。與 LEFT JOIN 不同的是,即使 Books 表格中沒有任何書籍與某位作者關聯,該作者的名字仍然會出現在結果中。
情境應用
RIGHT JOIN 在某些情況下特別有用。例如,當你需要確保某個表格中的所有記錄都出現在結果中時,即使另一個表格中沒有相關的資料。
INNER JOIN:精確比對,只顯示相關資料
INNER JOIN(內連線)只會傳回兩個表格中都有比對的列。換句話說,只有當連線條件在兩個表格中都滿足時,才會包含該列。
如果我們只想列出有作者的書籍,可以使用 INNER JOIN:
SELECT b.book_id, b.title, a.name
FROM Books b
INNER JOIN Authors a ON b.author_id = a.author_id;
這個查詢只會傳回 Books 表格中與 Authors 表格中的作者相關聯的書籍。如果某本章沒有對應的作者,或者某位作者沒有任何書籍,這些記錄將不會出現在結果中。
玄貓小提示
INNER JOIN 是最常用的 Join 型別之一,因為它能夠精確地提取相關資料,避免不必要的 NULL 值。
FULL JOIN:聯集所有資料,不留遺憾
FULL JOIN(完整外連線)會傳回兩個表格中的所有列,無論是否有比對的列。如果某個表格中沒有比對的列,結果中來自另一個表格的欄位將顯示為 NULL。
以下是一個 FULL JOIN 的範例:
SELECT b.book_id, b.title, a.name
FROM Books b
FULL JOIN Authors a ON b.author_id = a.author_id;
這個查詢會列出 Books 表格中的所有書籍和 Authors 表格中的所有作者。如果某本章沒有對應的作者,name 欄位將顯示為 NULL。如果某位作者沒有任何書籍,book_id 和 title 欄位將顯示為 NULL。
使用場景
FULL JOIN 在需要完整資料的場景下非常有用,例如資料比對、資料函式庫同步等。
多表連線:串聯起複雜的資料關係
除了連線兩個表格外,SQL Join 還可以連線多個表格,以建立更複雜的資料關係。
假設我們還有一個 Borrowings(借閱)表格,記錄了書籍的借閱資訊。現在,我們想要找出所有 John Smith 借閱的書籍:
SELECT b.title AS book_title
FROM Books b
INNER JOIN Borrowings br ON b.book_id = br.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
WHERE bw.name = 'John Smith';
這個查詢首先使用 INNER JOIN 將 Books 表格和 Borrowings 表格連線起來,然後再將 Borrowings 表格和 Borrowers 表格連線起來。最後,使用 WHERE 子句篩選出借閱者姓名為 John Smith 的記錄。
玄貓經驗談
多表連線是 SQL 中非常強大的功能,可以讓你從多個表格中提取相關的資料,組合成有意義的資訊。在實際應用中,可以根據需要選擇不同的 Join 型別,以達到最佳的查詢效果。
SQL Join 是資料函式庫查詢中不可或缺的一部分。透過靈活運用各種 Join 型別,我們可以輕鬆地從多個表格中提取相關的資料,滿足不同的業務需求。希望玄貓今天的分享能夠幫助你更好地理解和應用 SQL Join,在資料處理的道路上更上一層樓。
進階 SQL 查詢:探索資料之間的關聯
在前一篇文章中,玄貓介紹瞭如何使用 SQL 進行基本的資料查詢。現在,讓我們深入研究更複雜的查詢,探索多個資料表之間的關聯性。
首先,假設我們想找出 John Smith 借了哪本章。可以使用以下 SQL 語法:
SELECT b.title
FROM Books b
INNER JOIN Borrowings br ON b.book_id = br.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
WHERE bw.name = 'John Smith';
內容解密: 這段 SQL 語法執行了兩個內部聯結(inner join)。首先,它根據 book_id 欄位將 Books 資料表和 Borrowings 資料表聯結起來。接著,它根據 borrower_id 欄位將 Borrowings 資料表和 Borrowers 資料表聯結。最後,它篩選 Borrowers 資料表中的 name 欄位。結果顯示,John Smith 借閱的書是《傲慢與偏見》。
接下來,找出所有已被借閱的書籍,並列出借閱者的姓名以及書名:
SELECT bw.name AS borrower_name, b.title AS book_title
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id;
內容解密: 這個查詢與前一個查詢類別似,只是這次也列出了借閱者的姓名。然而,這次沒有針對特定借閱者進行篩選。
為了以一致的順序列出結果,可以將 ORDER BY 語法增加到查詢中:
SELECT bw.name AS borrower_name, b.title AS book_title
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
ORDER BY bw.name, b.title;
內容解密: 現在,結果將按借閱者的姓名依字母順序排序,然後按書名排序。
為了在結果中包含作者姓名以及書名,可以根據 author_id 欄位,將 Authors 資料表與 Books 資料表進一步聯結:
SELECT bw.name AS borrower_name, b.title AS book_title, a.name AS author_name
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
INNER JOIN Authors a ON b.author_id = a.author_id;
內容解密: 透過更多的聯結操作,我們可以從多個資料表中提取相關資訊,建立更豐富的查詢結果。
現在,來看看 Michael Brown 借了哪些書、借閱日期,以及每本章的歸還狀態:
SELECT b.book_id, b.title, br.borrow_date, br.return_date
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
WHERE bw.name = 'Michael Brown';
內容解密: 這個查詢透過 WHERE 語法篩選出 Michael Brown 的借閱紀錄,並顯示書籍 ID、書名、借閱日期和歸還日期。
SQL 資料聚合:從資料中提取洞見
SQL 中的聚合(Aggregation)是指將多列資料彙總或聚合為單一值的過程。接下來,玄貓將透過一些範例來學習如何執行此操作。
首先,加總每位借閱者借閱的書籍數量:
SELECT bw.name AS borrower_name, COUNT(br.book_id) AS books_borrowed
FROM Borrowings br
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
GROUP BY bw.name
ORDER BY bw.name;
內容解密: 這段 SQL 語法根據 borrower_id 欄位在 Borrowings 資料表和 Borrowers 資料表之間執行內部聯結。它使用 COUNT 函式計算 Borrowings 資料表中 book_id 條目的數量,並建立一個名為 books_borrowed 的別名。最後,它按 Borrowers 資料表的 name 欄位對結果進行分組和排序。
也可以使用 COUNT 函式找出哪本章最常被借閱:
SELECT b.book_id, b.title AS book_name, COUNT(*) AS num_borrowings
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
GROUP BY b.book_id, b.title
ORDER BY num_borrowings DESC
LIMIT 1;
內容解密: ORDER BY num_borrowings DESC 行根據借閱次數以降序排列結果,因此借閱次數最多的書將首先出現。使用 LIMIT 1 將結果限制為僅最上面的一列,這對應於借閱次數最多的書。
出於好奇,您可能想知道所有作者的平均年齡,因為 Authors 資料表中有一個 birth_year 欄位。若要找出 Authors 資料表中所有作者的平均年齡,可以使用目前年份和他們的出生年份來找出每位作者的年齡,然後使用 AVG 函式來計算這些年齡的平均值:
SELECT AVG(YEAR(CURRENT_DATE) - birth_year) AS average_age_of_authors
FROM Authors;
內容解密: 這個查詢計算了所有作者的平均年齡。YEAR(CURRENT_DATE) 取得目前年份,然後減去 birth_year 以得到作者的年齡。AVG 函式計算這些年齡的平均值。
使用 AVG 函式,也可以找出所有書籍的平均出版年份:
SELECT AVG(publication_year) AS avg_publication_year
FROM Books;
內容解密: 這個查詢計算了所有書籍的平均出版年份。AVG(publication_year) 函式計算 Books 資料表中 publication_year 欄位的平均值。
透過這些範例,玄貓展示瞭如何使用 SQL 進行資料聚合,從而提取有用的洞見。
透過本篇文章,我們學習瞭如何使用 SQL 聯結多個資料表,以及如何使用聚合函式從資料中提取洞見。這些技術對於資料分析和報告至關重要。
SQL進階分析:找出圖書館裡的那些超時未還書
在資料分析的世界裡,SQL不僅僅是查詢資料的工具,更是挖掘資訊價值的利器。讓我們深入研究如何使用SQL,針對圖書館的借閱資料進行一些有趣的分析,特別是找出那些逾期未還的書籍。
找出逾期未還書的借閱者
假設圖書館的借閱期限是14天,我們想找出哪些借閱者逾期未還書,並計算逾期天數。這時候,INNER JOIN語法就派上用場了。它能將Borrowings(借閱紀錄)、Books(書籍)和Borrowers(借閱者)三張表連線起來,讓我們能同時取得書名、借閱者姓名和歸還日期。
以下SQL語法示範如何找出逾期歸還的書籍,並計算逾期天數:
SELECT
bw.name AS borrower_name, -- 借閱者姓名
b.title AS book_title, -- 書籍名稱
br.borrow_date, -- 借閱日期
br.return_date, -- 歸還日期
DATEDIFF('day', br.borrow_date, br.return_date) - 14 AS overdue -- 逾期天數
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
WHERE br.return_date IS NOT NULL -- 確保已歸還
AND DATEDIFF('day', br.borrow_date, br.return_date) > 14; -- 篩選逾期書籍
程式碼解密
SELECT陳述式:選取借閱者姓名(borrower_name),書籍名稱(book_title),借閱日期(borrow_date),歸還日期(return_date),並計算逾期天數(overdue)。FROM Borrowings br:指定從Borrowings表格開始查詢,並給予別名br。INNER JOIN Books b ON br.book_id = b.book_id:使用INNER JOIN將Borrowings表格和Books表格連線起來,連線的條件是Borrowings表格的book_id欄位和Books表格的book_id欄位相同。這樣可以取得每筆借閱記錄對應的書籍資訊,並給Books表格別名為b。INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id:使用INNER JOIN將Borrowings表格和Borrowers表格連線起來,連線的條件是Borrowings表格的borrower_id欄位和Borrowers表格的borrower_id欄位相同。這樣可以取得每筆借閱記錄對應的借閱者資訊,並給Borrowers表格別名為bw。WHERE br.return_date IS NOT NULL:使用WHERE陳述式篩選出已歸還的書籍,確保return_date欄位不為空。AND DATEDIFF('day', br.borrow_date, br.return_date) > 14:使用WHERE陳述式進一步篩選出逾期歸還的書籍。DATEDIFF('day', br.borrow_date, br.return_date)計算借閱日期和歸還日期之間的天數差,然後減去 14 天,如果結果大於 0,則表示該書籍已逾期歸還。
建立視窗:儲存常用的查詢
如果這個查詢經常使用,可以將它儲存為一個視窗(View),這樣可以像使用表一樣方便地重複使用它。
CREATE VIEW overdue_borrowings AS
SELECT
bw.name AS borrower_name,
b.title AS book_title,
br.borrow_date,
br.return_date,
DATEDIFF('day', br.borrow_date, br.return_date) - 14 AS overdue
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
WHERE br.return_date IS NOT NULL
AND DATEDIFF('day', br.borrow_date, br.return_date) > 14;
現在,你可以直接從這個視窗查詢逾期還書的資訊:
SELECT * FROM overdue_borrowings;
找出目前逾期未還的書籍
除了已歸還的逾期書籍,我們也想知道目前有哪些書還沒還,並且已經逾期多久了。
SELECT
b.book_id,
b.title,
bw.name AS borrower_name,
br.borrow_date,
DATEDIFF('day', br.borrow_date, CURRENT_DATE()) - 14 AS overdue
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
WHERE br.return_date IS NULL
AND DATEDIFF('day', br.borrow_date, CURRENT_DATE()) > 14;
程式碼解密
SELECT陳述式:選取書籍ID(book_id),書籍名稱(title),借閱者姓名(borrower_name),借閱日期(borrow_date),並計算逾期天數(overdue)。FROM Borrowings br:指定從Borrowings表格開始查詢,並給予別名br。INNER JOIN Books b ON br.book_id = b.book_id:使用INNER JOIN將Borrowings表格和Books表格連線起來,連線的條件是Borrowings表格的book_id欄位和Books表格的book_id欄位相同。這樣可以取得每筆借閱記錄對應的書籍資訊,並給Books表格別名為b。INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id:使用INNER JOIN將Borrowings表格和Borrowers表格連線起來,連線的條件是Borrowings表格的borrower_id欄位和Borrowers表格的borrower_id欄位相同。這樣可以取得每筆借閱記錄對應的借閱者資訊,並給Borrowers表格別名為bw。WHERE br.return_date IS NULL:使用WHERE陳述式篩選出尚未歸還的書籍,確保return_date欄位為空。AND DATEDIFF('day', br.borrow_date, CURRENT_DATE()) > 14:使用WHERE陳述式進一步篩選出逾期未歸還的書籍。DATEDIFF('day', br.borrow_date, CURRENT_DATE())計算借閱日期和目前日期之間的天數差,然後減去 14 天,如果結果大於 0,則表示該書籍已逾期未歸還。
由於我們是從今天的日期開始計算,overdue欄位中的數值可能會很大。如果想知道特定日期(例如2022-06-10)的逾期情況,可以用特定日期取代CURRENT_DATE()函式:
SELECT
b.book_id,
b.title,
bw.name AS borrower_name,
br.borrow_date,
DATEDIFF('day', br.borrow_date, '2022-06-10') - 14 AS overdue
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
WHERE br.return_date IS NULL
AND DATEDIFF('day', br.borrow_date, '2022-06-10') > 14;
透過這些SQL查詢,玄貓可以更有效地管理圖書館的書籍借閱情況,並及時提醒借閱者歸還書籍。
總之,SQL不僅是資料倉管理的基礎,也是資料分析的強大工具。透過靈活運用SQL語法,玄貓可以從看似簡單的資料中挖掘出有價值的資訊,為決策提供支援。
探索 DuckDB 的極限:如何用 SQL 挖掘資料價值
在資料分析的世界裡,DuckDB 以其輕巧高效著稱,成為許多開發者和資料科學家的首選。但要真正發揮 DuckDB 的威力,你需要深入瞭解 SQL,掌握各種查詢技巧。本文將帶你探索 DuckDB 的 SQL 極限,讓你能夠輕鬆駕馭複雜的資料分析任務。
從巢狀查詢到資料洞察:解構 SQL 語法
SQL 的強大之處,在於其靈活的查詢能力。透過巢狀查詢,我們可以將多個 SELECT 陳述式組合在一起,逐步篩選和分析資料。以下面的 SQL 陳述式為例,它用於找出最常被借閱的書籍:
SELECT b.book_id, b.title AS book_name,
bw.name AS borrower_name,
br.borrow_date AS loan_date, br.return_date
FROM Borrowings br
INNER JOIN Books b ON br.book_id = b.book_id
INNER JOIN Borrowers bw ON br.borrower_id = bw.borrower_id
WHERE b.book_id IN (
SELECT book_id
FROM Borrowings
GROUP BY book_id
HAVING COUNT(*) = (
SELECT MAX(num_borrowings)
FROM (
SELECT COUNT(*) AS num_borrowings
FROM Borrowings
GROUP BY book_id
) AS counts
)
)
GROUP BY b.book_id, b.title, br.borrower_id, bw.name, br.borrow_date, br.return_date;
這個查詢包含了三個巢狀的 SELECT 陳述式,讓我們一步步解構它的運作方式:
-
最內層 SELECT 陳述式 (1)
這個陳述式計算
Borrowings資料表中,每本章籍 (book_id) 的借閱次數。它使用GROUP BY將結果按照book_id分組,並使用COUNT(*)計算每組的借閱次數。 -
中間層 SELECT 陳述式 (2)
這個陳述式從最內層查詢的結果中,找出最大的借閱次數 (
MAX(num_borrowings))。這代表了所有書籍中,被借閱次數最多的那本章的借閱次數。 -
外層 WHERE 子句 (3)
這個子句使用
IN條件,篩選出Borrowings資料表中,book_id的借閱次數等於最大借閱次數的書籍。換句話說,它找出所有被借閱次數最多的書籍。 -
最外層 SELECT 陳述式 (4)
最後,這個陳述式透過
INNER JOIN將Borrowings、Books和Borrowers資料表連線起來,檢索出這些最常被借閱書籍的詳細資訊,包括書名、借閱者姓名、借閱日期和歸還日期。
DuckDB 的資料管理技巧:CLI 與資料匯入
要有效使用 DuckDB,除了 SQL 技能外,還需要熟悉 DuckDB 的 CLI (Command Line Interface) 和資料匯入技巧。DuckDB 的 CLI 提供了許多方便的指令,可以幫助你管理資料函式庫和執行查詢。
- .tables: 列出所有資料表。
- .schema table_name: 顯示資料表的結構。
- .import csv_file table_name: 從 CSV 檔案匯入資料。
此外,DuckDB 的資料函式庫持久化功能也非常重要。確保你的資料被儲存並可以隨時存取,避免資料遺失。
SQL 的重要性:資料分析的根本
SQL 是資料分析的根本,無論你使用哪種資料函式庫平台,SQL 都是必備的技能。熟練掌握 SQL,你可以輕鬆地建立和操作資料函式庫、查詢資料、執行複雜的分析,並從資料中提取有價值的洞察。
- 資料表建立與操作: 學習如何建立、修改和刪除資料表。
- JOIN 語法: 掌握不同型別的 JOIN 語法,例如 INNER JOIN、LEFT JOIN 和 RIGHT JOIN,以便將多個資料表組合在一起。
- 資料聚合: 學習如何使用 GROUP BY 和聚合函式 (例如 COUNT、SUM、AVG) 來分析資料。
Polars 與 DuckDB 的結合:更高效的資料分析
DuckDB 可以與 Polars 結合使用,Polars 是一個高效的 DataFrame 函式庫,可以彌補 Pandas 在處理大型資料集時的不足。
在下一個章節,玄貓將會探討如何將 DuckDB 與 Polars 結合使用,以實作更快速、更有效率的資料分析。
邁向高效資料分析之路
本文探討了 DuckDB 的 SQL 查詢技巧,從巢狀查詢到資料管理,希望能幫助你掌握 DuckDB 的核心概念。熟練運用這些技巧,你就能夠充分發揮 DuckDB 的潛力,從資料中挖掘出更多有價值的資訊。
### Polars DataFrame:資料檢索與篩選的藝術
Polars 是一個高效能的 DataFrame 函式庫,在資料處理上提供了極佳的效能。身為一位資料科學家,我發現 Polars 在處理大型資料集時特別出色。與 Pandas 相比,Polars 著重於效率和速度,這使得它在需要快速處理大量資料的專案中成為理想選擇。
#### DataFrame 的基本結構
Polars DataFrame 的外觀與 Pandas DataFrame 相似,但有一些關鍵差異:
* **無索引**:Polars DataFrame 不使用索引。玄貓認為這是 Polars 的一個設計哲學,因為索引在許多情況下並非必要。
* **資料型別顯示**:在 DataFrame 的標頭下方,Polars 會顯示每個欄位的資料型別(例如,str、i64、f64、bool)。
若要顯示每個欄位資料型別的完整名稱,可以使用 `dtypes` 屬性:
```python
df.dtypes
此陳述式會顯示以下結果:
[String, Int64, Float64, Float64, Boolean, String]
若要取得欄位名稱,可以使用 columns 屬性:
df.columns
# ['Model', 'Year', 'Engine_Min', 'Engine_Max', 'AWD', 'Company']
若要取得 DataFrame 的所有列,可以使用 rows() 方法:
df.rows()
這些列會以元組列表的形式傳回:
[('Camry', 1982, 2.5, 3.5, False, 'Toyota'),
('Corolla', 1966, 1.8, 2.0, False, 'Toyota'),
('RAV4', 1994, 2.0, 2.5, True, 'Toyota'),
('Mustang', 1964, 2.3, 5.0, False, 'Ford'),
('F-150', 1975, 2.7, 5.0, True, 'Ford'),
('Escape', 2000, 1.5, 2.5, True, 'Ford'),
('Golf', 1974, 1.0, 2.0, True, 'Volkswagen'),
('Tiguan', 2007, 1.4, 2.0, True, 'Volkswagen')]
欄位選取:精準鎖定目標資料
在 Polars 中,可以使用 select() 方法來選取特定的欄位:
df.select(
'Model'
)
這會傳回名為 “Model” 的欄位。
避免使用方括號索引
雖然可以使用方括號索引方法(例如 df['Model']),但 Polars 官方檔案建議避免使用這種方式,因為它有時會造成混淆,並且未來可能會被移除。
若要選取多個欄位,可以將欄位名稱放在列表中:
df.select(
['Model','Company'] # 或 'Model','Company'
)
若要選取所有字串型別的欄位,可以使用表示式:
df.select(
pl.col(pl.String)
)
pl.col(pl.String) 是一個 Polars 表示式,可以解釋為「取得所有資料型別為 String 的欄位」。
表示式的強大功能
表示式在 Polars 中非常強大。例如,可以將多個表示式串聯在一起:
df.select(
pl.col(['Year','Model','Engine_Max'])
.sort_by(['Engine_Max','Year'],descending = [False,True])
)
這個程式碼片段首先選取 “Year”、“Model” 和 “Engine_Max” 三個欄位,然後根據 “Engine_Max” 欄位以遞增順序排序,並根據 “Year” 欄位以遞減順序排序。
也可以將多個表示式放在列表中。例如,以下程式碼片段列出所有字串欄位以及 “Year” 欄位:
df.select(
[pl.col(pl.String), 'Year']
)
列選取:篩選出所需資訊
若要取得 Polars DataFrame 中的特定列,可以使用 row() 方法並傳入列號:
df.row(0)
# ('Camry', 1982, 2.5, 3.5, False, 'Toyota')
若要取得多列,可以使用方括號索引方法(不建議):
df[1:3] # 傳回第二列和第三列
Polars 建議使用更明確的查詢和函式來操作資料。在真實世界中,通常會根據特定條件來檢索列,而不是特定的列號。
使用 filter() 方法
Polars 建議使用 filter() 方法來選取列。例如,若要選取所有來自 Toyota 的汽車,可以使用以下表達式:
df.filter(
pl.col('Company') == 'Toyota'
)
可以使用邏輯運算元指定多個條件。以下範例檢索所有來自 Toyota 或 Ford 的汽車:
df.filter(
(pl.col('Company') == 'Toyota') |
(pl.col('Company') == 'Ford')
)
若要比對多個汽車品牌,可以使用 is_in() 方法:
df.filter(
(pl.col('Company').is_in(['Toyota','Ford']))
)
以下範例檢索所有 1980 年後推出的 Toyota 汽車:
df.filter(
(pl.col('Company') == 'Toyota') &
(pl.col('Year') > 1980)
)
以下範例檢索所有非 Toyota 的汽車:
df.filter(
~(pl.col('Company') == 'Toyota')
)
或者,也可以使用 != 運算元:
df.filter(
(pl.col('Company') != 'Toyota')
)
列與欄位的組合選取:精準定位
現在您已經瞭解如何使用 select() 方法選取欄位,以及如何使用 filter() 方法選取 Polars DataFrame 中的列,接下來將說明如何將它們連結在一起以選取特定的列和欄位。
例如,若要取得 Toyota 的所有車款,可以連結 filter() 和 select() 方法:
df.filter(
pl.col('Company') == 'Toyota'
).select(
'Model'
)
若要選取多個欄位,只需使用列表包含欄位名稱:
df.filter(
pl.col('Company') == 'Toyota'
).select(
['Model','Year']
)
總結來說,Polars 提供了多種靈活與高效的方式來選取和篩選 DataFrame 中的資料。透過掌握這些方法,可以更有效地處理和分析大型資料集。玄貓建議多加練習,以便在實際應用中靈活運用這些技巧。