library(DBI)
## Warning: package 'DBI' was built under R version 4.5.2
library(RSQLite)
## Warning: package 'RSQLite' was built under R version 4.5.2
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.2
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
con <- dbConnect(SQLite(), ":memory:")
Pada langkah ini dilakukan proses persiapan awal sebelum membangun sistem basis data asrama. Paket DBI, RSQLite, dan dplyr digunakan untuk menghubungkan R dengan database SQLite dan memudahkan manipulasi data. Selanjutnya dibuat koneksi ke database SQLite yang disimpan di memori. Output [1] 0 menandakan perintah berhasil dijalankan tanpa error.
#Buat struktur tabel
dbExecute(con, "
CREATE TABLE penghuni (
id_penghuni INTEGER PRIMARY KEY,
nama TEXT,
nim TEXT,
alamat TEXT
);
")
## [1] 0
dbExecute(con, "
CREATE TABLE kamar (
id_kamar INTEGER PRIMARY KEY,
nomor_kamar TEXT,
kapasitas INTEGER,
id_penghuni INTEGER,
FOREIGN KEY (id_penghuni) REFERENCES penghuni(id_penghuni)
);
")
## [1] 0
dbExecute(con, "
CREATE TABLE fasilitas (
id_fasilitas INTEGER PRIMARY KEY,
nama_fasilitas TEXT
);
")
## [1] 0
dbExecute(con, "
CREATE TABLE aktivitas (
id_aktivitas INTEGER PRIMARY KEY,
nama_aktivitas TEXT
);
")
## [1] 0
dbExecute(con, "
CREATE TABLE transaksi_asrama (
id_transaksi INTEGER PRIMARY KEY,
id_penghuni INTEGER,
id_kamar INTEGER,
id_fasilitas INTEGER,
id_aktivitas INTEGER,
tanggal TEXT,
FOREIGN KEY (id_penghuni) REFERENCES penghuni(id_penghuni),
FOREIGN KEY (id_kamar) REFERENCES kamar(id_kamar),
FOREIGN KEY (id_fasilitas) REFERENCES fasilitas(id_fasilitas),
FOREIGN KEY (id_aktivitas) REFERENCES aktivitas(id_aktivitas)
);
")
## [1] 0
Membuat lima tabel utama untuk merepresentasikan sistem pengelolaan asrama, yaitu penghuni, kamar, fasilitas, aktivitas, dan transaksi_asrama. Tabel menggunakan primary key sebagai penanda unik, dan beberapa tabel memiliki foreign key untuk menjaga relasi antar tabel. Output [1] 0 menandakan setiap perintah berhasil dijalankan.
#Masukkan data awal
dbExecute(con, "
INSERT INTO penghuni VALUES
(1, 'Ahmad Mursalim', 'F1A224001', 'Jakarta'),
(2, 'Nur Fahira', 'F1A224002', 'Surabaya'),
(3, 'Ajhy Pahmucy', 'F1A224003', 'Bandung');
")
## [1] 3
dbExecute(con, "
INSERT INTO kamar VALUES
(1, 'A101', 2, 1),
(2, 'A102', 2, 2),
(3, 'B201', 3, 3);
")
## [1] 3
dbExecute(con, "
INSERT INTO fasilitas VALUES
(1, 'Meja'),
(2, 'Lemari'),
(3, 'AC');
")
## [1] 3
dbExecute(con, "
INSERT INTO aktivitas VALUES
(1, 'Peminjaman Fasilitas'),
(2, 'Laporan Kerusakan'),
(3, 'Kegiatan Rutin');
")
## [1] 3
dbExecute(con, "
INSERT INTO transaksi_asrama VALUES
(1, 1, 1, 1, 1, '2025-06-01'),
(2, 2, 2, 2, 2, '2025-06-03'),
(3, 3, 3, 3, 3, '2025-06-05');
")
## [1] 3
Pada langkah ini, setiap tabel diisi dengan data awal. Tabel penghuni berisi tiga mahasiswa: Ahmad Mursalim, Nur Fahira, dan Ajhy Pahmucy. Tabel kamar mencatat kamar masing-masing, fasilitas berisi Meja, Lemari, dan AC, dan aktivitas mencatat Peminjaman Fasilitas, Laporan Kerusakan, dan Kegiatan Rutin. Tabel transaksi_asrama mencatat ketiga aktivitas tersebut lengkap dengan kamar, fasilitas, jenis aktivitas, dan tanggal.
# Tampilkan daftar tabel
dbListTables(con)
## [1] "aktivitas" "fasilitas" "kamar" "penghuni"
## [5] "transaksi_asrama"
# Tampilkan seluruh isi tabel transaksi_asrama
dbGetQuery(con, "SELECT * FROM transaksi_asrama")
## id_transaksi id_penghuni id_kamar id_fasilitas id_aktivitas tanggal
## 1 1 1 1 1 1 2025-06-01
## 2 2 2 2 2 2 2025-06-03
## 3 3 3 3 3 3 2025-06-05
Perintah dbListTables(con) menampilkan semua tabel di database, sedangkan dbGetQuery(con, “SELECT * FROM transaksi_asrama”) menampilkan seluruh data aktivitas penghuni, termasuk kamar, fasilitas, jenis aktivitas, dan tanggal pelaksanaan. Output menunjukkan ketiga aktivitas berhasil dicatat dengan lengkap.
# Urutkan transaksi_asrama berdasarkan tanggal dari yang paling awal ke terbaru (ASC)
dbGetQuery(con, "
SELECT * FROM transaksi_asrama
ORDER BY tanggal ASC;
")
## id_transaksi id_penghuni id_kamar id_fasilitas id_aktivitas tanggal
## 1 1 1 1 1 1 2025-06-01
## 2 2 2 2 2 2 2025-06-03
## 3 3 3 3 3 3 2025-06-05
# Urutkan transaksi_asrama berdasarkan tanggal dari terbaru ke paling awal (DESC)
dbGetQuery(con, "
SELECT * FROM transaksi_asrama
ORDER BY tanggal DESC;
")
## id_transaksi id_penghuni id_kamar id_fasilitas id_aktivitas tanggal
## 1 3 3 3 3 3 2025-06-05
## 2 2 2 2 2 2 2025-06-03
## 3 1 1 1 1 1 2025-06-01
Pengurutan tabel digunakan untuk menampilkan aktivitas penghuni berdasarkan tanggal pelaksanaan, baik dari yang paling awal ke terbaru maupun sebaliknya, sehingga memudahkan pemantauan urutan kegiatan di asrama.
# Menampilkan transaksi_asrama untuk penghuni tertentu (misal id_penghuni = 1)
dbGetQuery(con, "
SELECT * FROM transaksi_asrama
WHERE id_penghuni = 1
ORDER BY tanggal ASC;
")
## id_transaksi id_penghuni id_kamar id_fasilitas id_aktivitas tanggal
## 1 1 1 1 1 1 2025-06-01
Perintah ini menampilkan aktivitas tertentu berdasarkan kriteria, misalnya untuk penghuni dengan ID 1. Hasil ditampilkan secara terurut berdasarkan tanggal, sehingga memudahkan pemantauan kegiatan spesifik di asrama.
# Memperbarui tanggal aktivitas untuk id_transaksi = 2
dbExecute(con, "
UPDATE transaksi_asrama
SET tanggal = '2025-06-04'
WHERE id_transaksi = 2;
")
## [1] 1
# Tampilkan hasil update
dbGetQuery(con, "SELECT * FROM transaksi_asrama WHERE id_transaksi = 2")
## id_transaksi id_penghuni id_kamar id_fasilitas id_aktivitas tanggal
## 1 2 2 2 2 2 2025-06-04
Perintah UPDATE digunakan untuk memperbarui data pada tabel transaksi_asrama, misalnya mengubah tanggal pelaksanaan suatu aktivitas. Output menunjukkan bahwa perubahan berhasil diterapkan pada aktivitas penghuni dengan ID transaksi 2, sehingga data di database tetap akurat dan up-to-date.
# Hapus aktivitas penghuni dengan id_transaksi = 3
dbExecute(con, "
DELETE FROM transaksi_asrama
WHERE id_transaksi = 3;
")
## [1] 1
# Tampilkan tabel setelah penghapusan
dbGetQuery(con, "SELECT * FROM transaksi_asrama")
## id_transaksi id_penghuni id_kamar id_fasilitas id_aktivitas tanggal
## 1 1 1 1 1 1 2025-06-01
## 2 2 2 2 2 2 2025-06-04
Perintah DELETE digunakan untuk menghapus data pada tabel transaksi_asrama. Dalam di atas, aktivitas penghuni dengan ID transaksi 3 dihapus karena tidak lagi berlaku. Setelah penghapusan, tabel hanya berisi aktivitas yang valid, sehingga database tetap teratur dan mudah dikelola.
dbGetQuery(con, "
SELECT ta.id_transaksi, p.nama AS penghuni, k.nomor_kamar AS kamar,
f.nama_fasilitas AS fasilitas, a.nama_aktivitas AS aktivitas,
ta.tanggal
FROM transaksi_asrama ta
INNER JOIN penghuni p ON ta.id_penghuni = p.id_penghuni
INNER JOIN kamar k ON ta.id_kamar = k.id_kamar
INNER JOIN fasilitas f ON ta.id_fasilitas = f.id_fasilitas
INNER JOIN aktivitas a ON ta.id_aktivitas = a.id_aktivitas;
")
## id_transaksi penghuni kamar fasilitas aktivitas tanggal
## 1 1 Ahmad Mursalim A101 Meja Peminjaman Fasilitas 2025-06-01
## 2 2 Nur Fahira A102 Lemari Laporan Kerusakan 2025-06-04
Perintah INNER JOIN digunakan untuk menampilkan data aktivitas penghuni secara lengkap dengan menggabungkan beberapa tabel sekaligus, seperti tabel penghuni, kamar, fasilitas, aktivitas, dan transaksi_asrama. Dengan cara ini, informasi setiap aktivitas dapat terlihat secara menyeluruh dalam satu tampilan, memudahkan pemantauan dan analisis kegiatan di asrama.
dbGetQuery(con, "
SELECT SUM(id_aktivitas) AS total_aktivitas,
AVG(id_aktivitas) AS rata_rata_aktivitas
FROM transaksi_asrama;
")
## total_aktivitas rata_rata_aktivitas
## 1 3 1.5
Fungsi agregat SUM digunakan untuk menghitung total aktivitas yang tercatat, sedangkan AVG menghitung rata-rata aktivitas per transaksi. Penggunaan alias membuat hasil lebih jelas dan mudah dibaca.
query_laporan <- "
SELECT ta.id_transaksi, p.nama AS penghuni, k.nomor_kamar AS kamar,
f.nama_fasilitas AS fasilitas, a.nama_aktivitas AS aktivitas,
ta.tanggal
FROM transaksi_asrama ta
JOIN penghuni p ON ta.id_penghuni = p.id_penghuni
JOIN kamar k ON ta.id_kamar = k.id_kamar
JOIN fasilitas f ON ta.id_fasilitas = f.id_fasilitas
JOIN aktivitas a ON ta.id_aktivitas = a.id_aktivitas;
"
laporan <- dbGetQuery(con, query_laporan)
print(laporan)
## id_transaksi penghuni kamar fasilitas aktivitas tanggal
## 1 1 Ahmad Mursalim A101 Meja Peminjaman Fasilitas 2025-06-01
## 2 2 Nur Fahira A102 Lemari Laporan Kerusakan 2025-06-04
Setelah beberapa data dihapus atau diperbarui, tabel transaksi_asrama hanya menampilkan aktivitas yang aktif. Laporan ini memperlihatkan informasi lengkap setiap aktivitas penghuni, termasuk nama penghuni, kamar, fasilitas, jenis aktivitas, dan tanggal pelaksanaan, sehingga memudahkan pemantauan kegiatan di asrama.