đŸ’ģ Pemrograman Web 2
🎓 Pertemuan
Pertemuan 6: Database MySQL

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

AspekKeterangan
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-CPMKSub-CPMK04.1.3: Mampu menjelaskan konsep pengelolaan data menggunakan database MySQL
Indikator PencapaianMahasiswa 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

  1. Mampu merancang struktur database yang baik
  2. Dapat membuat dan mengelola database dengan SQL
  3. Memahami relasi antar tabel
  4. Siap mengintegrasikan database dengan PHP
  5. 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):

AspekFileDatabase
StrukturTidak terstrukturTerstruktur (tabel)
QuerySulitMudah (SQL)
IntegritasTidak terjaminAda constraint
Concurrent AccessBermasalahAman (locking)
PerformanceLambat untuk data besarCepat (indexing)
RelasiSulitMudah (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:

  1. Buku

    • Data: kode, judul, pengarang, penerbit, tahun, harga, stok
  2. Anggota

    • Data: id, nama, email, telepon, alamat, tanggal daftar
  3. 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:

TipeKeteranganContoh
INTIntegerid, stok, tahun
VARCHAR(n)String variabel (max n)nama, judul
TEXTString panjangdeskripsi, alamat
DATETanggal (YYYY-MM-DD)tanggal_terbit
DATETIMETanggal + waktucreated_at
DECIMAL(m,d)Desimal (m digit, d decimal)harga
ENUMPilihan nilai tetapstatus: ('aktif','nonaktif')

Constraint Umum:

ConstraintKeterangan
PRIMARY KEYIdentitas unik, tidak boleh NULL, auto index
AUTO_INCREMENTOtomatis naik (untuk id)
NOT NULLTidak boleh kosong
UNIQUENilai harus unik
DEFAULTNilai default jika tidak diisi
FOREIGN KEYReferensi 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 = 2

Get Last Inserted ID:

SELECT LAST_INSERT_ID();

Set Auto Increment Value:

ALTER TABLE buku AUTO_INCREMENT = 100;

D. PRAKTIKUM

1. Tujuan Praktikum

  1. Membuat database perpustakaan
  2. Membuat tabel buku dan anggota
  3. Insert sample data
  4. Melakukan query SELECT dengan berbagai kondisi
  5. Update dan Delete data
  6. Memahami penggunaan phpMyAdmin

2. PRAKTIKUM 1: Membuat Database dan Tabel

Tujuan

Membuat database perpustakaan dengan tabel buku.

Langkah-langkah

a. Buka phpMyAdmin

  1. Start Apache dan MySQL di XAMPP
  2. Buka browser: http://localhost/phpmyadmin
  3. Login (default: username=root, password=kosong)

b. Buat Database

  1. Klik tab "Databases"
  2. Isi nama database: perpustakaan
  3. Collation: utf8mb4_unicode_ci
  4. 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 phpMyAdmin

Pastikan 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:

  1. 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
  2. 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"
  3. 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
  4. Update Data (2 query):

    • Naikkan harga semua buku kategori Programming sebesar 5%
    • Tambah stok 10 untuk semua buku yang stoknya < 5
  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:

  1. Tabel yang harus dibuat:

    • Tabel kategori_buku (id, nama_kategori, deskripsi)
    • Tabel penerbit (id, nama_penerbit, alamat, telepon, email)
    • Modifikasi tabel buku untuk menggunakan foreign key ke kategori_buku dan penerbit
  2. 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
);
  1. 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
);
  1. Modifikasi Tabel Buku:

    • Ganti kolom kategori (ENUM) menjadi id_kategori (INT)
    • Ganti kolom penerbit (VARCHAR) menjadi id_penerbit (INT)
    • Tambahkan FOREIGN KEY
  2. Data yang harus diisi:

    • Minimal 5 kategori
    • Minimal 5 penerbit
    • Minimal 15 buku dengan relasi yang benar
  3. 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:

  1. File SQL lengkap (NIM_Nama_database.sql) berisi:

    • CREATE DATABASE
    • CREATE TABLE semua tabel
    • INSERT data sample
    • Query JOIN
  2. ERD (Entity Relationship Diagram):

    • Gambar ERD (bisa pakai tools online atau gambar tangan)
    • Tunjukkan relasi antar tabel
    • Format: PDF atau gambar
  3. Screenshot:

    • Struktur semua tabel
    • Data di setiap tabel
    • Hasil query JOIN

