# Latihan Crud Berdasarkan Study Kasus

## **1) Buku Tamu Kelas**

### **Konteks masalah**

Kelas sering kedatangan tamu (orang tua, alumni, supplier ATK). Perlu catat siapa datang, keperluan, dan nomor kontak—supaya mudah ditindaklanjuti.

### **Alur utama**

1. Tamu datang → dicatat.
    
2. Wali kelas melihat daftar tamu hari ini.
    
3. Jika ada salah tulis → koreksi.
    
4. Entri yang tidak valid → hapus.
    

### **ERD (single table)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755315397484/327284f1-79eb-4e02-b068-730631eec9ed.png align="center")

### **Skema**

```pgsql
CREATE TABLE buku_tamu (
  id          BIGSERIAL PRIMARY KEY,
  tanggal     DATE DEFAULT CURRENT_DATE,
  nama        VARCHAR(120) NOT NULL,
  jenis_tamu  VARCHAR(20),        -- 'ortu' | 'alumni' | 'supplier' | 'lainnya'
  no_hp       VARCHAR(20),
  keperluan   TEXT,
  created_at  TIMESTAMPTZ DEFAULT now()
);
```

### **Dummy data**

```pgsql
INSERT INTO buku_tamu (nama, jenis_tamu, no_hp, keperluan) VALUES
('Ibu Rina', 'ortu', '081234567890', 'Konsultasi raport'),
('Pak Dimas', 'supplier', '085200011122', 'Kirim spidol'),
('Andi Setiawan', 'alumni', '082198765432', 'Silaturahmi');
```

### **CRUD ringkas**

```pgsql
-- CREATE
INSERT INTO buku_tamu (nama, jenis_tamu, no_hp, keperluan)
VALUES ('Bapak Joko', 'ortu', '0812121212', 'Izin anak');
 
-- READ (hari ini)
SELECT * FROM buku_tamu WHERE tanggal = CURRENT_DATE ORDER BY id DESC;
 
-- UPDATE (perbaiki no_hp)
UPDATE buku_tamu SET no_hp = '081333444555' WHERE id = 1;
 
-- DELETE (entri tidak valid)
DELETE FROM buku_tamu WHERE id = 3;
```

maka ini adalah hasilnya jika kita mencoba read

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755315731209/92bc6415-c725-409b-af5c-656a295c67e5.png align="center")

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755315831415/567bf6e9-7a98-4fc5-a9cb-eab83659e8e8.png align="center")

dan ini jika kita DELETE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755315938007/38dc3a68-9d85-44d2-8fc4-2ee3e0ec06bf.png align="center")

## **2) Agenda Kegiatan Harian**

### **Konteks masalah**

Banyak kegiatan: piket, kajian, olahraga, lomba. Sering lupa jam dan penanggung jawab. Simpan agenda sederhana per hari.

### **Alur utama**

Buat agenda → lihat daftar hari ini → tandai status selesai → koreksi/hapus bila perlu.

### **ERD**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316019607/b3882881-21af-43ee-bee0-875b8e1ac15b.png align="center")

### **Skema + CRUD**

```pgsql
CREATE TABLE agenda (
  id                BIGSERIAL PRIMARY KEY,
  tanggal           DATE DEFAULT CURRENT_DATE,
  judul             VARCHAR(120) NOT NULL,
  jam               TIME,
  penanggung_jawab  VARCHAR(60),
  status            VARCHAR(15) DEFAULT 'rencana', -- 'rencana'|'berjalan'|'selesai'
  catatan           TEXT
);
 
-- Dummy
INSERT INTO agenda (judul, jam, penanggung_jawab) VALUES
('Piket kelas', '06:30', 'Rizky'),
('Latihan futsal', '16:00', 'Bima');
 
-- CREATE
INSERT INTO agenda (judul, jam, penanggung_jawab, status)
VALUES ('Mentoring', '19:30', 'Ust Fulan', 'rencana');
 
-- READ (hari ini)
SELECT * FROM agenda WHERE tanggal = CURRENT_DATE ORDER BY jam NULLS LAST;
 
-- UPDATE (tandai selesai)
UPDATE agenda SET status = 'selesai' WHERE id = 1;
 
-- DELETE
DELETE FROM agenda WHERE id = 2;
```

