用R语言做数据分析时,常常需要从多种数据源取数据,其中数据库是非常常见的数据源。用R操作MySQL数据库,可以说是数据分析师必备的技能了,本文介绍RMySQL包,可以在R语言中对数据库进行增删改查的操作。
install.packages('RMySQL')
用dbConnect
函数创建连接,驱动类型设置为MySQL()
,用户名user
、密码password
、主机host
、端口port
、数据库dbname
这些参数需要根据实际情况修改,其中端口port
默认值是3306。
# 加载包
library(RMySQL)
# 创建连接
con <- dbConnect(MySQL(),
user="root",
password="xxx",
host="192.168.1.244",
port=3306,
dbname="test")
还可以通过一些命令,查看连接的相关信息。
# 连接概述
summary(con)
##
## User: root
## Host: 192.168.1.244
## Dbname: test
## Connection type: 192.168.1.244 via TCP/IP
##
## Results:
# 连接详情
dbGetInfo(con)
## $host
## [1] "192.168.1.244"
##
## $user
## [1] "root"
##
## $dbname
## [1] "test"
##
## $conType
## [1] "192.168.1.244 via TCP/IP"
##
## $serverVersion
## [1] "5.7.23"
##
## $protocolVersion
## [1] 10
##
## $threadId
## [1] 465075
##
## $rsId
## list()
# 列出连接下所有表
dbListTables(con)
## [1] "city" "result"
## [3] "t_json" "tb_newChiller"
# 方法1:字符向量
dbCreateTable(con,'table1',fields =c("id"='int',"value"="float"))
# 方法2:数据框
dbCreateTable(con,'table2',fields = mtcars)
注意点:
fields
参数时,用命名的字符向量(名字为字段名,值为字段数据类型)或数据框表示运行dbSendQuery
函数,调用sql语句创建表,该函数返回一个RMySQLResult类。该方法可以重复运行,不会报错。
# 方法3:sql语句
dbSendQuery(con,'create table if not exists table3(id int,value float)')
##
# 先设置编码(windows)
dbSendQuery(con,'set names gbk')
##
# 读取完整表
dbReadTable(con,'city')
## id name city_code
## 1 1 北京 000001
## 2 4 南京 000002
## 3 7 广州 000003
## 4 10 上海 000004
## 5 11 深圳 000005
## 6 13 苏州 000006
注意点:
gbk
,为Linux则需要设置为utf8
通过运行dbGetQuery
或dbSendQuery
函数,调用sql语句读取表。
dbGetQuery
函数运行sql语句,返回data.frame。可以在sql语句中编写筛选语句。
# 读取完整表
dbGetQuery(con,'select * from city')
## id name city_code
## 1 1 北京 000001
## 2 4 南京 000002
## 3 7 广州 000003
## 4 10 上海 000004
## 5 11 深圳 000005
## 6 13 苏州 000006
# 读取筛选的表
dbGetQuery(con,'select id,name from city where id > 10')
## id name
## 1 11 深圳
## 2 13 苏州
dbSendQuery
函数运行sql语句,返回MySQLResult类。对该类使用dbFetch
函数,可以筛选行,返回data.frame。用完后需要用dbClearResult
函数清理结果。
# 筛选前3行数据
res <- dbSendQuery(con,'select * from city')
dbFetch(res,3)
## id name city_code
## 1 1 北京 000001
## 2 4 南京 000002
## 3 7 广州 000003
dbClearResult(res)
## [1] TRUE
# 写入表
dbWriteTable(con,"iris",iris,row.names=FALSE,append=TRUE)
## [1] TRUE
注意点:
参数设置 | 解释 |
---|---|
append=TRUE | 追加写入,新数据在原数据行末添加 |
overwrite=TRUE | 覆盖写入,新数据覆盖原数据 |
row.names=FALSE | 不写入数据框的行名 |
append
和overwrite
两个参数不能同时设置为TRUE
。运行dbSendStatment
函数,调用sql语句插入数据。
dbSendStatement(con,'insert into table1 values(1,12)')
##
注意点:
用dbRemoveTable
函数删除表。
# 删除表
dbRemoveTable(con,'table1')
## [1] TRUE
dbRemoveTable(con,'table2')
## [1] TRUE
dbRemoveTable(con,'table3')
## [1] TRUE
dbRemoveTable(con,'iris')
## [1] TRUE
完成所有的操作后,需要关闭连接。
# 关闭连接
dbDisconnect(con)
## [1] TRUE