Studi Kasus with CRUD
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
Kita akan membuat table untuk buku_tamu
CREATE TABLE buku_tamu (
tugas(# id BIGSERIAL PRIMARY KEY,
tugas(# tanggal DATE DEFAULT CURRENT_DATE,
tugas(# nama VARCHAR(120) NOT NULL,
tugas(# jenis_tamu VARCHAR(20), -- 'ortu' | 'alumni' | 'supplier' | 'lainnya'
tugas(# no_hp VARCHAR(20),
tugas(# keperluan TEXT,
tugas(# created_at TIMESTAMPZ DEFAULT now()
tugas(# );
disini kita mendapatkan error
ERROR: tipe « timestampz » belum ada
LINE 8: created_at TIMESTAMPZ DEFAULT now()
Setelah dicari lamaaaa, ternyata salahnya karena kurang huruf ‘T’ pada kata ‘TIMESTAMPZ’
maka ketika kita menambahkan huruf ‘T’, tabel pun berhasil dibuat
tugas=# CREATE TABLE buku_tamu (
tugas(# id BIGSERIAL PRIMARY KEY,
tugas(# tanggal DATE DEFAULT CURRENT_DATE,
tugas(# nama VARCHAR(120) NOT NULL,
tugas(# jenis_tamu VARCHAR(20), -- 'ortu' | 'alumni' | 'supplier' | 'lainnya'
tugas(# no_hp VARCHAR(20),
tugas(# keperluan TEXT,
tugas(# created_at TIMESTAMPTZ DEFAULT now()
tugas(# );
Tanda berhasilnya adalah dengan muncul kalimat CREATE TABLE di terminal
CREATE TABLE
horeeee berhasil buat tabel.
Create
kita akan mencoba menambahkan data
tugas=# INSERT INTO buku_tamu (nama, jenis_tamu, no_hp, keperluan)
tugas-# VALUES ('Muhammad Nadhif', 'alumni', '082139398960', 'main');
dan berhasil
INSERT 0 1
Kita akan melihat hasilnya
tugas=# SELECT * FROM buku_tamu;
id | tanggal | nama | jenis_tamu | no_hp | keperluan | created_at
----+------------+-----------------+------------+--------------+-----------+-------------------------------
1 | 2025-08-16 | Muhammad Nadhif | alumni | 082139398960 | main | 2025-08-16 11:26:06.856861+07
(1 row)
Dan berhasil
Update
tugas=# UPDATE buku_tamu
tugas-# SET no_hp = '08211112222'
tugas-# WHERE id = 1;
UPDATE 1
tugas=# SELECT * FROM buku_tamu;
id | tanggal | nama | jenis_tamu | no_hp | keperluan | created_at
----+------------+-----------------+------------+-------------+-----------+-------------------------------
1 | 2025-08-16 | Muhammad Nadhif | alumni | 08211112222 | main | 2025-08-16 11:26:06.856861+07
(1 row)
tugas=# DELETE FROM buku_tamu WHERE id = 1;
DELETE 1
tugas=# SELECT * FROM buku_tamu;
id | tanggal | nama | jenis_tamu | no_hp | keperluan | created_at
----+---------+------+------------+-------+-----------+------------
(0 rows)
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
tugas=# CREATE TABLE agenda (
tugas(# id BIGSERIAL PRIMARY KEY,
tugas(# tanggal DATE DEFAULT CURRENT_DATE,
tugas(# judul VARCHAR(120) NOT NULL,
tugas(# jam TIME,
tugas(# penanggung_jawab VARCHAR(60),
tugas(# status VARCHAR(15) DEFAULT 'rencana', -- 'rencana'|'berjalan'|'selesai'
tugas(# catatan TEXT
tugas(# );
CREATE TABLE
-- CREATE
tugas=# INSERT INTO agenda (judul, jam, penanggung_jawab)
tugas-# VALUES
tugas-# ('kajian', '09:00', 'Abdullah'),
tugas-# ('Renang', '07:00', 'Ahmad');
INSERT 0 2
-- READ (hari ini)
tugas=# SELECT * FROM agenda WHERE tanggal = CURRENT_DATE ORDER BY jam NULLS LAST;
id | tanggal | judul | jam | penanggung_jawab | status | catatan
----+------------+--------+----------+------------------+---------+---------
2 | 2025-08-16 | Renang | 07:00:00 | Ahmad | rencana |
1 | 2025-08-16 | kajian | 09:00:00 | Abdullah | rencana |
-- UPDATE (tandai selesai)
tugas=# UPDATE agenda SET status = 'selesai' WHERE id = 1;
UPDATE 1
tugas=# SELECT * FROM agenda;
id | tanggal | judul | jam | penanggung_jawab | status | catatan
----+------------+--------+----------+------------------+---------+---------
2 | 2025-08-16 | Renang | 07:00:00 | Ahmad | rencana |
1 | 2025-08-16 | kajian | 09:00:00 | Abdullah | selesai |
(2 rows)
-- DELETE
tugas=# DELETE FROM agenda WHERE id = 2;
DELETE 1
tugas=# SELECT * FROM agenda;
id | tanggal | judul | jam | penanggung_jawab | status | catatan
----+------------+--------+----------+------------------+---------+---------
1 | 2025-08-16 | kajian | 09:00:00 | Abdullah | selesai |
(1 row)
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;
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;
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 = 3;
-- DELETE
DELETE FROM tabungan WHERE id = 2;
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;
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;