Bonus (+10%):

  • Tambah tabel rak dengan 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:

  1. SQL untuk membuat database baru adalah:

    • A. CREATE DB
    • B. CREATE DATABASE
    • C. NEW DATABASE
    • D. MAKE DATABASE
  2. Constraint untuk membuat nilai kolom unik adalah:

    • A. PRIMARY KEY
    • B. UNIQUE
    • C. NOT NULL
    • D. DISTINCT
  3. Tipe data untuk menyimpan harga adalah:

    • A. INT
    • B. FLOAT
    • C. DECIMAL
    • D. VARCHAR
  4. SQL untuk mengambil data adalah:

    • A. GET
    • B. READ
    • C. SELECT
    • D. FETCH
  5. AUTO_INCREMENT digunakan untuk:

    • A. Validasi data
    • B. Increment otomatis
    • C. Update otomatis
    • D. Delete otomatis
  6. Wildcard untuk LIKE yang match semua karakter:

    • A. *
    • B. ?
    • C. %
    • D. _
  7. SQL untuk menghitung jumlah record:

    • A. SUM()
    • B. TOTAL()
    • C. COUNT()
    • D. NUMBER()
  8. ORDER BY DESC artinya:

    • A. Ascending
    • B. Descending
    • C. Description
    • D. Describe
  9. Constraint NOT NULL artinya:

    • A. Boleh kosong
    • B. Tidak boleh kosong
    • C. Harus unik
    • D. Harus angka
  10. Foreign Key adalah:

    • A. Kunci utama
    • B. Kunci asing untuk relasi
    • C. Kunci duplikat
    • D. Kunci alternatif

Soal Essay:

  1. Jelaskan perbedaan DDL dan DML! Berikan contoh masing-masing! (10 poin)

    Jawaban tersedia di dokumen kunci jawaban dosen.

  2. Buatlah query untuk membuat tabel buku dengan minimal 5 kolom! (15 poin)

    Jawaban tersedia di dokumen kunci jawaban dosen.

  3. Apa fungsi PRIMARY KEY? Mengapa setiap tabel sebaiknya memiliki PRIMARY KEY? (10 poin)

    Jawaban tersedia di dokumen kunci jawaban dosen.

  4. 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.

  5. 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:

NoKompetensiBelumCukupMahir
1Memahami konsep RDBMS○○○
2Membuat database dengan CREATE DATABASE○○○
3Membuat tabel dengan CREATE TABLE○○○
4Memahami tipe data MySQL○○○
5Menggunakan constraint (PK, NOT NULL, dll)○○○
6Insert data dengan INSERT○○○
7Query data dengan SELECT & WHERE○○○
8Menggunakan ORDER BY dan LIMIT○○○
9Update data dengan UPDATE○○○
10Delete data dengan DELETE○○○
11Menggunakan aggregate functions○○○
12Menggunakan phpMyAdmin○○○

Target: Minimal "Cukup" untuk semua poin sebelum lanjut ke pertemuan 7.


G. REFERENSI

1. Dokumentasi Resmi

2. Tutorial Online

3. Video Tutorial (Rekomendasi)

  • MySQL Tutorial for Beginners - freeCodeCamp (YouTube)
  • MySQL Database Tutorial - Traversy Media (YouTube)
  • Belajar MySQL - Web Programming UNPAS (YouTube)

4. Tools


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:

  1. PHP mysqli extension
  2. Koneksi database
  3. Prepared statements
  4. Error handling database
  5. CRUD lengkap (Create, Read, Update, Delete)
  6. Mini project: Aplikasi CRUD Buku

Yang Perlu Disiapkan:

  1. Database perpustakaan sudah jadi (dari pertemuan ini)
  2. Pahami SQL INSERT, SELECT, UPDATE, DELETE
  3. Review form handling (pertemuan 5)
  4. Review function PHP (pertemuan 4)

Pre-reading:


Selamat Belajar! đŸ—„ī¸đŸ“Š

End of Module - Pertemuan 6

Next: Pertemuan 7 - PHP-MySQL Integration (CRUD Native)