BAB I

1.1 Latar Belakang

Dalam industri penyewaan mobil berbasis online, pengelolaan data secara akurat, real-time, dan terstruktur sangat penting untuk mendukung peminjaman kendaraan, pengaturan jadwal sewa, serta pelayanan pelanggan yang cepat. Sistem basis data terintegrasi mempermudah pencatatan pelanggan, mobil, transaksi, serta pegawai yang terlibat.

1.2 Tujuan

  1. Merancang struktur basis data penyewaan mobil online dengan lima entitas utama.
  2. Mengimplementasikan perintah SQL (CREATE, INSERT, SELECT, UPDATE, DELETE, JOIN) untuk mengelola data.
  3. Menyajikan laporan transaksi akhir yang lengkap.

1.3 Ruang Lingkup

Studi kasus ini hanya membahas fungsi dasar penyewaan mobil, tidak termasuk fitur keamanan, pembayaran otomatis, atau skala besar.

BAB II

2.1 Struktur Tabel dan Relasi Antar Entitas

Tabel utama: - Pelanggan: data pelanggan. - Mobil: data kendaraan. - Kategori Mobil: klasifikasi mobil. - Pegawai: staf yang menangani transaksi. - Penyewaan: catatan seluruh transaksi.

BAB III

3.1 Membuat Koneksi Database

## 3.1 Membuat Koneksi Database

