R Academy · 강의

dbplyr: dplyr 구문으로 SQL 사용하기

SQL로 변환되어 데이터베이스에서 실행되는 dplyr 코드를 작성합니다.

레슨 3/413개 단계

dbplyr: dplyr 구문으로 SQL 사용하기은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

dbplyr란 무엇입니까?

dbplyr는 dplyr 동사를 SQL로 자동 변환하는 R 패키지입니다. 원시 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() 적용하기

로컬 데이터 프레임에서 사용하는 것처럼 tbl() 참조에 filter()를 연결할 수 있습니다. 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는 SQL에 대응하는 여러 일반적인 R 표현식을 포함하여 변환을 처리합니다.

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()는 dbplyr가 데이터베이스로 전송할 SQL을 출력합니다. 이를 통해 디버깅, 성능 조정, dplyr 코드가 어떻게 변환되는지 확인하며 SQL을 학습하는 데 큰 도움이 됩니다.

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() — 로컬 데이터 프레임을 DB로 전송하기

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())

데이터베이스 테이블 조인하기

dplyr의 left_join(), inner_join() 등의 함수를 사용하여 두 개의 tbl() 참조를 조인할 수 있습니다. 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로 변환할 수는 없습니다. 복잡한 사용자 지정 함수, base 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

빠른 확인

tbl() 데이터베이스 참조에 dplyr 동사 체인을 구성한 후, 쿼리를 실행하고 결과를 로컬 R 데이터 프레임으로 반환하는 함수는 무엇입니까?

dbplyr — 핵심 요점

dbplyr를 사용하면 SQL을 직접 작성하지 않고 dplyr 구문으로 데이터베이스를 쿼리할 수 있습니다:

  • tbl(con, 'table') — DB 테이블에 대한 지연 참조
  • filter(), select(), mutate() — SQL 절로 변환됩니다
  • group_by() |> summarise() — SQL GROUP BY가 됩니다
  • show_query() — 생성된 SQL을 확인합니다(학습에 매우 유용)
  • collect() — 쿼리를 실행하고 데이터를 R로 가져옵니다
  • copy_to() — 로컬 데이터 프레임을 데이터베이스로 전송합니다
  • 조인도 사용할 수 있습니다: left_join(), inner_join() 등
  • DB에서 필터링과 집계를 수행하고, SQL로 할 수 없는 작업에만 R을 사용하십시오
# 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()
무료로 시작

AI 튜터와 함께 R을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
43
레슨
159

자주 묻는 질문

“dbplyr: dplyr 구문으로 SQL 사용하기” 강의는 무료인가요?

네 — “dbplyr: dplyr 구문으로 SQL 사용하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“dbplyr: dplyr 구문으로 SQL 사용하기”에서 뭘 배우나요?

SQL로 변환되어 데이터베이스에서 실행되는 dplyr 코드를 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“dbplyr: dplyr 구문으로 SQL 사용하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. DBI와 RSQLite 기초
  2. PostgreSQL 및 MySQL 연결하기
  3. dbplyr: dplyr 구문으로 SQL 사용하기
  4. 매개변수화된 쿼리와 트랜잭션
← R Academy(으)로 돌아가기