maka ini adalah hasilnya jika kita mencoba READ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316174611/91f761bd-df2b-4f6c-a9c7-a761ed1e1ae9.png align="center")

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316215687/310ebc16-564c-45b7-a0c0-90ab871b1c86.png align="center")

dan ini jika kita DELETE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316261944/c212f94c-2e29-490d-8e09-16ca40dd7e9e.png align="center")

## **3) Catatan Hafalan Harian**

### **Konteks masalah**

Santri butuh mencatat setoran hafalan agar terlihat progresnya hari ke hari.

### **Alur utama**

Catat setoran → lihat rekap mingguan → koreksi bila salah.

### **ERD**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316302693/87de6321-42f9-4522-8152-c8a7515c2ea9.png align="center")

### **Skema + CRUD**

```pgsql
CREATE TABLE hafalan (
  id               BIGSERIAL PRIMARY KEY,
  tanggal          DATE DEFAULT CURRENT_DATE,
  nama_santri      VARCHAR(120) NOT NULL,
  surat_atau_materi VARCHAR(60) NOT NULL,
  rentang          VARCHAR(30),         -- misal: "1-10" atau "hal 3"
  durasi_menit     INTEGER,
  catatan          TEXT
);
 
-- Dummy
INSERT INTO hafalan (nama_santri, surat_atau_materi, rentang, durasi_menit) VALUES
('Ahmad', 'Al-Baqarah', '1-5', 30),
('Naufal', 'Al-Mulk', '1-10', 25);
 
-- CREATE
INSERT INTO hafalan (nama_santri, surat_atau_materi, rentang, durasi_menit)
VALUES ('Dini', 'An-Naba', '1-20', 35);
 
-- READ (rekap 7 hari terakhir)
SELECT nama_santri, COUNT(*) jml_setor, SUM(COALESCE(durasi_menit,0)) total_menit
FROM hafalan
WHERE tanggal >= CURRENT_DATE - 6
GROUP BY nama_santri
ORDER BY jml_setor DESC;
 
-- UPDATE (koreksi rentang)
UPDATE hafalan SET rentang = '1-15' WHERE id = 1;
 
-- DELETE
DELETE FROM hafalan WHERE id = 2;
```

maka ini adalah hasilnya jika kita mencoba READ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316488971/daf8e8b7-2d32-45da-bc5a-242ab0c67b60.png align="center")

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316557941/46446439-1090-4ffd-8cc5-64be91b72b5f.png align="center")

dan ini jika kita DELETE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316600462/188eaefa-0525-4444-bb9a-f6536154b3a6.png align="center")

## **4) Daftar Kontak (Teman/Orang Tua/Relasi)**

### **Konteks masalah**

Suka kehilangan nomor teman/ortu/wali asrama. Buat buku kontak sederhana.

### **Alur utama**

Tambah kontak → cari kontak → update nomor → hapus duplikat.

### **ERD**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316641689/650aacad-d0b2-4553-980c-e788667d24ca.png align="center")

### **Skema + CRUD**

```pgsql
CREATE TABLE kontak (
  id        BIGSERIAL PRIMARY KEY,
  nama      VARCHAR(120) NOT NULL,
  no_hp     VARCHAR(20)  NOT NULL,
  kategori  VARCHAR(60),             -- 'teman'|'guru'|'ortu'|'lainnya'
  catatan   TEXT,
  created_at TIMESTAMPTZ DEFAULT now()
);
 
-- Dummy
INSERT INTO kontak (nama, no_hp, kategori) VALUES
('Budi', '0812345678', 'teman'),
('Ust Faris', '085211122233', 'guru');
 
-- CREATE
INSERT INTO kontak (nama, no_hp, kategori) VALUES ('Ibu Rina', '08199887766', 'ortu');
 
-- READ (pencarian nama)
SELECT * FROM kontak WHERE nama ILIKE '%rin%' ORDER BY created_at DESC;
 
-- UPDATE (ganti nomor)
UPDATE kontak SET no_hp = '081700011122' WHERE id = 1;
 
-- DELETE (duplikat)
DELETE FROM kontak WHERE id = 2;
```

maka ini adalah hasilnya jika kita mencoba READ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316944992/08a82f03-b003-4b83-8057-089612cab60c.png align="center")

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755316992196/177e3978-1b2c-45af-803d-ea28d5803d68.png align="center")

dan ini jika kita DELETE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755317033489/75b0f7bf-37b8-4601-926b-8300f72d4661.png align="center")

## **5) Catatan Tabungan Pribadi**

### **Konteks masalah**

Siswa ingin memantau tabungan kecil (uang saku). Satu tabel transaksi masuk/keluar sederhana.

### **Alur utama**

Catat pemasukan/pengeluaran → lihat saldo akhir → koreksi bila ada salah angka.

### **ERD**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755347804438/a7130d76-6089-4124-b940-d9b6b593a3fb.png align="center")

### **Skema + CRUD**

```pgsql
CREATE TABLE tabungan (
  id        BIGSERIAL PRIMARY KEY,
  tanggal   DATE DEFAULT CURRENT_DATE,
  jenis     VARCHAR(10) NOT NULL,  -- 'masuk'|'keluar'
  kategori  VARCHAR(60),
  deskripsi TEXT,
  jumlah    INTEGER NOT NULL -- >0 (validasi di aplikasi)
);
 
-- Dummy
INSERT INTO tabungan (jenis, kategori, deskripsi, jumlah) VALUES
('masuk', 'Uang saku', 'Mingguan', 50000),
('keluar', 'Jajan', 'Roti', 8000);
 
-- CREATE
INSERT INTO tabungan (jenis, kategori, deskripsi, jumlah)
VALUES ('keluar', 'ATK', 'Beli pulpen', 5000);
 
-- READ (saldo akhir on-the-fly)
SELECT COALESCE(SUM(CASE WHEN jenis='masuk' THEN jumlah END),0)
     - COALESCE(SUM(CASE WHEN jenis='keluar' THEN jumlah END),0) AS saldo
FROM tabungan;
 
-- UPDATE
UPDATE tabungan SET jumlah = 7000 WHERE id = 2;
 
-- DELETE
DELETE FROM tabungan WHERE id = 2;
```

maka ini adalah hasilnya jika kita mencoba READ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348146768/e08d04a3-67a0-4e20-a422-4bdb0627a170.png align="center")

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348151553/4924baa9-0390-4320-86d3-53badfa42a59.png align="center")

dan ini jika kita DELETE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348188660/809d85d2-8e94-46db-949a-7fd1d271beae.png align="center")

## **6) Peminjaman Barang Kelas (Log Sederhana)**

> ***Versi satu tabel ini hanya log, bukan sistem stok penuh. Cukup untuk tahu siapa meminjam apa hari ini.***

### **Konteks masalah**

Kelas punya perlengkapan (bola, spidol, speaker). Sering dipinjam tapi lupa siapa yang bawa.

### **Alur utama**

Catat peminjaman → saat dikembalikan, update kolom pengembalian → list peminjaman aktif.

### **ERD**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348235827/2579fdd6-f6d5-439d-86b2-d183e370ef21.png align="center")

### **Skema + CRUD**

```pgsql
CREATE TABLE pinjam_barang (
  id             BIGSERIAL PRIMARY KEY,
  tanggal        DATE DEFAULT CURRENT_DATE,
  nama_peminjam  VARCHAR(120) NOT NULL,
  nama_barang    VARCHAR(120) NOT NULL,
  jam_pinjam     TIME,
  jam_kembali    TIME,
  catatan        TEXT
);
 
-- Dummy
INSERT INTO pinjam_barang (nama_peminjam, nama_barang, jam_pinjam) VALUES
('Rafi', 'Bola futsal', '15:30'),
('Nanda', 'Speaker aktif', '10:00');
 
-- CREATE
INSERT INTO pinjam_barang (nama_peminjam, nama_barang, jam_pinjam)
VALUES ('Syifa', 'Spidol', '08:15');
 
-- READ (yang belum kembali)
SELECT * FROM pinjam_barang
WHERE jam_kembali IS NULL
ORDER BY tanggal, jam_pinjam;
 
-- UPDATE (kembali)
UPDATE pinjam_barang SET jam_kembali = '16:45' WHERE id = 1;
 
-- DELETE (entri salah)
DELETE FROM pinjam_barang WHERE id = 2;
```

maka ini adalah hasilnya jika kita mencoba READ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348428074/dd568a4c-daea-4f6b-aaea-b137cb84a271.png align="center")

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348525417/00b5b438-3385-4391-9794-7468a400276c.png align="center")

dan ini jika kita DELETE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348560553/73df9534-3bc4-4a0c-abce-701c509e4b5f.png align="center")

## **7) Tugas/Kuis Sederhana (Nilai Per Tugas)**

> ***Bukan sistem rapor; cukup untuk mencatat nilai satu tugas/kuis per baris.***

### **Konteks masalah**

Guru ingin rekap cepat nilai kuis harian tanpa ribet banyak tabel.

### **Alur utama**

Input nilai → lihat ranking hari ini → koreksi nilai bila salah tulis.

### **ERD**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348592849/f2df9d00-6cf5-4fd7-838a-a9dfef227f47.png align="center")

### **Skema + CRUD**

```pgsql
CREATE TABLE nilai_tugas (
  id          BIGSERIAL PRIMARY KEY,
  tanggal     DATE DEFAULT CURRENT_DATE,
  nama_siswa  VARCHAR(120) NOT NULL,
  nama_tugas  VARCHAR(120) NOT NULL,
  nilai       INTEGER,               -- 0..100 (validasi di aplikasi)
  catatan     TEXT
);
 
-- Dummy
INSERT INTO nilai_tugas (nama_siswa, nama_tugas, nilai) VALUES
('Alya', 'Kuis SQL 1', 85),
('Fajar', 'Kuis SQL 1', 72);
 
-- CREATE
INSERT INTO nilai_tugas (nama_siswa, nama_tugas, nilai)
VALUES ('Doni', 'Kuis SQL 1', 90);
 
-- READ (ranking hari ini)
SELECT nama_siswa, nilai
FROM nilai_tugas
WHERE tanggal = CURRENT_DATE
ORDER BY nilai DESC NULLS LAST;
 
-- UPDATE (koreksi nilai)
UPDATE nilai_tugas SET nilai = 88 WHERE id = 2;
 
-- DELETE
DELETE FROM nilai_tugas WHERE id = 1;
```

maka ini adalah hasilnya jika kita mencoba READ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348757980/ed34e358-0eaa-4bfd-acc5-b0efb06396ae.png align="center")

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348809244/03e87de8-9f2d-4a21-aa58-b6d83da238a9.png align="center")

dan ini jika kita DELETE dan setelah itu READ kembali

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1755348837009/ee4b9ed0-1754-45e3-a676-9aac048dbf35.png align="center")

mungkin cukup sekian dan terima kasih

copyright by [https://course.ppqita.my.id/cycle/0.1.-mastering-data-with-postgreSQL/8.1\_latihan-crud-dgn-studi-kasus?pass=ppqita](https://course.ppqita.my.id/cycle/0.1.-mastering-data-with-postgreSQL/8.1_latihan-crud-dgn-studi-kasus?pass=ppqita)
