0Pricing
R Academy · درس

dbplyr: ‏SQL عبر صيغة dplyr

اكتب شيفرة dplyr تُترجم إلى SQL وتُشغّل على قاعدة البيانات.

dbplyr: ‏SQL عبر صيغة dplyr درس مجاني في R Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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() كما تفعل مع إطار بيانات محلي. تترجم 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() إلى GROUP BY في SQL مع دوال التجميع. يتيح لك ذلك حساب الملخصات في قاعدة البيانات من دون جلب جميع الصفوف إلى 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 cyl

‏collect() — جلب البيانات إلى R

تنفّذ collect() الاستعلام الكسول وتسترجع النتائج إلى إطار بيانات 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() — دفع إطار بيانات محلي إلى قاعدة البيانات

تكتب copy_to() إطار بيانات 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() باستخدام الدوال نفسها من dplyr، مثل left_join() وinner_join() وغيرها. تترجم 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. فقد لا تتوفر مكافئات SQL للدوال المخصصة المعقدة أو لمعالجة التواريخ في R الأساسي أو للدوال الإحصائية الخاصة بـR. استخدم 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()، ما الدالة التي تنفّذ الاستعلام وتعيد النتائج إلى إطار بيانات R محلي؟

‏dbplyr — أهم النقاط

تتيح لك dbplyr الاستعلام عن قواعد البيانات باستخدام صياغة dplyr — من دون الحاجة إلى SQL:

  • tbl(con, 'table') — إشارة كسولة إلى جدول في قاعدة البيانات
  • filter() وselect() وmutate() — تُترجم إلى عبارات SQL
  • group_by() |> summarise() — تتحول إلى GROUP BY في SQL
  • show_query() — فحص SQL المُنشأ (مفيد جدًا للتعلّم)
  • collect() — تنفيذ الاستعلام وجلب البيانات إلى R
  • copy_to() — دفع إطار بيانات محلي إلى قاعدة البيانات
  • تعمل عمليات الضم أيضًا: 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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «dbplyr: ‏SQL عبر صيغة dplyr»؟

اكتب شيفرة dplyr تُترجم إلى SQL وتُشغّل على قاعدة البيانات. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «dbplyr: ‏SQL عبر صيغة dplyr»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات DBI وRSQLite
  2. الاتصال بـ PostgreSQL وMySQL
  3. dbplyr: ‏SQL عبر صيغة dplyr
  4. الاستعلامات ذات المعاملات والمعاملات الذرّية
← العودة إلى R Academy