MODUL PEMROGRAMAN WEBSITE 2
Mata Kuliah: Pemrograman Website 2
Kode MK: INF2419
SKS: 3 (Praktikum)
Semester: Genap 2025/2026
Program Studi: Informatika
Fakultas: FEBI / Saintek
Universitas: UIN K.H. Abdurrahman Wahid Pekalongan
Dosen Pengampu: Mohammad Reza Maulana, M.Kom
NIP: 199110082025051002
Pertemuan: 6 dari 16
Durasi: 150 menit (3 Ã 50 menit)
Studi Kasus Berkelanjutan: Sistem Manajemen Perpustakaan
PERTEMUAN 6
DATABASE MYSQL UNTUK WEB
A. INFORMASI PERTEMUAN
| Aspek | Keterangan |
|---|---|
| Capaian Pembelajaran Lulusan (CPL) | CPL04: Menguasai konsep teoretis bidang ilmu komputer/informatika dan mampu memformulasikan penyelesaian masalah prosedural. |
| Capaian Pembelajaran Mata Kuliah (CPMK) | CPMK04.1: Memahami konsep dasar pengembangan web backend menggunakan PHP dan database |
| Sub-CPMK | Sub-CPMK04.1.3: Mampu menjelaskan konsep pengelolaan data menggunakan database MySQL |
| Indikator Pencapaian | Mahasiswa mampu: 1. Menjelaskan konsep RDBMS dan manfaatnya 2. Merancang struktur database untuk sistem perpustakaan 3. Membuat ERD sederhana 4. Menggunakan SQL DDL (CREATE, ALTER, DROP) 5. Menggunakan SQL DML (INSERT, SELECT, UPDATE, DELETE) 6. Memahami Primary Key dan Auto Increment 7. Membuat database perpustakaan yang siap digunakan |
| Alokasi Waktu | âĸ Teori: 60 menit âĸ Praktikum: 90 menit âĸ Total: 150 menit (3 Ã 50 menit) |
B. PENDAHULUAN
1. Deskripsi Singkat
Pertemuan keenam ini membahas fundamental database MySQL untuk pengembangan web. Database adalah komponen krusial dalam aplikasi web untuk menyimpan data secara persisten. Mahasiswa akan mempelajari konsep RDBMS, perancangan database, ERD, dan SQL (DDL & DML) dalam konteks sistem perpustakaan. Pertemuan ini menjadi fondasi untuk CRUD database di pertemuan selanjutnya.
2. Keterkaitan dengan Pertemuan Lain
Pertemuan ini adalah persiapan untuk integrasi database:
- Pertemuan 4: Konsep array menjadi dasar memahami struktur data
- Pertemuan 5: Data dari form akan disimpan ke database
- Pertemuan 7: Integrasi PHP-MySQL untuk CRUD
- Pertemuan 9-16: Database yang sama digunakan dalam Laravel
3. Manfaat Pembelajaran
- Mampu merancang struktur database yang baik
- Dapat membuat dan mengelola database dengan SQL
- Memahami relasi antar tabel
- Siap mengintegrasikan database dengan PHP
- Memiliki skill database yang esensial untuk web developer
4. Relevansi dengan Studi Kasus
Dalam sistem perpustakaan, database digunakan untuk:
- Menyimpan data buku secara permanen
- Menyimpan data anggota
- Mencatat transaksi peminjaman
- Membuat laporan dan statistik
- Menjaga integritas dan relasi data
C. MATERI TEORI
1. Konsep RDBMS
a. Apa itu Database?
Database adalah kumpulan data yang terorganisir dan dapat diakses dengan mudah.
Analogi:
- Database = Perpustakaan (gedung)
- Tabel = Rak buku (kategori)
- Record = Buku individual
- Field = Informasi buku (judul, pengarang, dll)
b. Apa itu RDBMS?
RDBMS (Relational Database Management System) adalah sistem untuk mengelola database relasional.
Karakteristik:
- Data disimpan dalam tabel (rows & columns)
- Tabel saling berelasi melalui key
- Menggunakan SQL (Structured Query Language)
- Menjamin integritas data
- Support transaksi (ACID properties)
Contoh RDBMS:
- MySQL (yang kita gunakan)
- PostgreSQL
- Oracle
- SQL Server
- SQLite
c. Keuntungan Menggunakan Database
vs File (txt, csv, json):
| Aspek | File | Database |
|---|---|---|
| Struktur | Tidak terstruktur | Terstruktur (tabel) |
| Query | Sulit | Mudah (SQL) |
| Integritas | Tidak terjamin | Ada constraint |
| Concurrent Access | Bermasalah | Aman (locking) |
| Performance | Lambat untuk data besar | Cepat (indexing) |
| Relasi | Sulit | Mudah (foreign key) |
Keuntungan Database:
- â Data tersimpan permanen
- â Query data lebih cepat
- â Integritas data terjaga
- â Multiple user access aman
- â Backup dan recovery mudah
- â Relasi antar data jelas
2. Perancangan Database Perpustakaan
a. Identifikasi Entitas
Entitas utama dalam sistem perpustakaan:
-
Buku
- Data: kode, judul, pengarang, penerbit, tahun, harga, stok
-
Anggota
- Data: id, nama, email, telepon, alamat, tanggal daftar
-
Transaksi (akan dibuat di pertemuan selanjutnya)
- Data: id, id_buku, id_anggota, tanggal pinjam, tanggal kembali, status
b. Entity Relationship Diagram (ERD)
ERD Sederhana:
âââââââââââââââ ââââââââââââââââ âââââââââââââââ
â BUKU â â TRANSAKSI â â ANGGOTA â
ââââââââââââââ⤠âââââââââââââââ⤠âââââââââââââââ¤
â id_buku (PK)ââââââ â id (PK) â âââââēâ id (PK) â
â kode_buku â â â id_buku (FK) â â â nama â
â judul â ââââââ id_anggota(FK)ââââââ â email â
â kategori â â tgl_pinjam â â telepon â
â pengarang â â tgl_kembali â â alamat â
â penerbit â â status â â tgl_daftar â
â tahun â â denda â âââââââââââââââ
â isbn â ââââââââââââââââ
â harga â
â stok â
âââââââââââââââ
Relasi:
- 1 Buku bisa dipinjam berkali-kali (1:M)
- 1 Anggota bisa pinjam banyak buku (1:M)Keterangan:
- PK (Primary Key): Identitas unik setiap record
- FK (Foreign Key): Referensi ke tabel lain
- 1:M (One to Many): Satu ke banyak
c. Aturan Normalisasi (Simplified)
Prinsip Dasar:
- Setiap tabel punya satu fokus/entitas
- Tidak ada duplikasi data
- Setiap kolom atomic (tidak dapat dipecah lagi)
- Ada Primary Key di setiap tabel
Contoh Salah (Tidak Normal):
Tabel Peminjaman:
ââââââŦââââââââââââââŦââââââââââââââââŦâââââââââââââââââ
â ID â Nama Anggotaâ Judul Buku â Tgl Pinjam â
ââââââŧââââââââââââââŧââââââââââââââââŧâââââââââââââââââ¤
â 1 â Budi â PHP, MySQL â 2024-01-01 â
ââââââ´ââââââââââââââ´ââââââââââââââââ´âââââââââââââââââMasalah:
- Judul buku lebih dari satu (tidak atomic)
- Data buku dan anggota tercampur
Contoh Benar (Normal):
Tabel Anggota: Tabel Buku: Tabel Transaksi:
ââââââŦâââââââ ââââââŦââââââââ ââââââŦâââââââŦâââââââ
â ID â Nama â â ID â Judul â â ID âid_bukuâid_anggotaâ
ââââââŧââââââ⤠ââââââŧâââââââ⤠ââââââŧâââââââŧâââââââ¤
â 1 â Budi â â 1 â PHP â â 1 â 1 â 1 â
ââââââ´âââââââ â 2 â MySQL â â 2 â 2 â 1 â
ââââââ´ââââââââ ââââââ´âââââââ´âââââââ3. SQL DDL (Data Definition Language)
DDL adalah SQL untuk mendefinisikan struktur database.
a. CREATE DATABASE
Membuat database baru.
Sintaks:
CREATE DATABASE nama_database;Contoh:
CREATE DATABASE perpustakaan;
-- Dengan charset
CREATE DATABASE perpustakaan
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;Gunakan Database:
USE perpustakaan;b. CREATE TABLE
Membuat tabel baru.
Sintaks:
CREATE TABLE nama_tabel (
nama_kolom tipe_data constraint,
nama_kolom2 tipe_data constraint,
...
);Tipe Data MySQL Umum:
| Tipe | Keterangan | Contoh |
|---|---|---|
| INT | Integer | id, stok, tahun |
| VARCHAR(n) | String variabel (max n) | nama, judul |
| TEXT | String panjang | deskripsi, alamat |
| DATE | Tanggal (YYYY-MM-DD) | tanggal_terbit |
| DATETIME | Tanggal + waktu | created_at |
| DECIMAL(m,d) | Desimal (m digit, d decimal) | harga |
| ENUM | Pilihan nilai tetap | status: ('aktif','nonaktif') |
Constraint Umum:
| Constraint | Keterangan |
|---|---|
| PRIMARY KEY | Identitas unik, tidak boleh NULL, auto index |
| AUTO_INCREMENT | Otomatis naik (untuk id) |
| NOT NULL | Tidak boleh kosong |
| UNIQUE | Nilai harus unik |
| DEFAULT | Nilai default jika tidak diisi |
| FOREIGN KEY | Referensi ke tabel lain |
Contoh Tabel Buku:
CREATE TABLE buku (
id_buku INT AUTO_INCREMENT PRIMARY KEY,
kode_buku VARCHAR(20) UNIQUE NOT NULL,
judul VARCHAR(200) NOT NULL,
kategori VARCHAR(50) NOT NULL,
pengarang VARCHAR(100) NOT NULL,
penerbit VARCHAR(100) NOT NULL,
tahun_terbit INT NOT NULL,
isbn VARCHAR(20),
harga DECIMAL(10,2) NOT NULL,
stok INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);Contoh Tabel Anggota:
CREATE TABLE anggota (
id_anggota INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
telepon VARCHAR(15) NOT NULL,
alamat TEXT NOT NULL,
tanggal_daftar DATE NOT NULL,
status ENUM('Aktif', 'Nonaktif') DEFAULT 'Aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);c. ALTER TABLE
Mengubah struktur tabel yang sudah ada.
Tambah Kolom:
ALTER TABLE buku
ADD COLUMN bahasa VARCHAR(20) DEFAULT 'Indonesia';Ubah Kolom:
ALTER TABLE buku
MODIFY COLUMN judul VARCHAR(250);Hapus Kolom:
ALTER TABLE buku
DROP COLUMN isbn;Rename Kolom:
ALTER TABLE buku
CHANGE COLUMN tahun_terbit tahun INT;d. DROP TABLE
Menghapus tabel (hati-hati! data akan hilang).
DROP TABLE nama_tabel;e. SHOW & DESCRIBE
Melihat informasi database dan tabel.
-- Lihat semua database
SHOW DATABASES;
-- Lihat semua tabel
SHOW TABLES;
-- Lihat struktur tabel
DESCRIBE buku;
-- atau
DESC buku;
-- Lihat SQL pembuatan tabel
SHOW CREATE TABLE buku;4. SQL DML (Data Manipulation Language)
DML adalah SQL untuk memanipulasi data dalam tabel.
a. INSERT (Create)
Menambah data baru.
Sintaks:
-- Insert satu record
INSERT INTO nama_tabel (kolom1, kolom2, ...)
VALUES (nilai1, nilai2, ...);
-- Insert multiple records
INSERT INTO nama_tabel (kolom1, kolom2, ...)
VALUES
(nilai1a, nilai2a, ...),
(nilai1b, nilai2b, ...);Contoh:
-- Insert 1 buku
INSERT INTO buku (kode_buku, judul, kategori, pengarang, penerbit, tahun_terbit, harga, stok)
VALUES ('BK-001', 'Pemrograman PHP untuk Pemula', 'Programming', 'Budi Raharjo', 'Informatika', 2023, 75000, 10);
-- Insert multiple buku
INSERT INTO buku (kode_buku, judul, kategori, pengarang, penerbit, tahun_terbit, harga, stok)
VALUES
('BK-002', 'Mastering MySQL Database', 'Database', 'Andi Nugroho', 'Graha Ilmu', 2022, 95000, 5),
('BK-003', 'Laravel Framework Advanced', 'Programming', 'Siti Aminah', 'Informatika', 2024, 125000, 8),
('BK-004', 'Web Design Principles', 'Web Design', 'Dedi Santoso', 'Andi', 2023, 85000, 15);Tips:
- Jika kolom AUTO_INCREMENT, tidak perlu diisi
- Jika ada DEFAULT, bisa skip kolom tersebut
- String pakai single quote
'text' - NULL untuk nilai kosong
b. SELECT (Read)
Mengambil/membaca data.
Sintaks Dasar:
SELECT kolom1, kolom2, ...
FROM nama_tabel
WHERE kondisi
ORDER BY kolom
LIMIT jumlah;Contoh:
1. Select Semua Kolom:
SELECT * FROM buku;2. Select Kolom Tertentu:
SELECT judul, pengarang, harga FROM buku;3. WHERE (Filter):
-- Filter kategori
SELECT * FROM buku WHERE kategori = 'Programming';
-- Filter harga
SELECT * FROM buku WHERE harga > 80000;
-- Filter dengan AND
SELECT * FROM buku
WHERE kategori = 'Programming' AND harga < 100000;
-- Filter dengan OR
SELECT * FROM buku
WHERE kategori = 'Programming' OR kategori = 'Database';
-- Filter dengan LIKE (pattern matching)
SELECT * FROM buku WHERE judul LIKE '%PHP%';
-- Filter dengan IN
SELECT * FROM buku WHERE kategori IN ('Programming', 'Database');
-- Filter dengan BETWEEN
SELECT * FROM buku WHERE harga BETWEEN 70000 AND 100000;4. ORDER BY (Sorting):
-- Urut ascending (A-Z, kecil-besar)
SELECT * FROM buku ORDER BY judul ASC;
-- Urut descending (Z-A, besar-kecil)
SELECT * FROM buku ORDER BY harga DESC;
-- Multiple kolom
SELECT * FROM buku ORDER BY kategori ASC, harga DESC;5. LIMIT (Batasi Hasil):
-- 5 buku pertama
SELECT * FROM buku LIMIT 5;
-- Skip 5, ambil 5 (untuk pagination)
SELECT * FROM buku LIMIT 5 OFFSET 5;
-- atau
SELECT * FROM buku LIMIT 5, 5;6. Aggregate Functions:
-- Hitung jumlah buku
SELECT COUNT(*) FROM buku;
-- Total stok
SELECT SUM(stok) FROM buku;
-- Rata-rata harga
SELECT AVG(harga) FROM buku;
-- Harga tertinggi
SELECT MAX(harga) FROM buku;
-- Harga terendah
SELECT MIN(harga) FROM buku;7. GROUP BY:
-- Jumlah buku per kategori
SELECT kategori, COUNT(*) as jumlah
FROM buku
GROUP BY kategori;
-- Total stok per kategori
SELECT kategori, SUM(stok) as total_stok
FROM buku
GROUP BY kategori;8. ALIAS (AS):
SELECT
judul AS 'Judul Buku',
pengarang AS 'Nama Pengarang',
harga AS 'Harga (Rp)'
FROM buku;c. UPDATE (Update)
Mengubah data yang sudah ada.
Sintaks:
UPDATE nama_tabel
SET kolom1 = nilai1, kolom2 = nilai2, ...
WHERE kondisi;â ī¸ PENTING: Selalu gunakan WHERE! Jika tidak, semua data akan terupdate!
Contoh:
-- Update 1 buku
UPDATE buku
SET harga = 80000, stok = 12
WHERE kode_buku = 'BK-001';
-- Update berdasarkan kondisi
UPDATE buku
SET stok = stok + 5
WHERE kategori = 'Programming';
-- Update multiple kolom
UPDATE buku
SET
judul = 'Pemrograman PHP Lanjut',
harga = 85000,
stok = 15
WHERE id_buku = 1;d. DELETE (Delete)
Menghapus data.
Sintaks:
DELETE FROM nama_tabel
WHERE kondisi;â ī¸ PENTING: Selalu gunakan WHERE! Jika tidak, semua data akan terhapus!
Contoh:
-- Hapus 1 buku
DELETE FROM buku WHERE id_buku = 5;
-- Hapus berdasarkan kondisi
DELETE FROM buku WHERE stok = 0;
-- Hapus semua (HATI-HATI!)
DELETE FROM buku;
-- Lebih aman: TRUNCATE (reset auto_increment juga)
TRUNCATE TABLE buku;5. Primary Key & Auto Increment
a. Primary Key
Primary Key adalah kolom yang menjadi identitas unik untuk setiap record.
Karakteristik:
- Nilai harus unik
- Tidak boleh NULL
- Setiap tabel sebaiknya punya 1 PK
- Otomatis terindex (cepat untuk pencarian)
Contoh:
CREATE TABLE buku (
id_buku INT PRIMARY KEY AUTO_INCREMENT,
-- atau
-- id_buku INT,
-- PRIMARY KEY (id_buku)
);b. Auto Increment
AUTO_INCREMENT membuat nilai kolom bertambah otomatis.
Karakteristik:
- Biasanya untuk Primary Key
- Tidak perlu diisi saat INSERT
- Mulai dari 1, bertambah 1 setiap record
Contoh:
-- Insert tanpa id (auto)
INSERT INTO buku (kode_buku, judul, ...)
VALUES ('BK-001', 'PHP', ...);
-- id_buku otomatis = 1
INSERT INTO buku (kode_buku, judul, ...)
VALUES ('BK-002', 'MySQL', ...);
-- id_buku otomatis = 2Get Last Inserted ID:
SELECT LAST_INSERT_ID();Set Auto Increment Value:
ALTER TABLE buku AUTO_INCREMENT = 100;D. PRAKTIKUM
1. Tujuan Praktikum
- Membuat database perpustakaan
- Membuat tabel buku dan anggota
- Insert sample data
- Melakukan query SELECT dengan berbagai kondisi
- Update dan Delete data
- Memahami penggunaan phpMyAdmin
2. PRAKTIKUM 1: Membuat Database dan Tabel
Tujuan
Membuat database perpustakaan dengan tabel buku.
Langkah-langkah
a. Buka phpMyAdmin
- Start Apache dan MySQL di XAMPP
- Buka browser:
http://localhost/phpmyadmin - Login (default: username=root, password=kosong)
b. Buat Database
- Klik tab "Databases"
- Isi nama database:
perpustakaan - Collation:
utf8mb4_unicode_ci - Klik "Create"
c. Buat Tabel Buku
Klik database perpustakaan, lalu tab "SQL", jalankan query:
CREATE TABLE buku (
id_buku INT AUTO_INCREMENT PRIMARY KEY,
kode_buku VARCHAR(20) UNIQUE NOT NULL,
judul VARCHAR(200) NOT NULL,
kategori ENUM('Programming', 'Database', 'Web Design', 'Networking') NOT NULL,
pengarang VARCHAR(100) NOT NULL,
penerbit VARCHAR(100) NOT NULL,
tahun_terbit INT NOT NULL,
isbn VARCHAR(20),
harga DECIMAL(10,2) NOT NULL,
stok INT NOT NULL DEFAULT 0,
deskripsi TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);d. Verifikasi
-- Lihat struktur tabel
DESCRIBE buku;
-- Atau klik tab "Structure" di phpMyAdminPastikan semua kolom sesuai dengan yang diinginkan.
3. PRAKTIKUM 2: Insert Sample Data
Tujuan
Mengisi tabel buku dengan data sample.
Langkah-langkah
Jalankan query berikut di tab SQL:
INSERT INTO buku (kode_buku, judul, kategori, pengarang, penerbit, tahun_terbit, isbn, harga, stok, deskripsi)
VALUES
('BK-001', 'Pemrograman PHP untuk Pemula', 'Programming', 'Budi Raharjo', 'Informatika', 2023, '978-602-1234-56-1', 75000.00, 10, 'Buku panduan lengkap belajar PHP dari dasar hingga mahir'),
('BK-002', 'Mastering MySQL Database', 'Database', 'Andi Nugroho', 'Graha Ilmu', 2022, '978-602-1234-56-2', 95000.00, 5, 'Panduan komprehensif administrasi dan optimasi MySQL'),
('BK-003', 'Laravel Framework Advanced', 'Programming', 'Siti Aminah', 'Informatika', 2024, '978-602-1234-56-3', 125000.00, 8, 'Teknik advanced development dengan Laravel framework'),
('BK-004', 'Web Design Principles', 'Web Design', 'Dedi Santoso', 'Andi', 2023, '978-602-1234-56-4', 85000.00, 15, 'Prinsip dan best practice dalam desain web modern'),
('BK-005', 'Network Security Fundamentals', 'Networking', 'Rina Wijaya', 'Erlangga', 2023, '978-602-1234-56-5', 110000.00, 3, 'Dasar-dasar keamanan jaringan komputer'),
('BK-006', 'PHP Web Services', 'Programming', 'Budi Raharjo', 'Informatika', 2024, '978-602-1234-56-6', 90000.00, 12, 'Membangun RESTful API dengan PHP'),
('BK-007', 'PostgreSQL Advanced', 'Database', 'Ahmad Yani', 'Graha Ilmu', 2024, '978-602-1234-56-7', 115000.00, 7, 'Teknik advanced PostgreSQL untuk enterprise'),
('BK-008', 'JavaScript Modern', 'Programming', 'Siti Aminah', 'Informatika', 2023, '978-602-1234-56-8', 80000.00, 0, 'JavaScript ES6+ untuk web development modern');Verifikasi:
-- Lihat semua data
SELECT * FROM buku;
-- Hitung jumlah
SELECT COUNT(*) as total FROM buku;4. PRAKTIKUM 3: Query SELECT Berbagai Kondisi
Tujuan
Melakukan berbagai query SELECT untuk mengambil data.
Langkah-langkah
Jalankan query berikut satu per satu:
-- 1. Select semua buku
SELECT * FROM buku;
-- 2. Select kolom tertentu
SELECT judul, pengarang, harga FROM buku;
-- 3. Filter by kategori
SELECT * FROM buku WHERE kategori = 'Programming';
-- 4. Filter by harga
SELECT * FROM buku WHERE harga > 90000;
-- 5. Filter dengan AND
SELECT * FROM buku
WHERE kategori = 'Programming' AND harga < 100000;
-- 6. Filter dengan OR
SELECT * FROM buku
WHERE kategori = 'Programming' OR kategori = 'Database';
-- 7. Search judul (LIKE)
SELECT * FROM buku WHERE judul LIKE '%PHP%';
-- 8. Search pengarang
SELECT * FROM buku WHERE pengarang LIKE '%Budi%';
-- 9. Filter dengan IN
SELECT * FROM buku
WHERE kategori IN ('Programming', 'Database');
-- 10. Filter range harga (BETWEEN)
SELECT * FROM buku
WHERE harga BETWEEN 80000 AND 100000;
-- 11. Order by judul ASC
SELECT * FROM buku ORDER BY judul ASC;
-- 12. Order by harga DESC
SELECT * FROM buku ORDER BY harga DESC;
-- 13. Limit 5
SELECT * FROM buku LIMIT 5;
-- 14. Pagination (skip 3, ambil 3)
SELECT * FROM buku LIMIT 3 OFFSET 3;
-- 15. Count semua buku
SELECT COUNT(*) as total_buku FROM buku;
-- 16. Sum total stok
SELECT SUM(stok) as total_stok FROM buku;
-- 17. Average harga
SELECT AVG(harga) as rata_rata_harga FROM buku;
-- 18. Max & Min harga
SELECT MAX(harga) as termahal, MIN(harga) as termurah FROM buku;
-- 19. Group by kategori
SELECT kategori, COUNT(*) as jumlah
FROM buku
GROUP BY kategori;
-- 20. Group by kategori dengan sum stok
SELECT kategori, COUNT(*) as jumlah, SUM(stok) as total_stok
FROM buku
GROUP BY kategori
ORDER BY jumlah DESC;
-- 21. Buku terbaru (tahun 2024)
SELECT * FROM buku WHERE tahun_terbit = 2024;
-- 22. Buku habis (stok = 0)
SELECT * FROM buku WHERE stok = 0;
-- 23. Buku tersedia (stok > 0)
SELECT * FROM buku WHERE stok > 0;
-- 24. Format harga dengan alias
SELECT
judul,
CONCAT('Rp ', FORMAT(harga, 0)) as harga_format,
stok
FROM buku;
-- 25. Complex query
SELECT
kode_buku as 'Kode',
judul as 'Judul Buku',
pengarang as 'Pengarang',
kategori as 'Kategori',
CONCAT('Rp ', FORMAT(harga, 0)) as 'Harga',
stok as 'Stok',
CASE
WHEN stok = 0 THEN 'Habis'
WHEN stok < 5 THEN 'Menipis'
ELSE 'Tersedia'
END as 'Status'
FROM buku
ORDER BY harga DESC;5. PRAKTIKUM 4: UPDATE dan DELETE Data
Tujuan
Mengubah dan menghapus data dengan UPDATE dan DELETE.
Langkah-langkah
Jalankan query berikut:
-- ========== UPDATE ==========
-- 1. Update harga 1 buku
UPDATE buku
SET harga = 80000
WHERE kode_buku = 'BK-001';
-- Verifikasi
SELECT * FROM buku WHERE kode_buku = 'BK-001';
-- 2. Update multiple kolom
UPDATE buku
SET
harga = 85000,
stok = 15,
deskripsi = 'Buku panduan PHP terbaru edisi revisi'
WHERE kode_buku = 'BK-001';
-- 3. Update dengan operasi matematika (tambah stok)
UPDATE buku
SET stok = stok + 5
WHERE kategori = 'Programming';
-- 4. Update berdasarkan kondisi
UPDATE buku
SET harga = harga * 1.1
WHERE tahun_terbit < 2024;
-- (Naikkan harga 10% untuk buku lama)
-- 5. Update semua (HATI-HATI!)
-- UPDATE buku SET stok = 10;
-- Ini akan update SEMUA buku! Jangan jalankan kecuali sengaja
-- ========== DELETE ==========
-- 6. Delete 1 buku (by id)
DELETE FROM buku WHERE id_buku = 8;
-- Verifikasi
SELECT * FROM buku WHERE id_buku = 8;
-- Hasilnya empty
-- 7. Delete berdasarkan kondisi
-- Hapus buku yang stok = 0
DELETE FROM buku WHERE stok = 0;
-- 8. Delete dengan multiple kondisi
DELETE FROM buku
WHERE kategori = 'Networking' AND stok < 5;
-- ========== RESTORE DATA ==========
-- Kalau sudah dihapus, insert lagi
INSERT INTO buku (kode_buku, judul, kategori, pengarang, penerbit, tahun_terbit, harga, stok)
VALUES
('BK-008', 'JavaScript Modern', 'Programming', 'Siti Aminah', 'Informatika', 2023, 80000, 5),
('BK-009', 'React Native Development', 'Programming', 'Ahmad Yani', 'Informatika', 2024, 135000, 10);
-- ========== SAFE DELETE (Soft Delete Simulation) ==========
-- Alternatif: Jangan delete, tapi tandai sebagai deleted
-- Tambah kolom is_deleted
ALTER TABLE buku
ADD COLUMN is_deleted BOOLEAN DEFAULT FALSE;
-- "Delete" dengan update
UPDATE buku
SET is_deleted = TRUE
WHERE id_buku = 9;
-- Query hanya yang tidak deleted
SELECT * FROM buku WHERE is_deleted = FALSE;â ī¸ Best Practice DELETE:
- Selalu gunakan WHERE
- Test dengan SELECT dulu sebelum DELETE
- Backup data sebelum operasi mass delete
- Pertimbangkan soft delete untuk data penting
6. PRAKTIKUM 5: Membuat Tabel Anggota dan Relasi
Tujuan
Membuat tabel anggota dan memahami konsep relasi antar tabel.
Langkah-langkah
a. Buat Tabel Anggota
CREATE TABLE anggota (
id_anggota INT AUTO_INCREMENT PRIMARY KEY,
kode_anggota VARCHAR(20) UNIQUE NOT NULL,
nama VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
telepon VARCHAR(15) NOT NULL,
alamat TEXT NOT NULL,
tanggal_lahir DATE NOT NULL,
jenis_kelamin ENUM('Laki-laki', 'Perempuan') NOT NULL,
pekerjaan VARCHAR(50),
tanggal_daftar DATE NOT NULL,
status ENUM('Aktif', 'Nonaktif') DEFAULT 'Aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);b. Insert Data Anggota
INSERT INTO anggota (kode_anggota, nama, email, telepon, alamat, tanggal_lahir, jenis_kelamin, pekerjaan, tanggal_daftar, status)
VALUES
('AGT-001', 'Budi Santoso', 'budi.santoso@email.com', '081234567890', 'Jl. Merdeka No. 10, Jakarta', '1995-05-15', 'Laki-laki', 'Mahasiswa', '2024-01-10', 'Aktif'),
('AGT-002', 'Siti Nurhaliza', 'siti.nur@email.com', '081234567891', 'Jl. Sudirman No. 25, Bandung', '1998-08-20', 'Perempuan', 'Pegawai', '2024-01-15', 'Aktif'),
('AGT-003', 'Ahmad Dhani', 'ahmad.dhani@email.com', '081234567892', 'Jl. Gatot Subroto No. 5, Surabaya', '1992-03-10', 'Laki-laki', 'Pegawai', '2024-02-01', 'Aktif'),
('AGT-004', 'Dewi Lestari', 'dewi.lestari@email.com', '081234567893', 'Jl. Ahmad Yani No. 30, Yogyakarta', '2000-12-05', 'Perempuan', 'Mahasiswa', '2024-02-10', 'Aktif'),
('AGT-005', 'Rizky Febian', 'rizky.feb@email.com', '081234567894', 'Jl. Diponegoro No. 15, Semarang', '1997-07-18', 'Laki-laki', 'Pelajar', '2024-02-15', 'Nonaktif');c. Query Anggota
-- Semua anggota aktif
SELECT * FROM anggota WHERE status = 'Aktif';
-- Anggota perempuan
SELECT * FROM anggota WHERE jenis_kelamin = 'Perempuan';
-- Anggota mahasiswa
SELECT * FROM anggota WHERE pekerjaan = 'Mahasiswa';
-- Hitung anggota per pekerjaan
SELECT pekerjaan, COUNT(*) as jumlah
FROM anggota
GROUP BY pekerjaan;
-- Anggota terdaftar bulan Februari
SELECT * FROM anggota
WHERE MONTH(tanggal_daftar) = 2 AND YEAR(tanggal_daftar) = 2024;
-- Hitung umur anggota
SELECT
nama,
tanggal_lahir,
YEAR(CURDATE()) - YEAR(tanggal_lahir) as umur
FROM anggota;d. Buat Tabel Transaksi (Preview untuk pertemuan selanjutnya)
CREATE TABLE transaksi (
id_transaksi INT AUTO_INCREMENT PRIMARY KEY,
id_buku INT NOT NULL,
id_anggota INT NOT NULL,
tanggal_pinjam DATE NOT NULL,
tanggal_kembali DATE,
tanggal_harus_kembali DATE NOT NULL,
status ENUM('Dipinjam', 'Dikembalikan', 'Terlambat') DEFAULT 'Dipinjam',
denda DECIMAL(10,2) DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (id_buku) REFERENCES buku(id_buku),
FOREIGN KEY (id_anggota) REFERENCES anggota(id_anggota)
);e. Insert Sample Transaksi
INSERT INTO transaksi (id_buku, id_anggota, tanggal_pinjam, tanggal_harus_kembali, status)
VALUES
(1, 1, '2024-02-01', '2024-02-08', 'Dipinjam'),
(2, 2, '2024-02-03', '2024-02-10', 'Dipinjam'),
(3, 1, '2024-01-25', '2024-02-01', 'Dikembalikan');f. Query dengan JOIN (Preview)
-- Tampilkan transaksi dengan detail buku dan anggota
SELECT
t.id_transaksi,
b.judul as nama_buku,
a.nama as nama_anggota,
t.tanggal_pinjam,
t.tanggal_harus_kembali,
t.status
FROM transaksi t
JOIN buku b ON t.id_buku = b.id_buku
JOIN anggota a ON t.id_anggota = a.id_anggota;E. TUGAS
Tugas 1: Eksplorasi Database dengan Query (40%)
Instruksi:
Gunakan database perpustakaan yang sudah dibuat. Buat file query_tugas.sql yang berisi query untuk kasus berikut:
Kasus yang harus diselesaikan:
-
Statistik Buku (5 query):
- Total buku seluruhnya
- Total nilai inventaris (sum harga à stok)
- Rata-rata harga buku
- Buku termahal (tampilkan judul dan harga)
- Buku dengan stok terbanyak
-
Filter dan Pencarian (5 query):
- Semua buku kategori Programming yang harga < 100.000
- Buku yang judulnya mengandung kata "PHP" atau "MySQL"
- Buku yang terbit tahun 2024
- Buku yang stoknya antara 5-10
- Buku yang pengarangnya "Budi Raharjo"
-
Grouping dan Agregasi (3 query):
- Jumlah buku per kategori (dengan total stok per kategori)
- Rata-rata harga per kategori
- Kategori dengan total nilai inventaris terbesar
-
Update Data (2 query):
- Naikkan harga semua buku kategori Programming sebesar 5%
- Tambah stok 10 untuk semua buku yang stoknya < 5
-
Laporan Khusus (2 query):
- Daftar buku yang perlu restocking (stok < 5)
- Top 5 buku termahal
Format Pengumpulan:
- Upload file SQL ke repository GitHub
- Setiap query diberi komentar menjelaskan fungsinya
- Screenshot hasil setiap query di phpMyAdmin (lampirkan di README)
Tugas 2: Desain Database Lengkap (60%)
Instruksi: Buat database perpustakaan yang lebih lengkap dengan menambahkan fitur-fitur berikut.
Spesifikasi:
-
Tabel yang harus dibuat:
- Tabel
kategori_buku(id, nama_kategori, deskripsi) - Tabel
penerbit(id, nama_penerbit, alamat, telepon, email) - Modifikasi tabel
bukuuntuk menggunakan foreign key kekategori_bukudanpenerbit
- Tabel
-
Struktur Tabel Kategori Buku:
CREATE TABLE kategori_buku (
id_kategori INT AUTO_INCREMENT PRIMARY KEY,
nama_kategori VARCHAR(50) NOT NULL UNIQUE,
deskripsi TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);- Struktur Tabel Penerbit:
CREATE TABLE penerbit (
id_penerbit INT AUTO_INCREMENT PRIMARY KEY,
nama_penerbit VARCHAR(100) NOT NULL,
alamat TEXT,
telepon VARCHAR(15),
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-
Modifikasi Tabel Buku:
- Ganti kolom
kategori(ENUM) menjadiid_kategori(INT) - Ganti kolom
penerbit(VARCHAR) menjadiid_penerbit(INT) - Tambahkan FOREIGN KEY
- Ganti kolom
-
Data yang harus diisi:
- Minimal 5 kategori
- Minimal 5 penerbit
- Minimal 15 buku dengan relasi yang benar
-
Query yang harus dibuat:
- JOIN untuk tampilkan buku dengan nama kategori dan penerbit
- Jumlah buku per kategori
- Jumlah buku per penerbit
- Buku beserta detail lengkap (kategori + penerbit)
Deliverables:
-
File SQL lengkap (
NIM_Nama_database.sql) berisi:- CREATE DATABASE
- CREATE TABLE semua tabel
- INSERT data sample
- Query JOIN
-
ERD (Entity Relationship Diagram):
- Gambar ERD (bisa pakai tools online atau gambar tangan)
- Tunjukkan relasi antar tabel
- Format: PDF atau gambar
-
Screenshot:
- Struktur semua tabel
- Data di setiap tabel
- Hasil query JOIN
Bonus (+10%):
- Tambah tabel
rakdengan relasi ke buku - Implement soft delete di semua tabel
- Buat stored procedure untuk operasi umum
Submission:
- Format: Link repository GitHub (berisi file SQL, ERD, dan screenshot)
- Deadline: Pertemuan 7
- Upload ke: Ngaji UIN Gusdur (submit link repository GitHub)
F. EVALUASI
1. Kuis Singkat (Dikerjakan di Kelas)
Soal Pilihan Ganda:
-
SQL untuk membuat database baru adalah:
- A. CREATE DB
- B. CREATE DATABASE
- C. NEW DATABASE
- D. MAKE DATABASE
-
Constraint untuk membuat nilai kolom unik adalah:
- A. PRIMARY KEY
- B. UNIQUE
- C. NOT NULL
- D. DISTINCT
-
Tipe data untuk menyimpan harga adalah:
- A. INT
- B. FLOAT
- C. DECIMAL
- D. VARCHAR
-
SQL untuk mengambil data adalah:
- A. GET
- B. READ
- C. SELECT
- D. FETCH
-
AUTO_INCREMENT digunakan untuk:
- A. Validasi data
- B. Increment otomatis
- C. Update otomatis
- D. Delete otomatis
-
Wildcard untuk LIKE yang match semua karakter:
- A. *
- B. ?
- C. %
- D. _
-
SQL untuk menghitung jumlah record:
- A. SUM()
- B. TOTAL()
- C. COUNT()
- D. NUMBER()
-
ORDER BY DESC artinya:
- A. Ascending
- B. Descending
- C. Description
- D. Describe
-
Constraint NOT NULL artinya:
- A. Boleh kosong
- B. Tidak boleh kosong
- C. Harus unik
- D. Harus angka
-
Foreign Key adalah:
- A. Kunci utama
- B. Kunci asing untuk relasi
- C. Kunci duplikat
- D. Kunci alternatif
Soal Essay:
-
Jelaskan perbedaan DDL dan DML! Berikan contoh masing-masing! (10 poin)
Jawaban tersedia di dokumen kunci jawaban dosen.
-
Buatlah query untuk membuat tabel buku dengan minimal 5 kolom! (15 poin)
Jawaban tersedia di dokumen kunci jawaban dosen.
-
Apa fungsi PRIMARY KEY? Mengapa setiap tabel sebaiknya memiliki PRIMARY KEY? (10 poin)
Jawaban tersedia di dokumen kunci jawaban dosen.
-
Buatlah query untuk mencari buku yang judulnya mengandung kata "PHP" dan harganya di bawah 100.000! (10 poin)
Jawaban tersedia di dokumen kunci jawaban dosen.
-
Jelaskan perbedaan UPDATE dan DELETE! Apa yang harus diperhatikan saat menggunakan keduanya? (15 poin)
Jawaban tersedia di dokumen kunci jawaban dosen.
2. Checklist Kompetensi
Self-Assessment:
| No | Kompetensi | Belum | Cukup | Mahir |
|---|---|---|---|---|
| 1 | Memahami konsep RDBMS | â | â | â |
| 2 | Membuat database dengan CREATE DATABASE | â | â | â |
| 3 | Membuat tabel dengan CREATE TABLE | â | â | â |
| 4 | Memahami tipe data MySQL | â | â | â |
| 5 | Menggunakan constraint (PK, NOT NULL, dll) | â | â | â |
| 6 | Insert data dengan INSERT | â | â | â |
| 7 | Query data dengan SELECT & WHERE | â | â | â |
| 8 | Menggunakan ORDER BY dan LIMIT | â | â | â |
| 9 | Update data dengan UPDATE | â | â | â |
| 10 | Delete data dengan DELETE | â | â | â |
| 11 | Menggunakan aggregate functions | â | â | â |
| 12 | Menggunakan phpMyAdmin | â | â | â |
Target: Minimal "Cukup" untuk semua poin sebelum lanjut ke pertemuan 7.
G. REFERENSI
1. Dokumentasi Resmi
- MySQL Documentation: https://dev.mysql.com/doc/ (opens in a new tab)
- MySQL Tutorial: https://dev.mysql.com/doc/mysql-tutorial-excerpt/8.0/en/ (opens in a new tab)
- MySQL Data Types: https://dev.mysql.com/doc/refman/8.0/en/data-types.html (opens in a new tab)
- MySQL Functions: https://dev.mysql.com/doc/refman/8.0/en/functions.html (opens in a new tab)
2. Tutorial Online
- W3Schools SQL Tutorial: https://www.w3schools.com/sql/ (opens in a new tab)
- MySQL Tutorial: https://www.mysqltutorial.org/ (opens in a new tab)
- SQLBolt (Interactive): https://sqlbolt.com/ (opens in a new tab)
- SQL Zoo (Practice): https://sqlzoo.net/ (opens in a new tab)
3. Video Tutorial (Rekomendasi)
- MySQL Tutorial for Beginners - freeCodeCamp (YouTube)
- MySQL Database Tutorial - Traversy Media (YouTube)
- Belajar MySQL - Web Programming UNPAS (YouTube)
4. Tools
- phpMyAdmin: https://www.phpmyadmin.net/ (opens in a new tab)
- MySQL Workbench: https://www.mysql.com/products/workbench/ (opens in a new tab)
- DB Designer: https://dbdiagram.io/ (opens in a new tab)
- Draw.io (ERD): https://app.diagrams.net/ (opens in a new tab)
H. CATATAN PENTING
Untuk Mahasiswa:
1. Best Practices SQL
â DO:
-- Gunakan huruf besar untuk keyword SQL
SELECT * FROM buku WHERE kategori = 'Programming';
-- Indent untuk readability
SELECT
judul,
pengarang,
harga
FROM buku
WHERE harga > 80000
ORDER BY harga DESC;
-- Selalu gunakan WHERE di UPDATE/DELETE
UPDATE buku
SET harga = 80000
WHERE id_buku = 1;
-- Gunakan LIMIT untuk test query
SELECT * FROM buku LIMIT 10;â DON'T:
-- Jangan UPDATE/DELETE tanpa WHERE
UPDATE buku SET harga = 0; -- BAHAYA! Semua harga jadi 0
DELETE FROM buku; -- BAHAYA! Semua data terhapus
-- Jangan SELECT * di production
SELECT * FROM buku; -- Boros, ambil kolom yang perlu saja
-- Jangan hardcode value di query (nanti kita pakai prepared statement)2. Common Mistakes
â Error 1: Lupa WHERE di UPDATE/DELETE
-- SALAH
DELETE FROM buku; // Hapus SEMUA data!
// BENAR
DELETE FROM buku WHERE id_buku = 5;â Error 2: Tipe Data Salah
-- SALAH
CREATE TABLE buku (
harga INT -- Tidak bisa simpan desimal
);
-- BENAR
CREATE TABLE buku (
harga DECIMAL(10,2) -- Bisa 99999999.99
);â Error 3: Lupa Semicolon
-- SALAH (di beberapa client)
SELECT * FROM buku
-- BENAR
SELECT * FROM buku;3. Security & Performance Tips
SQL Injection (akan dibahas detail di pertemuan 7):
// â VULNERABLE
$query = "SELECT * FROM buku WHERE judul = '$_POST[judul]'";
// â
SAFE (Prepared Statement)
$stmt = $conn->prepare("SELECT * FROM buku WHERE judul = ?");
$stmt->bind_param("s", $_POST['judul']);Performance:
- Gunakan index untuk kolom yang sering di-WHERE/ORDER BY
- LIMIT query untuk data besar
- Pilih kolom yang perlu saja, hindari SELECT *
- Gunakan EXPLAIN untuk analisis query
I. PERSIAPAN PERTEMUAN 7
Topik Pertemuan 7: PHP-MySQL Integration (CRUD Native)
Preview Materi:
- PHP mysqli extension
- Koneksi database
- Prepared statements
- Error handling database
- CRUD lengkap (Create, Read, Update, Delete)
- Mini project: Aplikasi CRUD Buku
Yang Perlu Disiapkan:
- Database perpustakaan sudah jadi (dari pertemuan ini)
- Pahami SQL INSERT, SELECT, UPDATE, DELETE
- Review form handling (pertemuan 5)
- Review function PHP (pertemuan 4)
Pre-reading:
- PHP mysqli: https://www.php.net/manual/en/book.mysqli.php (opens in a new tab)
- Prepared Statements: https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php (opens in a new tab)
Selamat Belajar! đī¸đ
End of Module - Pertemuan 6
Next: Pertemuan 7 - PHP-MySQL Integration (CRUD Native)