1. Membuat koneksi database
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.

  1. Membuat tabel
#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.

  1. mengisi data
#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.

  1. menampilkan tabel
# 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.

  1. mengurutkan tabel
# 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.

  1. menampilkan data transaksi
# 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.

  1. memperbarui data
# 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.

  1. mengapus data
# 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.

  1. menampilkan data gabungan
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.

  1. menggunakan alias dan fungsi agregat
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.

  1. Laporan akhir
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.