``` r
if(!require(DBI)) install.packages("DBI")
## Loading required package: DBI
## Warning: package 'DBI' was built under R version 4.5.2
if(!require(RSQLite)) install.packages("RSQLite")
## Loading required package: RSQLite
## Warning: package 'RSQLite' was built under R version 4.5.2
if(!require(dplyr)) install.packages("dplyr")
## Loading required package: 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
library(DBI)
library(RSQLite)
library(dplyr)

con <- dbConnect(SQLite(), ":memory:")

Tahap awal dalam implementasi sistem basis data penyewaan mobil berbasis online adalah menyiapkan lingkungan pemrograman di R. Pada bagian ini dilakukan pemasangan sekaligus pemanggilan tiga package utama, yaitu DBI, RSQLite, dan dplyr. DBI digunakan sebagai interface standar untuk mengeksekusi perintah SQL dalam R. RSQLite memungkinkan kita membuat serta mengelola database SQLite langsung dari R. dplyr membantu mempermudah pengolahan dan manipulasi dataset. Setelah paket berhasil dimuat, dibuat koneksi ke database menggunakan dbConnect(). Pada contoh ini, database dibuat dalam bentuk database sementara (in-memory), tetapi dapat pula diarahkan untuk disimpan dalam file .sqlite sesuai kebutuhan implementasi. Output berupa [1] 0 menandakan bahwa perintah berhasil dijalankan tanpa menghasilkan baris keluaran karena fungsi tersebut bukanlah query pengambil data, melainkan inisialisasi koneksi yang tidak memerlukan return record seperti SELECT.

3.2 Membuat Tabel

# Membuat tabel pegawai
dbExecute(con, "
  CREATE TABLE pegawai (
    id_pegawai INTEGER PRIMARY KEY,
    nama_pegawai TEXT,
    jabatan TEXT
  );
")
## [1] 0
# Membuat tabel pelanggan
dbExecute(con, "
  CREATE TABLE pelanggan (
    id_pelanggan INTEGER PRIMARY KEY,
    nama TEXT,
    alamat TEXT,
    no_hp TEXT
  );
")
## [1] 0
# Membuat tabel kategori mobil
dbExecute(con, "
  CREATE TABLE kategori_mobil (
    id_kategori INTEGER PRIMARY KEY,
    nama_kategori TEXT
  );
")
## [1] 0
# Membuat tabel mobil
dbExecute(con, "
  CREATE TABLE mobil (
    id_mobil INTEGER PRIMARY KEY,
    id_kategori INTEGER,
    merk TEXT,
    plat_nomor TEXT,
    tahun INTEGER,
    status TEXT,
    FOREIGN KEY (id_kategori) REFERENCES kategori_mobil(id_kategori)
  );
")
## [1] 0
# Membuat tabel penyewaan
dbExecute(con, "
  CREATE TABLE penyewaan (
    id_sewa INTEGER PRIMARY KEY,
    id_pelanggan INTEGER,
    id_mobil INTEGER,
    id_pegawai INTEGER,
    tanggal_sewa TEXT,
    tanggal_kembali TEXT,
    total_biaya REAL,
    FOREIGN KEY (id_pelanggan) REFERENCES pelanggan(id_pelanggan),
    FOREIGN KEY (id_mobil) REFERENCES mobil(id_mobil),
    FOREIGN KEY (id_pegawai) REFERENCES pegawai(id_pegawai)
  );
")
## [1] 0

Pada tahap ini dibuat lima tabel utama yang mewakili sistem penyewaan mobil berbasis online, yaitu: pegawai, pelanggan, kategori_mobil, mobil, dan penyewaan. Setiap tabel memiliki primary key sebagai penanda unik data, sedangkan beberapa tabel lainnya dilengkapi dengan foreign key untuk membangun relasi antar entitas sesuai dengan desain ERD. Relasi tersebut memungkinkan sistem menghubungkan data pelanggan dengan mobil yang disewa serta pegawai yang menangani transaksi, sehingga seluruh aktivitas penyewaan dapat tercatat dan dilacak dengan terstruktur. Output [1] 0 pada masing-masing perintah menunjukkan bahwa proses CREATE TABLE berhasil dijalankan dan tidak terjadi kesalahan selama pembuatan struktur database.

3.3 Mengisi Data

# Data Pegawai
dbExecute(con, "
  INSERT INTO pegawai VALUES
    (1, 'Fahri Ramdhan', 'Admin'),
    (2, 'Salsa Nabila', 'Operasional'),
    (3, 'Yusuf Hidayat', 'Staff Gudang');
")
## [1] 3
# Data Pelanggan
dbExecute(con, "
  INSERT INTO pelanggan VALUES
    (1, 'Rama Pratama', 'Depok', '081223344556'),
    (2, 'Siti Aminah', 'Malang', '082177889900'),
    (3, 'Gilang Prasetyo', 'Semarang', '089612345678'),
    (4, 'Nadya Putri', 'Tangerang', '083298765432');
")
## [1] 4
# Data Kategori Mobil
dbExecute(con, "
  INSERT INTO kategori_mobil VALUES
    (1, 'Sedan'),
    (2, 'SUV'),
    (3, 'Hatchback'),
    (4, 'Luxury Car');
")
## [1] 4
# Data Mobil
dbExecute(con, "
  INSERT INTO mobil VALUES
    (201, 1, 'Toyota Camry', 'B 4521 WQ', 2021, 'Tersedia'),
    (202, 2, 'Mitsubishi Pajero Sport', 'D 7743 ZT', 2023, 'Tersedia'),
    (203, 3, 'Honda Jazz', 'F 8890 PL', 2020, 'Disewa'),
    (204, 4, 'Mercedes-Benz C300', 'L 9922 RE', 2022, 'Tersedia');
")
## [1] 4
# Data Transaksi Penyewaan
dbExecute(con, "
  INSERT INTO penyewaan VALUES
    (1, 2, 201, 1, '2025-07-01', '2025-07-03', 1800000),
    (2, 4, 203, 2, '2025-07-02', '2025-07-05', 2500000),
    (3, 1, 204, 3, '2025-07-04', '2025-07-07', 5200000),
    (4, 3, 202, 1, '2025-07-06', '2025-07-09', 3100000);
")
## [1] 4

Pada tahap ini, seluruh tabel yang telah dibuat sebelumnya diisi dengan data awal sebagai simulasi proses penyewaan mobil. Nilai [1] 3, [1] 4, dan seterusnya merupakan jumlah baris yang berhasil ditambahkan ke dalam masing-masing tabel melalui perintah INSERT INTO, yang menunjukkan bahwa proses input berjalan berhasil tanpa error. Tabel pegawai berisi 3 petugas yang bertanggung jawab dalam operasional penyewaan mobil. Tabel pelanggan berisi 4 penyewa yang siap melakukan transaksi sewa kendaraan. Tabel kategori_mobil memuat 4 kategori kendaraan, yaitu Sedan, SUV, Hatchback, dan Luxury Car. Tabel mobil berisi 4 unit mobil, masing-masing terdaftar dalam kategori dan dengan status tersedia ataupun sudah disewa. Tabel penyewaan mencatat 4 transaksi penyewaan, lengkap dengan informasi pelanggan, pegawai yang bertugas, mobil yang disewa, tanggal sewa–kembali, serta total biaya. Dengan data awal ini, sistem telah siap untuk dilakukan proses query lanjutan seperti SELECT, UPDATE, DELETE, dan JOIN guna melakukan analisis serta pengolahan informasi lebih mendalam.

3.4 Menampilkan Tabel

# Menampilkan daftar tabel dalam database
dbListTables(con)
## [1] "kategori_mobil" "mobil"          "pegawai"        "pelanggan"     
## [5] "penyewaan"
# Menampilkan isi tabel penyewaan
dbGetQuery(con, "
  SELECT * 
  FROM penyewaan;
")
##   id_sewa id_pelanggan id_mobil id_pegawai tanggal_sewa tanggal_kembali
## 1       1            2      201          1   2025-07-01      2025-07-03
## 2       2            4      203          2   2025-07-02      2025-07-05
## 3       3            1      204          3   2025-07-04      2025-07-07
## 4       4            3      202          1   2025-07-06      2025-07-09
##   total_biaya
## 1     1800000
## 2     2500000
## 3     5200000
## 4     3100000

Perintah dbListTables(con) digunakan untuk menampilkan seluruh tabel dalam database, yaitu kategori_mobil, mobil, pelanggan, pegawai, dan penyewaan. Sementara itu, dbGetQuery(con, “SELECT * FROM penyewaan”) digunakan untuk melihat seluruh isi tabel penyewaan yang berisi informasi ID sewa, ID pelanggan, ID mobil, ID pegawai, tanggal sewa, tanggal kembali, serta total biaya. Output menunjukkan bahwa seluruh transaksi penyewaan berhasil tercatat dan ditampilkan, dengan nilai total_biaya muncul dalam format angka ilmiah (eksponensial).

3.5 Mengurutkan Tabel

Pengurutan tabel digunakan untuk menampilkan data penyewaan mobil berdasarkan total biaya sewa, baik dari nilai yang paling kecil hingga terbesar maupun sebaliknya. Dengan cara ini, informasi transaksi dapat dianalisis lebih mudah, seperti mengetahui biaya sewa termurah atau tertinggi yang pernah terjadi.

# Urutkan biaya sewa dari yang paling kecil ke terbesar (ASC)
dbGetQuery(con, "
  SELECT *
  FROM penyewaan
  ORDER BY total_biaya ASC;
")
##   id_sewa id_pelanggan id_mobil id_pegawai tanggal_sewa tanggal_kembali
## 1       1            2      201          1   2025-07-01      2025-07-03
## 2       2            4      203          2   2025-07-02      2025-07-05
## 3       4            3      202          1   2025-07-06      2025-07-09
## 4       3            1      204          3   2025-07-04      2025-07-07
##   total_biaya
## 1     1800000
## 2     2500000
## 3     3100000
## 4     5200000
# Urutkan biaya sewa dari yang paling besar ke terkecil (DESC)
dbGetQuery(con, "
  SELECT *
  FROM penyewaan
  ORDER BY total_biaya DESC;
")
##   id_sewa id_pelanggan id_mobil id_pegawai tanggal_sewa tanggal_kembali
## 1       3            1      204          3   2025-07-04      2025-07-07
## 2       4            3      202          1   2025-07-06      2025-07-09
## 3       2            4      203          2   2025-07-02      2025-07-05
## 4       1            2      201          1   2025-07-01      2025-07-03
##   total_biaya
## 1     5200000
## 2     3100000
## 3     2500000
## 4     1800000

3.6 Menampilkan Data Transaksi Tertentu

Menampilkan data penyewaan tertentu dapat dilakukan menggunakan perintah SELECT dengan penambahan klausa WHERE sebagai filter. Misalnya, untuk menampilkan transaksi penyewaan dengan total biaya lebih dari Rp1.000.000, kemudian hasilnya diurutkan berdasarkan tanggal menggunakan ORDER BY. Perintah ini berguna untuk mengetahui transaksi dengan biaya cukup besar, serta memudahkan analisis riwayat penyewaan berdasarkan waktu.

dbGetQuery(con, "
  SELECT * 
  FROM penyewaan
  WHERE total_biaya > 1000000
  ORDER BY tanggal_sewa ASC;
")
##   id_sewa id_pelanggan id_mobil id_pegawai tanggal_sewa tanggal_kembali
## 1       1            2      201          1   2025-07-01      2025-07-03
## 2       2            4      203          2   2025-07-02      2025-07-05
## 3       3            1      204          3   2025-07-04      2025-07-07
## 4       4            3      202          1   2025-07-06      2025-07-09
##   total_biaya
## 1     1800000
## 2     2500000
## 3     5200000
## 4     3100000

3.7 Memperbarui Data (UPDATE)

Dalam sistem penyewaan mobil, pembaruan data diperlukan ketika terjadi perubahan informasi terkait proses penyewaan. Contohnya, ketika pelanggan memperpanjang durasi sewa, maka total biaya harus diperbarui menggunakan perintah UPDATE. Melalui perintah ini, data pada tabel dapat diubah secara langsung tanpa perlu menghapus dan memasukkan ulang.

# Memperbarui total biaya karena pelanggan memperpanjang durasi sewa
dbExecute(con, "
  UPDATE penyewaan
  SET total_biaya = total_biaya + 200000
  WHERE id_sewa = 2;
")
## [1] 1
# Menampilkan data penyewaan yang telah diperbarui
dbGetQuery(con, "
  SELECT * 
  FROM penyewaan 
  WHERE id_sewa = 2;
")
##   id_sewa id_pelanggan id_mobil id_pegawai tanggal_sewa tanggal_kembali
## 1       2            4      203          2   2025-07-02      2025-07-05
##   total_biaya
## 1     2700000

3.8 DELETE

Perintah DELETE digunakan ketika terdapat data penyewaan yang harus dihapus dari database, misalnya transaksi yang dibatalkan oleh pelanggan atau terjadi kesalahan input.

# Menampilkan data penyewaan dengan id_sewa = 2 (contoh pengecekan data)
dbGetQuery(con, "
  SELECT * 
  FROM penyewaan 
  WHERE id_sewa = 2;
")
##   id_sewa id_pelanggan id_mobil id_pegawai tanggal_sewa tanggal_kembali
## 1       2            4      203          2   2025-07-02      2025-07-05
##   total_biaya
## 1     2700000
# Menghapus data penyewaan dengan id_sewa = 3
dbExecute(con, "
  DELETE FROM penyewaan
  WHERE id_sewa = 3;
")
## [1] 1

3.9 Menampilkan Data Gabungan (INNER JOIN)

Data transaksi yang lengkap dapat ditampilkan dengan menggabungkan beberapa tabel menggunakan INNER JOIN.

dbGetQuery(con, "
  SELECT 
      p.id_sewa,
      m.id_mobil,
      pl.id_pelanggan,
      pg.id_pegawai,
      p.tanggal_sewa,
      p.tanggal_kembali,
      p.total_biaya
  FROM penyewaan p
  INNER JOIN mobil m ON p.id_mobil = m.id_mobil
  INNER JOIN pelanggan pl ON p.id_pelanggan = pl.id_pelanggan
  INNER JOIN pegawai pg ON p.id_pegawai = pg.id_pegawai;
")
##   id_sewa id_mobil id_pelanggan id_pegawai tanggal_sewa tanggal_kembali
## 1       1      201            2          1   2025-07-01      2025-07-03
## 2       2      203            4          2   2025-07-02      2025-07-05
## 3       4      202            3          1   2025-07-06      2025-07-09
##   total_biaya
## 1     1800000
## 2     2700000
## 3     3100000

3.10 Menggunakan Alias dan Fungsi Agregat (SUM, AVG)

Fungsi agregat digunakan untuk menghitung total dan rata-rata biaya penyewaan. Alias (AS) dipakai untuk memberi nama baru pada kolom hasil sehingga lebih mudah dibaca.

# Menghitung total pemasukan dari seluruh transaksi penyewaan
dbGetQuery(con, "
  SELECT SUM(total_biaya) AS total_pemasukan
  FROM penyewaan;
")
##   total_pemasukan
## 1         7600000
# Menghitung rata-rata biaya sewa per transaksi
dbGetQuery(con, "
  SELECT AVG(total_biaya) AS rata_rata_biaya
  FROM penyewaan;
")
##   rata_rata_biaya
## 1         2533333

3.11 Laporan Akhir

Data transaksi penyewaan mobil yang sudah digabung dari berbagai tabel (misalnya data pelanggan, mobil, jenis sewa, dan pegawai/admin) dapat ditampilkan sebagai laporan akhir. Laporan ini dapat digunakan untuk memantau aktivitas penyewaan secara online, termasuk informasi pelanggan, jenis mobil, tanggal penyewaan, durasi, dan pegawai yang memproses transaksi. Laporan akhir ini dapat ditampilkan di RStudio menggunakan fungsi print() untuk melihat secara langsung di console, atau menggunakan View() untuk melihat dalam bentuk tabel yang lebih mudah dibaca.

query_laporan <- "
  SELECT 
      p.id_sewa AS 'ID Sewa',
      pl.nama AS 'Pelanggan',
      m.merk || ' (' || m.plat_nomor || ')' AS 'Mobil',
      k.nama_kategori AS 'Kategori Mobil',
      pg.nama_pegawai AS 'Pegawai',
      p.tanggal_sewa AS 'Tanggal Sewa',
      p.tanggal_kembali AS 'Tanggal Kembali',
      p.total_biaya AS 'Total Biaya'
  FROM penyewaan p
  JOIN mobil m ON p.id_mobil = m.id_mobil
  JOIN kategori_mobil k ON m.id_kategori = k.id_kategori
  JOIN pelanggan pl ON p.id_pelanggan = pl.id_pelanggan
  JOIN pegawai pg ON p.id_pegawai = pg.id_pegawai
  ORDER BY p.tanggal_sewa ASC;
"

laporan <- dbGetQuery(con, query_laporan)
print(laporan)
##   ID Sewa       Pelanggan                               Mobil Kategori Mobil
## 1       1     Siti Aminah            Toyota Camry (B 4521 WQ)          Sedan
## 2       2     Nadya Putri              Honda Jazz (F 8890 PL)      Hatchback
## 3       4 Gilang Prasetyo Mitsubishi Pajero Sport (D 7743 ZT)            SUV
##         Pegawai Tanggal Sewa Tanggal Kembali Total Biaya
## 1 Fahri Ramdhan   2025-07-01      2025-07-03     1800000
## 2  Salsa Nabila   2025-07-02      2025-07-05     2700000
## 3 Fahri Ramdhan   2025-07-06      2025-07-09     3100000

Setelah penghapusan data penyewaan dengan id_sewa = 3, tabel penyewaan kini menampilkan tiga transaksi aktif, yaitu dengan id_sewa = 1, id_sewa = 2, dan id_sewa = 4. Ketiga transaksi ini ditampilkan dalam laporan akhir beserta informasi pelanggan, mobil, kategori, pegawai yang menangani, serta total biaya sewanya. Transaksi pertama dilakukan oleh Siti Aminah, yang menyewa Toyota Camry (B 4521 WQ) dari kategori Sedan pada tanggal 1 Juli 2025. Penyewaan ini ditangani oleh pegawai Fahri Ramdhan, dengan total biaya sebesar Rp1.800.000. Transaksi kedua berasal dari Nadya Putri, yang menyewa Honda Jazz (F 8890 PL) dari kategori Hatchback pada tanggal 2 Juli 2025. Proses penyewaan tersebut ditangani oleh pegawai Salsa Nabila, dengan total biaya sebesar Rp2.700.000 setelah dilakukan pembaruan biaya. Transaksi ketiga dalam laporan adalah milik Gilang Prasetyo, yang menyewa Mitsubishi Pajero Sport (D 7743 ZT) dari kategori SUV pada tanggal 6 Juli 2025. Penyewaan ini diproses oleh pegawai Fahri Ramdhan, dan total biaya yang tercatat adalah Rp3.100.000.

BAB IV

Kesimpulan

Berdasarkan implementasi dan analisis yang telah dilakukan, dapat disimpulkan bahwa sistem manajemen basis data sangat penting dalam mendukung proses penyewaan mobil secara terstruktur dan efisien. Dengan membangun lima entitas utama seperti pelanggan, mobil, kategori mobil, pegawai, dan penyewaan seluruh data penyewaan dapat dikelola dan dikaitkan secara logis melalui relasi foreign key.Penerapan perintah SQL seperti INSERT, SELECT, UPDATE, DELETE, serta penggunaan JOIN dan fungsi agregat berhasil menunjukkan bagaimana data dapat diolah, disaring, dan dianalisis sesuai kebutuhan. Sistem ini mempermudah dalam menyajikan laporan transaksi penyewaan mobil yang lengkap dan informatif, termasuk informasi pelanggan, jenis mobil, periode penyewaan, pegawai yang memproses, dan total biaya.Dengan demikian, studi kasus ini memberikan gambaran dasar bagaimana konsep basis data relasional diterapkan dalam penyewaan mobil berbasis online, sehingga mempermudah manajemen operasi dan pemantauan transaksi.