dbplyr: SQL ผ่านไวยากรณ์ dplyr
เขียนโค้ด dplyr ที่แปลเป็น SQL และทำงานบนฐานข้อมูล
dbplyr: SQL ผ่านไวยากรณ์ dplyr เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
dbplyr คืออะไร
dbplyr คือแพ็กเกจ R ที่แปลงกริยา dplyr เป็น SQL โดยอัตโนมัติ แทนที่จะเขียน SQL โดยตรง คุณสามารถเขียนโค้ด dplyr ที่คุ้นเคย แล้ว dbplyr จะแปลงโค้ดเป็นรูปแบบ SQL ที่ถูกต้องสำหรับระบบฐานข้อมูลของคุณ คำสั่งจะทำงาน ในฐานข้อมูล ไม่ใช่ในหน่วยความจำของ R
# install.packages(c('dbplyr', 'DBI', 'RSQLite'))
library(DBI)
library(dbplyr)
library(dplyr)
# dbplyr sits between dplyr and your database:
# Your dplyr code -> dbplyr -> SQL -> Database -> result
# Supported backends: PostgreSQL, MySQL, SQLite,
# SQL Server, BigQuery, Snowflake, ...
cat('dbplyr translates dplyr to SQL')การเชื่อมต่อกับฐานข้อมูล
dbplyr ทำงานบนการเชื่อมต่อ DBI คุณสร้างการเชื่อมต่อด้วย DBI::dbConnect() โดยใช้แพ็กเกจไดรเวอร์ที่เหมาะสม จากนั้นส่งออบเจ็กต์การเชื่อมต่อนั้นให้ฟังก์ชันของ dbplyr
library(DBI)
library(dplyr)
library(dbplyr)
# SQLite example (no server needed — great for demos)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
# Write a test table to the in-memory database
copy_to(con, nycflights13::flights, 'flights',
temporary = FALSE, overwrite = TRUE)
# PostgreSQL example (real server):
# con <- dbConnect(
# RPostgres::Postgres(),
# host = 'db.example.com',
# dbname = 'analytics',
# user = Sys.getenv('DB_USER'),
# password = Sys.getenv('DB_PASS')
# )
cat('Connected to database')tbl() — อ้างอิงตารางฐานข้อมูล
tbl(con, 'table_name') สร้างการอ้างอิงแบบประเมินภายหลังไปยังตารางฐานข้อมูล ขณะนี้ยังไม่มีการดึงข้อมูล คุณจะได้รับเพียงตัวชี้ไปยังข้อมูลเท่านั้น จากนั้นสามารถต่อกริยา dplyr เข้าด้วยกันได้ และ dbplyr จะค่อย ๆ สร้างคำสั่ง SQL เพิ่มขึ้น
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
mtcars_df <- mtcars
dbWriteTable(con, 'cars', mtcars_df)
# Create a lazy table reference
cars_tbl <- tbl(con, 'cars')
# Printing shows top rows and indicates it is a database source
print(cars_tbl)
# Source: table<cars> [?? x 11]
# Database: sqlite 3.x [:memory:]
cat('tbl() = lazy reference, no data fetched yet')การใช้ filter() กับตารางฐานข้อมูล
คุณสามารถต่อ filter() เข้ากับการอ้างอิง tbl() ได้เช่นเดียวกับการใช้กับ data frame ภายในเครื่อง dbplyr จะแปลงคำสั่งนี้เป็นส่วนคำสั่ง SQL WHERE การกรองจะเกิดขึ้นในฐานข้อมูล โดยจะส่งเฉพาะแถวที่ตรงเงื่อนไขไปยัง R
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'cars', mtcars)
cars_tbl <- tbl(con, 'cars')
# Filter in the database (generates WHERE clause)
high_mpg <- cars_tbl |>
filter(mpg > 25, cyl == 4)
# Still lazy! No data fetched yet.
cat('Class:', class(high_mpg)[1], '\n')
# Collect to pull data into R:
result <- collect(high_mpg)
cat('Rows matching filter:', nrow(result))การใช้ select() และ mutate()
select() สอดคล้องกับ SQL SELECT ส่วน mutate() สอดคล้องกับคอลัมน์ที่คำนวณขึ้นในส่วนคำสั่ง SELECT dbplyr จัดการการแปลงให้ รวมถึงนิพจน์ R ทั่วไปหลายรายการที่มีรูปแบบเทียบเท่าใน SQL
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'cars', mtcars)
cars_tbl <- tbl(con, 'cars')
# Select specific columns + add a computed column
result <- cars_tbl |>
filter(am == 1) |> # manual transmission
select(mpg, cyl, hp, wt) |> # pick columns
mutate(wt_kg = wt * 453.592) # add computed column
# Pull into R
df <- collect(result)
cat('Columns:', names(df), '\n')
cat('Rows:', nrow(df))group_by() และ summarise() — การรวมข้อมูล
group_by() และ summarise() จะแปลงเป็น SQL GROUP BY พร้อมฟังก์ชันรวมค่า ทำให้คุณคำนวณข้อมูลสรุปในฐานข้อมูลได้โดยไม่ต้องดึงทุกแถวมายัง R ก่อน ซึ่งสำคัญมากสำหรับตารางขนาดใหญ่
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'cars', mtcars)
cars_tbl <- tbl(con, 'cars')
# Aggregate in the database
summary_tbl <- cars_tbl |>
group_by(cyl) |>
summarise(
avg_mpg = mean(mpg, na.rm = TRUE),
max_hp = max(hp),
n_models = n()
)
result <- collect(summary_tbl)
print(result)show_query() — ตรวจสอบ SQL ที่สร้างขึ้น
show_query() แสดง SQL ที่ dbplyr จะส่งไปยังฐานข้อมูล ฟังก์ชันนี้มีประโยชน์อย่างยิ่งสำหรับการแก้ไขข้อผิดพลาด การปรับประสิทธิภาพ และการเรียนรู้ SQL จากการดูว่าโค้ด dplyr ของคุณถูกแปลงอย่างไร
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'cars', mtcars)
cars_tbl <- tbl(con, 'cars')
# Build a query
q <- cars_tbl |>
filter(mpg > 20) |>
group_by(cyl) |>
summarise(avg_mpg = mean(mpg, na.rm = TRUE))
# See the SQL dbplyr generated:
show_query(q)
# <SQL>
# SELECT cyl, AVG(mpg) AS avg_mpg
# FROM cars
# WHERE mpg > 20.0
# GROUP BY cylcollect() — ดึงข้อมูลเข้าสู่ R
collect() ประมวลผลคำสั่งแบบประเมินภายหลังและดึงผลลัพธ์มาเป็น data frame ของ R ในเครื่อง (tibble) จนกว่าคุณจะเรียกใช้ collect() จะยังไม่มีการส่งข้อมูลจากฐานข้อมูลมายัง R การดำเนินการทั้งหมดจะถูกแปลงเป็น SQL และทำงานบนเซิร์ฟเวอร์
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'cars', mtcars)
cars_tbl <- tbl(con, 'cars')
# Build up a lazy query chain
lazy_q <- cars_tbl |>
filter(hp > 100) |>
select(mpg, hp, cyl) |>
arrange(desc(hp))
# Nothing fetched yet
cat('Is lazy?', inherits(lazy_q, 'tbl_sql'), '\n')
# NOW pull data into R
local_df <- collect(lazy_q)
cat('Class after collect:', class(local_df)[1], '\n')
cat('Rows:', nrow(local_df))copy_to() — ส่ง data frame ภายในเครื่องไปยังฐานข้อมูล
copy_to() เขียน data frame ของ R ในเครื่องลงฐานข้อมูลเป็นตาราง ซึ่งโดยปกติจะเป็นตารางชั่วคราว ฟังก์ชันนี้มีประโยชน์สำหรับการเชื่อมตารางค้นหาข้อมูลในเครื่องกับตารางระยะไกลขนาดใหญ่ หรือใช้สำหรับการทดสอบโดยไม่ต้องมีฐานข้อมูลที่เตรียมไว้ล่วงหน้า
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
# Push a local data frame into the database
local_df <- data.frame(
cyl = c(4, 6, 8),
category = c('efficient', 'balanced', 'powerful')
)
# copy_to creates a temporary table in the DB
copy_to(con, local_df, name = 'cyl_labels', temporary = TRUE)
# Now reference it with tbl()
labels_tbl <- tbl(con, 'cyl_labels')
cat('Rows in DB table:', collect(labels_tbl) |> nrow())การเชื่อมตารางฐานข้อมูล
คุณสามารถเชื่อมการอ้างอิง tbl() สองรายการเข้าด้วยกันโดยใช้ฟังก์ชัน left_join(), inner_join() และฟังก์ชันอื่น ๆ จาก dplyr เช่นเดียวกัน dbplyr จะแปลงฟังก์ชันเหล่านี้เป็นส่วนคำสั่ง SQL JOIN และการเชื่อมจะทำงานในฐานข้อมูล
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'cars', mtcars)
copy_to(con, data.frame(cyl = c(4,6,8),
label = c('four','six','eight')),
'cyl_ref', temporary = TRUE)
cars_tbl <- tbl(con, 'cars')
labels_tbl <- tbl(con, 'cyl_ref')
# Join in the database
joined <- left_join(cars_tbl, labels_tbl, by = 'cyl') |>
select(mpg, cyl, label, hp)
show_query(joined) # See the SQL JOIN
result <- collect(joined)
cat('Joined rows:', nrow(result))กรณีที่ไม่ควรใช้ dbplyr
dbplyr ไม่สามารถแปลงนิพจน์ R ได้ทุกแบบเป็น SQL ฟังก์ชันกำหนดเองที่ซับซ้อน การจัดการวันที่ด้วย R พื้นฐาน หรือฟังก์ชันทางสถิติเฉพาะของ R อาจไม่มีรูปแบบเทียบเท่าใน SQL ให้ใช้ collect() ก่อนเพื่อดึงข้อมูลเข้าสู่ R จากนั้นจึงดำเนินการเฉพาะของ R ในเครื่อง
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'cars', mtcars)
cars_tbl <- tbl(con, 'cars')
# Do as much as possible in the database:
prepped <- cars_tbl |>
filter(mpg > 15) |>
select(mpg, hp, cyl) |>
collect() # <- pull only what you need
# Now apply R-only operations locally:
cor_result <- cor(prepped$mpg, prepped$hp)
cat('Correlation mpg~hp:', round(cor_result, 3))
# Rule: filter and aggregate in DB, model in Rตรวจสอบความเข้าใจอย่างรวดเร็ว
หลังจากสร้างชุดคำสั่ง dplyr ต่อเนื่องบนการอ้างอิงฐานข้อมูล tbl() แล้ว ฟังก์ชันใดจะประมวลผลคำสั่งและส่งผลลัพธ์กลับมาเป็น data frame ของ R ในเครื่อง
dbplyr — ประเด็นสำคัญ
dbplyr ช่วยให้คุณสืบค้นฐานข้อมูลด้วยรูปแบบไวยากรณ์ของ dplyr โดยไม่ต้องใช้ SQL:
tbl(con, 'table')— การอ้างอิงแบบประเมินภายหลังไปยังตารางฐานข้อมูลfilter(),select(),mutate()— แปลงเป็นส่วนคำสั่ง SQLgroup_by() |> summarise()— แปลงเป็น SQLGROUP BYshow_query()— ตรวจสอบ SQL ที่สร้างขึ้น เหมาะอย่างยิ่งสำหรับการเรียนรู้collect()— ประมวลผลคำสั่งและดึงข้อมูลเข้าสู่ Rcopy_to()— ส่ง data frame ในเครื่องไปยังฐานข้อมูล- การเชื่อมตารางก็ทำได้เช่นกัน:
left_join(),inner_join()และอื่น ๆ - กรองและรวมข้อมูลในฐานข้อมูล ส่วน R ให้ใช้เฉพาะงานที่ SQL ทำไม่ได้
# Complete dbplyr workflow example:
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'sales', data.frame(
region = c('North','South','North','East','South'),
revenue = c(100, 200, 150, 300, 250),
year = c(2023, 2023, 2024, 2024, 2024)
))
tbl(con, 'sales') |>
filter(year == 2024) |>
group_by(region) |>
summarise(total = sum(revenue, na.rm = TRUE)) |>
arrange(desc(total)) |>
collect() |>
print()คำถามที่พบบ่อย
บทเรียน “dbplyr: SQL ผ่านไวยากรณ์ dplyr” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “dbplyr: SQL ผ่านไวยากรณ์ dplyr” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “dbplyr: SQL ผ่านไวยากรณ์ dplyr”
เขียนโค้ด dplyr ที่แปลเป็น SQL และทำงานบนฐานข้อมูล คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “dbplyr: SQL ผ่านไวยากรณ์ dplyr” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน DBI และ RSQLite
- การเชื่อมต่อ PostgreSQL และ MySQL
- dbplyr: SQL ผ่านไวยากรณ์ dplyr
- คำสั่งสืบค้นแบบกำหนดพารามิเตอร์และธุรกรรม