Sql est le principal langage utilisé pour interroger ou modifier une base de données.
Une connaissance minimale de ce langage est nécessaire pour extraire
depuis R, par exemple via la librairie RODBC, des informations stockées
dans une base de données.
Le langage Sql peut également être utilisé, via la librairie sqldf,
pour manipuler des dataframes R.
# le jeu de données
etud = data.frame(nom=c("Jim","Eve","Max"),sexe=c("h","f","h"),
age=c(21,19,NA))
library(sqldf)
# quelques requêtes
hommes = sqldf("select nom,age from etud where sexe='h'")
# ou hommes = etud[etud$sexe=="h",c("nom","age")]
print(hommes)
sqldf("select * from etud where age is not null")
# ou etud[!is.na(etud$age),]
sqldf("select * from etud where age is not null order by age")
# on trie par age
Quelques statistiques élémentaires peuvent être calculées :
moyenne (avg), somme (sum), minimum (min), comptage (count)...
# moyennes : age moyen, age moyen des hommes
sqldf("select avg(age) from etud")
sqldf("select avg(age) from etud where sexe='h'")
# comptage : nombre d'hommes, de personnes entre 18 et 20 ans
sqldf("select count(*) from etud where sexe='h'")
sqldf("select count(*) from etud where age>=18 and age<=20")
# statistiques par groupe (ici par sexe)
sqldf("select avg(age),sexe from etud group by sexe")
sqldf("select count(*),sexe from etud group by sexe")
sqldf("select count(*) as effectif,sexe from etud group by sexe")
# on renomme la colonne 1 en effectif
Un intérêt majeur de Sql est de pouvoir effectuer des requêtes
portant sur plusieurs tables.
Pour illustrer ceci, nous introduisons un autre dataframe (notes).
notes = data.frame(nom=c("Jim","Max"),math=c(12,15))
# jointure INTERNE sur le nom
jointure = sqldf("select etud.nom,sexe,age,math
from etud INNER JOIN notes ON etud.nom=notes.nom")
print(jointure)
# jointure EXTERNE sur le nom
jointure = sqldf("select etud.nom,sexe,age,math
from etud LEFT OUTER JOIN notes ON etud.nom=notes.nom")
print(jointure)
Lorsqu'on affiche le résultat de la jointure interne des deux tables, l'étudiante Eve
n'apparaît pas car elle n'a pas été notée.
Si on souhaite que cela soit le cas, il faut faire une
jointure externe.