1. Pengenalan MySQL
MySQL adalah sistem manajemen database relasional (RDBMS) open-source yang paling populer di dunia. Dikembangkan oleh MySQL AB (sekarang dimiliki oleh Oracle Corporation), MySQL telah menjadi tulang punggung jutaan aplikasi web β dari WordPress, Drupal, hingga platform besar seperti Facebook, Twitter, dan YouTube.
MySQL menggunakan bahasa SQL (Structured Query Language) untuk mengelola data. SQL adalah bahasa standar yang digunakan oleh hampir semua database relasional, sehingga keterampilan SQL yang Anda pelajari di MySQL bisa diterapkan di database lain.
Mengapa Belajar MySQL?
| Alasan | Penjelasan |
|---|---|
| Paling Populer | MySQL digunakan oleh lebih dari 39% developer di seluruh dunia (Stack Overflow Survey) |
| Gratis & Open Source | Tersedia di bawah lisensi GPL β bebas digunakan dan dimodifikasi |
| Cepat & Handal | Dioptimalkan untuk operasi read-heavy dan web applications |
| Mudah Dipelajari | Sintaks SQL yang intuitif dan dokumentasi yang melimpah |
| Ekosistem Besar | Didukung oleh semua bahasa pemrograman, hosting, dan framework |
| Dukungan XAMPP/WAMP | Terintegrasi langsung dengan XAMPP, WAMP, MAMP untuk development lokal |
MySQL vs Database Lain
| Fitur | MySQL | PostgreSQL | MariaDB |
|---|---|---|---|
| Pengembang | Oracle | PostgreSQL Global Dev | MariaDB Foundation |
| Lisensi | GPL (komersial tersedia) | PostgreSQL License | GPL |
| Fokus | Kecepatan, kemudahan | Fitur lengkap, standar | Kompatibel MySQL |
| JSON Support | Dasar | JSONB kaya fitur | Dasar |
| Cocok untuk | CMS, web app, e-commerce | Enterprise, analytics | Drop-in replacement MySQL |
Jika Anda menggunakan XAMPP, MySQL sudah terinstal otomatis bersama Apache dan PHP. Cukup jalankan XAMPP Control Panel, start Apache dan MySQL, lalu buka http://localhost/phpmyadmin untuk mulai mengelola database.
2. Instalasi & Setup
Metode Instalasi
# ====== METODE 1: XAMPP (Paling Mudah untuk Pemula) ====== # Download XAMPP dari https://www.apachefriends.org/ # Jalankan installer, centang MySQL # Start MySQL dari XAMPP Control Panel # Buka http://localhost/phpmyadmin # ====== METODE 2: Ubuntu/Debian ====== sudo apt update sudo apt install mysql-server mysql-client # Jalankan service sudo systemctl start mysql sudo systemctl enable mysql # Konfigurasi keamanan awal sudo mysql_secure_installation # - Set root password: Ya # - Remove anonymous users: Ya # - Disallow root login remotely: Ya # - Remove test database: Ya # - Reload privilege tables: Ya # Masuk ke MySQL shell mysql -u root -p # ====== METODE 3: macOS (Homebrew) ====== brew install mysql brew services start mysql mysql -u root -p # ====== METODE 4: Docker ====== docker run --name mysql-dev \ -e MYSQL_ROOT_PASSWORD=rahasia123 \ -e MYSQL_DATABASE=belajar_db \ -e MYSQL_USER=developer \ -e MYSQL_PASSWORD=devpass123 \ -p 3306:3306 \ -d mysql:8.0 # Masuk ke container docker exec -it mysql-dev mysql -u developer -p belajar_db
Setup Database Pertama
-- Buat database baru CREATE DATABASE belajar_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- Pilih database USE belajar_db; -- Buat user baru CREATE USER 'developer'@'localhost' IDENTIFIED BY 'rahasia123'; -- Berikan hak akses GRANT ALL PRIVILEGES ON belajar_db.* TO 'developer'@'localhost'; FLUSH PRIVILEGES; -- Cek database yang ada SHOW DATABASES; -- Cek tabel dalam database SHOW TABLES; -- Cek versi MySQL SELECT VERSION(); -- Keluar dari MySQL EXIT;
3. Basic Queries (CRUD)
Mari kita pelajari operasi CRUD (Create, Read, Update, Delete) β operasi paling fundamental dalam MySQL.
CREATE β Membuat Tabel & Menambah Data
-- Membuat tabel produk
CREATE TABLE produk (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_produk VARCHAR(200) NOT NULL,
deskripsi TEXT,
harga DECIMAL(12,2) NOT NULL DEFAULT 0,
stok INT NOT NULL DEFAULT 0,
kategori VARCHAR(100),
aktif BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Insert satu baris
INSERT INTO produk (nama_produk, harga, stok, kategori)
VALUES ('Laptop ASUS ROG', 15000000, 10, 'Elektronik');
-- Insert multiple baris
INSERT INTO produk (nama_produk, harga, stok, kategori) VALUES
('Keyboard Mekanik', 850000, 25, 'Aksesoris'),
('Mouse Gaming', 450000, 30, 'Aksesoris'),
('Monitor 27 inch', 3500000, 8, 'Elektronik'),
('Kaos Polos', 85000, 100, 'Pakaian'),
('Headset Gaming', 650000, 15, 'Aksesoris');
-- Insert dari SELECT (salin data)
CREATE TABLE produk_elektronik AS
SELECT * FROM produk WHERE kategori = 'Elektronik';
READ β Membaca Data
-- Select semua data
SELECT * FROM produk;
-- Select kolom tertentu
SELECT nama_produk, harga, stok FROM produk;
-- WHERE β filter data
SELECT nama_produk, harga FROM produk
WHERE harga > 1000000 AND aktif = TRUE;
-- LIKE β pencarian pattern
SELECT nama_produk FROM produk
WHERE nama_produk LIKE '%Gaming%'; -- Mengandung "Gaming"
WHERE nama_produk LIKE 'Mouse%'; -- Dimulai dengan "Mouse"
-- IN β cek multiple values
SELECT nama_produk, harga FROM produk
WHERE kategori IN ('Elektronik', 'Aksesoris');
-- BETWEEN β range nilai
SELECT nama_produk, harga FROM produk
WHERE harga BETWEEN 100000 AND 1000000;
-- ORDER BY β urutkan
SELECT nama_produk, harga, stok FROM produk
ORDER BY harga DESC, nama_produk ASC;
-- LIMIT β batasi hasil
SELECT nama_produk, harga FROM produk
ORDER BY harga DESC
LIMIT 5; -- 5 produk termahal
-- GROUP BY & Aggregate Functions
SELECT
kategori,
COUNT(*) AS jumlah_produk,
AVG(harga) AS rata_rata_harga,
MIN(harga) AS harga_termurah,
MAX(harga) AS harga_termahal,
SUM(stok) AS total_stok
FROM produk
WHERE aktif = TRUE
GROUP BY kategori
HAVING COUNT(*) >= 2
ORDER BY rata_rata_harga DESC;
-- Alias kolom
SELECT
nama_produk AS 'Nama Produk',
CONCAT('Rp ', FORMAT(harga, 0)) AS 'Harga',
stok AS 'Stok Tersisa'
FROM produk;
-- Fungsi string
SELECT
UPPER(nama_produk) AS nama_upper,
LENGTH(nama_produk) AS panjang_nama,
LEFT(nama_produk, 10) AS singkat,
REPLACE(nama_produk, 'Gaming', 'Pro') AS nama_baru
FROM produk;
-- Fungsi tanggal
SELECT
nama_produk,
created_at,
DATE(created_at) AS tanggal,
DATEDIFF(NOW(), created_at) AS hari_yang_lalu,
DATE_FORMAT(created_at, '%d %M %Y') AS tanggal_format
FROM produk;
UPDATE & DELETE
-- Update harga satu produk UPDATE produk SET harga = 14500000 WHERE id = 1; -- Update multiple kolom UPDATE produk SET harga = 800000, stok = 30 WHERE nama_produk = 'Keyboard Mekanik'; -- Diskon 10% untuk semua aksesoris UPDATE produk SET harga = harga * 0.90 WHERE kategori = 'Aksesoris'; -- Nonaktifkan produk yang stoknya habis UPDATE produk SET aktif = FALSE WHERE stok = 0 AND aktif = TRUE; -- Hapus satu produk DELETE FROM produk WHERE id = 7; -- Hapus semua produk nonaktif DELETE FROM produk WHERE aktif = FALSE; -- β οΈ HATI-HATI: DELETE tanpa WHERE! -- Selalu cek dengan SELECT dulu sebelum DELETE -- SELECT * FROM produk WHERE ...; -- Cek dulu -- DELETE FROM produk WHERE ...; -- Baru hapus
MySQL Workbench dan beberapa GUI tools mengaktifkan safe update mode secara default. Mode ini mencegah UPDATE atau DELETE tanpa WHERE clause pada kolom key. Untuk menonaktifkan: SET SQL_SAFE_UPDATES = 0; β tapi berhati-hatilah!
4. Tipe Data MySQL
MySQL memiliki berbagai tipe data untuk menyimpan berbagai jenis informasi. Memilih tipe data yang tepat sangat penting untuk efisiensi penyimpanan dan performa query.
Tipe Data Numerik
| Tipe | Ukuran | Rentang | Contoh Penggunaan |
|---|---|---|---|
| TINYINT | 1 byte | -128 s/d 127 | Status, flag boolean |
| SMALLINT | 2 bytes | -32768 s/d 32767 | Jumlah item kecil |
| INT | 4 bytes | -2.1B s/d 2.1B | ID, jumlah umum |
| BIGINT | 8 bytes | Sangat besar | ID besar, timestamp |
| DECIMAL(p,s) | Variabel | Presisi tinggi | Harga uang (12,2) |
| FLOAT | 4 bytes | Presisi rendah | Data ilmiah |
| DOUBLE | 8 bytes | Presisi sedang | Koordinat GPS |
Tipe Data Teks & Tanggal
| Tipe | Max Panjang | Contoh Penggunaan |
|---|---|---|
| CHAR(n) | 255 karakter (tetap) | Kode pos, jenis kelamin (L/P) |
| VARCHAR(n) | 65,535 karakter (variabel) | Nama, email, alamat |
| TEXT | 65,535 karakter | Deskripsi, konten artikel |
| LONGTEXT | 4 GB | Konten sangat panjang |
| ENUM | 65,535 values | Status: 'aktif','nonaktif' |
| DATE | - | Tanggal (YYYY-MM-DD) |
| DATETIME | - | Tanggal & waktu |
| TIMESTAMP | - | Auto timestamp |
| JSON | 1 GB | Data semi-struktur |
- Gunakan
DECIMAL(12,2)untuk menyimpan harga β jangan gunakan FLOAT karena masalah presisi - Gunakan
VARCHARbukanCHARuntuk teks dengan panjang bervariasi (lebih hemat penyimpanan) - Gunakan
INT UNSIGNEDjika nilai tidak pernah negatif (seperti ID) - Selalu gunakan
utf8mb4charset untuk mendukung emoji dan karakter Unicode
5. Relationships (Relasi)
Database relasional memiliki kekuatan utama dalam menghubungkan data antar tabel menggunakan relasi. Ada tiga jenis relasi utama: One-to-One, One-to-Many, dan Many-to-Many.
Jenis Relasi
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β JENIS-JENIS RELASI β β β β ONE-TO-ONE ONE-TO-MANY MANY-TO-MANY β β β β ββββββββββ ββββββββββ ββββββββββ β β β User β1ββββββ1βProfileβ βSiswa β β β ββββββββββ ββββββ¬ββββ βββββ¬βββββ β β β β β β β1 β* *β β β β ββββββΌβββββββββ β β ββββββΌββββ β Siswa_MK β β β β Pesananβ β(junction) β β β ββββββββββ ββββββ¬βββββββββ β β * β β β β* *β β β βββββββΌβββββββ β β βMata Kuliah β β β βββββββββββββββ β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Implementasi Relasi
-- ============================================
-- ONE-TO-MANY: Pelanggan β Pesanan
-- ============================================
CREATE TABLE pelanggan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
telepon VARCHAR(20),
alamat TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
CREATE TABLE pesanan (
id INT AUTO_INCREMENT PRIMARY KEY,
pelanggan_id INT NOT NULL,
tanggal DATE NOT NULL,
total DECIMAL(12,2) NOT NULL DEFAULT 0,
status ENUM('pending','diproses','dikirim','selesai','batal')
DEFAULT 'pending',
catatan TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (pelanggan_id) REFERENCES pelanggan(id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE pesanan_item (
id INT AUTO_INCREMENT PRIMARY KEY,
pesanan_id INT NOT NULL,
produk_id INT NOT NULL,
jumlah INT NOT NULL DEFAULT 1,
harga_satuan DECIMAL(12,2) NOT NULL,
subtotal DECIMAL(12,2) GENERATED ALWAYS AS (jumlah * harga_satuan) STORED,
FOREIGN KEY (pesanan_id) REFERENCES pesanan(id) ON DELETE CASCADE,
FOREIGN KEY (produk_id) REFERENCES produk(id) ON DELETE RESTRICT
) ENGINE=InnoDB;
-- Insert data contoh
INSERT INTO pelanggan (nama, email, telepon) VALUES
('Budi Santoso', 'budi@email.com', '08123456789'),
('Sari Dewi', 'sari@email.com', '08567890123'),
('Andi Pratama', 'andi@email.com', '08987654321');
INSERT INTO pesanan (pelanggan_id, tanggal, total, status) VALUES
(1, '2026-06-20', 15850000, 'selesai'),
(2, '2026-06-22', 450000, 'dikirim'),
(1, '2026-06-24', 900000, 'diproses');
INSERT INTO pesanan_item (pesanan_id, produk_id, jumlah, harga_satuan) VALUES
(1, 1, 1, 15000000),
(1, 2, 1, 850000),
(2, 3, 1, 450000),
(3, 6, 1, 650000),
(3, 5, 1, 85000);
-- ============================================
-- MANY-TO-MANY: Siswa β Mata Kuliah
-- ============================================
CREATE TABLE siswa (
id INT AUTO_INCREMENT PRIMARY KEY,
nim VARCHAR(20) UNIQUE NOT NULL,
nama VARCHAR(100) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE mata_kuliah (
id INT AUTO_INCREMENT PRIMARY KEY,
kode VARCHAR(10) UNIQUE NOT NULL,
nama VARCHAR(100) NOT NULL,
sks INT NOT NULL
) ENGINE=InnoDB;
-- Junction table (tabel penghubung)
CREATE TABLE siswa_mata_kuliah (
siswa_id INT NOT NULL,
mata_kuliah_id INT NOT NULL,
semester VARCHAR(10),
nilai DECIMAL(5,2),
PRIMARY KEY (siswa_id, mata_kuliah_id),
FOREIGN KEY (siswa_id) REFERENCES siswa(id) ON DELETE CASCADE,
FOREIGN KEY (mata_kuliah_id) REFERENCES mata_kuliah(id) ON DELETE CASCADE
) ENGINE=InnoDB;
Query dengan JOIN
-- INNER JOIN: Pesanan dengan nama pelanggan
SELECT
p.id AS no_pesanan,
pl.nama AS pelanggan,
p.tanggal,
p.total,
p.status
FROM pesanan p
INNER JOIN pelanggan pl ON p.pelanggan_id = pl.id
ORDER BY p.tanggal DESC;
-- Detail pesanan dengan item
SELECT
p.id AS no_pesanan,
pl.nama AS pelanggan,
pr.nama_produk,
pi.jumlah,
CONCAT('Rp ', FORMAT(pi.harga_satuan, 0)) AS harga,
CONCAT('Rp ', FORMAT(pi.subtotal, 0)) AS subtotal
FROM pesanan p
JOIN pelanggan pl ON p.pelanggan_id = pl.id
JOIN pesanan_item pi ON p.id = pi.pesanan_id
JOIN produk pr ON pi.produk_id = pr.id
WHERE p.id = 1;
-- LEFT JOIN: Semua pelanggan termasuk yang belum pernah pesan
SELECT
pl.nama,
COUNT(ps.id) AS jumlah_pesanan,
COALESCE(SUM(ps.total), 0) AS total_belanja
FROM pelanggan pl
LEFT JOIN pesanan ps ON pl.id = ps.pelanggan_id
GROUP BY pl.id, pl.nama
ORDER BY total_belanja DESC;
-- JOIN Many-to-Many: Nilai siswa per mata kuliah
SELECT
s.nim,
s.nama AS nama_siswa,
mk.nama AS mata_kuliah,
mk.sks,
sm.nilai
FROM siswa s
JOIN siswa_mata_kuliah sm ON s.id = sm.siswa_id
JOIN mata_kuliah mk ON sm.mata_kuliah_id = mk.id
ORDER BY s.nama, mk.nama;
6. phpMyAdmin
phpMyAdmin adalah tool berbasis web yang paling populer untuk mengelola database MySQL. Dengan antarmuka grafis yang intuitif, phpMyAdmin memudahkan Anda membuat database, tabel, menjalankan query, import/export data, dan banyak lagi β tanpa perlu menulis SQL secara manual.
Akses phpMyAdmin
- XAMPP: Buka
http://localhost/phpmyadmin - WAMP: Buka
http://localhost/phpmyadmin - MAMP: Buka
http://localhost:8888/phpMyAdmin - Default login: Username:
root, Password: (kosong di XAMPP)
Fitur Utama phpMyAdmin
| Fitur | Lokasi di phpMyAdmin | Fungsi |
|---|---|---|
| Buat Database | Tab "Databases" β Create database | Membuat database baru |
| Buat Tabel | Pilih database β "Structure" β Create table | Membuat tabel dengan GUI |
| SQL Query | Tab "SQL" di toolbar | Menulis dan menjalankan SQL manual |
| Insert Data | Pilih tabel β "Insert" tab | Menambah data melalui form |
| Browse Data | Pilih tabel β "Browse" tab | Melihat, edit, hapus data |
| Export | Tab "Export" | Export database/tabel ke SQL/CSV |
| Import | Tab "Import" | Import data dari file SQL/CSV |
| Relasi | Tab "Structure" β "Relation view" | Membuat foreign key relationship |
Tips Menggunakan phpMyAdmin
- Gunakan tab "SQL" untuk menulis query kompleks yang tidak bisa dilakukan melalui GUI
- Aktifkan "Relation view" di tabel untuk membuat foreign key secara visual
- Gunakan "Designer" tab untuk melihat diagram relasi antar tabel
- Gunakan "Export" secara berkala untuk backup database
- Di production, nonaktifkan phpMyAdmin atau lindungi dengan .htaccess
- Ubah password root default untuk keamanan β jangan biarkan kosong!
7. Backup & Restore
Backup database adalah praktik terpenting dalam manajemen database. Kehilangan data tanpa backup bisa berakibat fatal. MySQL menyediakan tool mysqldump untuk backup dan mysql untuk restore.
Backup dengan mysqldump
# ====== BACKUP ====== # Backup satu database mysqldump -u root -p belajar_db > backup_belajar_db.sql # Backup dengan timestamp mysqldump -u root -p belajar_db > "backup_$(date +%Y%m%d_%H%M%S).sql" # Backup satu tabel saja mysqldump -u root -p belajar_db produk pelanggan > backup_tabel.sql # Backup semua database mysqldump -u root -p --all-databases > backup_semua.sql # Backup dengan kompresi (hemat ruang) mysqldump -u root -p belajar_db | gzip > backup_belajar_db.sql.gz # Backup hanya struktur (tanpa data) mysqldump -u root -p --no-data belajar_db > backup_struktur.sql # Backup hanya data (tanpa struktur) mysqldump -u root -p --no-create-info belajar_db > backup_data.sql # Backup dari remote server mysqldump -h db.example.com -u root -p belajar_db > backup_remote.sql # ====== RESTORE ====== # Restore database mysql -u root -p belajar_db < backup_belajar_db.sql # Restore ke database baru mysql -u root -p -e "CREATE DATABASE belajar_db_restore;" mysql -u root -p belajar_db_restore < backup_belajar_db.sql # Restore dari file terkompresi gunzip < backup_belajar_db.sql.gz | mysql -u root -p belajar_db # ====== OTOMATASI BACKUP (Cron Job) ====== # Tambahkan ke crontab: crontab -e # Backup setiap hari jam 2 pagi 0 2 * * * mysqldump -u root -p*** belajar_db | gzip > /backups/db_$(date +\%Y\%m\%d).sql.gz # Hapus backup lebih dari 30 hari 0 3 * * * find /backups/ -name "*.sql.gz" -mtime +30 -delete
Backup dari phpMyAdmin
- Buka phpMyAdmin di browser
- Pilih database yang ingin di-backup
- Klik tab "Export"
- Pilih metode: Quick (default) atau Custom untuk opsi lanjutan
- Pilih format: SQL (standar), CSV, JSON, XML
- Klik "Go" β file akan di-download
8. Tips & Best Practices
Berikut tips dan best practices yang perlu Anda terapkan saat bekerja dengan MySQL:
-- ============================================
-- 1. SELALU gunakan PRIMARY KEY
-- ============================================
-- β Buruk
CREATE TABLE produk (nama VARCHAR(100), harga DECIMAL(10,2));
-- β
Baik
CREATE TABLE produk (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
harga DECIMAL(10,2) NOT NULL DEFAULT 0
);
-- ============================================
-- 2. Gunakan INDEX untuk kolom yang sering dicari
-- ============================================
CREATE INDEX idx_produk_kategori ON produk(kategori);
CREATE INDEX idx_pesanan_tanggal ON pesanan(tanggal);
CREATE INDEX idx_pesanan_status ON pesanan(status);
-- ============================================
-- 3. Gunakan ENUM untuk nilai yang terbatas
-- ============================================
-- β Buruk: VARCHAR yang bisa diisi apa saja
status VARCHAR(20)
-- β
Baik: ENUM membatasi pilihan
status ENUM('pending','diproses','dikirim','selesai','batal')
-- ============================================
-- 4. Gunakan TRANSACTIONS untuk operasi kompleks
-- ============================================
START TRANSACTION;
INSERT INTO pesanan (pelanggan_id, tanggal, total)
VALUES (1, CURDATE(), 100000);
SET @pesanan_id = LAST_INSERT_ID();
INSERT INTO pesanan_item (pesanan_id, produk_id, jumlah, harga_satuan)
VALUES (@pesanan_id, 1, 1, 100000);
UPDATE produk SET stok = stok - 1 WHERE id = 1;
COMMIT; -- Atau ROLLBACK jika ada error
-- ============================================
-- 5. Cek performa dengan EXPLAIN
-- ============================================
EXPLAIN SELECT * FROM pesanan WHERE pelanggan_id = 1;
EXPLAIN SELECT * FROM produk WHERE harga BETWEEN 100000 AND 500000;
-- ============================================
-- 6. Hindari SELECT * di production
-- ============================================
-- β Buruk: mengambil semua kolom
SELECT * FROM produk;
-- β
Baik: ambil hanya kolom yang dibutuhkan
SELECT nama_produk, harga FROM produk WHERE kategori = 'Elektronik';
- Tidak menggunakan PRIMARY KEY β setiap tabel harus punya primary key
- Menggunakan FLOAT untuk uang β gunakan DECIMAL untuk presisi
- SELECT * di production β ambil hanya kolom yang diperlukan
- Tidak backup β backup database secara teratur, minimal harian
- Password root kosong β selalu gunakan password yang kuat
- Tidak menggunakan FOREIGN KEY β FK menjaga integritas data
9. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang MySQL: