Latihan Crud Berdasarkan Study Kasus
By Ahmad Afan Shobari

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
Tamu datang → dicatat.
Wali kelas melihat daftar tamu hari ini.
Jika ada salah tulis → koreksi.
Entri yang tidak valid → hapus.
ERD (single table)

Skema
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
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
-- 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

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

dan ini jika kita DELETE dan setelah itu READ kembali

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

Skema + CRUD
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

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

dan ini jika kita DELETE dan setelah itu READ kembali

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

Skema + CRUD
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

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

dan ini jika kita DELETE dan setelah itu READ kembali

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

Skema + CRUD
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

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

dan ini jika kita DELETE dan setelah itu READ kembali

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

Skema + CRUD
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

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

dan ini jika kita DELETE dan setelah itu READ kembali

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

Skema + CRUD
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

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

dan ini jika kita DELETE dan setelah itu READ kembali

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

Skema + CRUD
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

dan ini hasil jika kita UPDATE dan setelah itu READ kembali

dan ini jika kita DELETE dan setelah itu READ kembali

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



