MySQL adalah sistem manajemen basis data relasional (RDBMS) open-source yang sangat banyak dipakai, mulai dari blog kecil hingga aplikasi skala besar. Data disimpan dalam tabel yang terdiri dari baris (record) dan kolom (field), dan diakses memakai bahasa SQL. Artikel ini membekalimu dengan dasar yang langsung bisa dipraktikkan.
Memasang MySQL
Pilih salah satu:
- XAMPP / Laragon (Windows, macOS): paket siap pakai berisi MySQL/MariaDB.
- Docker:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=rahasia -p 3306:3306 -d mysql:8 - Paket sistem:
sudo apt install mysql-serverdi Ubuntu.
Masuk lewat terminal:
mysql -u root -p
Untuk tampilan grafis, gunakan phpMyAdmin, DBeaver, atau TablePlus.
Membuat database dan tabel
CREATE DATABASE toko CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE toko;
CREATE TABLE produk (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
harga DECIMAL(12,2) NOT NULL DEFAULT 0,
stok INT NOT NULL DEFAULT 0,
dibuat_pada TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Perhatikan:
utf8mb4mendukung seluruh karakter Unicode termasuk emoji. Jangan pakaiutf8lama (hanya 3 byte).PRIMARY KEYmenjadi identitas unik tiap baris;AUTO_INCREMENTmengisinya otomatis.NOT NULLmelarang nilai kosong;DEFAULTmemberi nilai bawaan.
Tipe data yang paling sering dipakai
| Kategori | Tipe | Catatan |
|---|---|---|
| Bilangan bulat | INT, BIGINT, TINYINT | TINYINT(1) sering dipakai sebagai boolean |
| Desimal | DECIMAL(p,s) | Wajib untuk uang. Jangan pakai FLOAT |
| Teks pendek | VARCHAR(n) | Batas n karakter |
| Teks panjang | TEXT, LONGTEXT | Isi artikel, deskripsi |
| Tanggal & waktu | DATE, DATETIME, TIMESTAMP | TIMESTAMP mengikuti zona waktu server |
| Pilihan tetap | ENUM('draft','terbit') | Praktis, tetapi sulit diubah nanti |
| Data semi-terstruktur | JSON | Untuk data fleksibel |
Empat operasi dasar
INSERT: menambah data
INSERT INTO produk (nama, harga, stok)
VALUES ('Pensil 2B', 2500, 100),
('Buku Tulis', 7000, 50);
SELECT: membaca data
SELECT * FROM produk; -- semua kolom
SELECT nama, harga FROM produk WHERE stok > 0; -- kolom tertentu dengan syarat
SELECT * FROM produk ORDER BY harga DESC LIMIT 5;
UPDATE: mengubah data
UPDATE produk SET harga = 3000 WHERE nama = 'Pensil 2B';
DELETE: menghapus data
DELETE FROM produk WHERE id = 2;
Aturan emas: selalu sertakanWHEREpadaUPDATEdanDELETE. TanpaWHERE, seluruh baris terpengaruh. Biasakan menjalankanSELECTdenganWHEREyang sama dulu untuk melihat baris apa yang akan terkena.
Operator dan fungsi yang berguna
SELECT * FROM produk WHERE harga BETWEEN 1000 AND 5000;
SELECT * FROM produk WHERE nama LIKE 'Pen%'; -- diawali "Pen"
SELECT * FROM produk WHERE id IN (1, 3, 5);
SELECT * FROM produk WHERE stok IS NULL; -- gunakan IS NULL, bukan = NULL
Agregasi dan pengelompokan
SELECT COUNT(*) AS jumlah_produk, AVG(harga) AS rata_harga, SUM(stok) AS total_stok
FROM produk;
SELECT kategori, COUNT(*) AS jumlah
FROM produk
GROUP BY kategori
HAVING COUNT(*) > 3;
WHERE memfilter baris sebelum dikelompokkan, HAVING memfilter hasil kelompok.
Relasi antar tabel dan JOIN
Data yang baik dipecah ke beberapa tabel lalu dihubungkan. Contoh pesanan dan pelanggan:
SELECT p.id, pl.nama AS pelanggan, p.total
FROM pesanan p
INNER JOIN pelanggan pl ON pl.id = p.pelanggan_id;
INNER JOIN: hanya baris yang punya pasangan di kedua tabel.LEFT JOIN: semua baris tabel kiri, meski tidak ada pasangannya (kolom kanan bernilai NULL).
Penjelasan lebih dalam tentang kunci yang menghubungkan tabel ada di artikel Memahami Primary Key dan Foreign Key.
Kebiasaan aman
- Backup rutin:
mysqldump -u root -p toko > toko.sql, dan uji bahwa backup bisa dipulihkan. - Jangan memakai akun root di aplikasi. Buat user khusus dengan hak akses secukupnya.
- Gunakan prepared statement (otomatis di Laravel/PDO) untuk mencegah SQL injection. Jangan menyambung string input pengguna ke dalam SQL.
- Gunakan transaksi untuk beberapa perubahan yang harus berhasil bersama (
START TRANSACTION; ... COMMIT;). - Beri nama konsisten: huruf kecil dengan underscore (
tanggal_lahir).
Latihan mandiri
- Buat database
sekolahdengan tabelsiswa(id, nama, kelas, nilai). - Isi 10 baris data.
- Tampilkan siswa dengan nilai di atas rata-rata (subquery:
WHERE nilai > (SELECT AVG(nilai) FROM siswa)). - Hitung jumlah siswa per kelas.
- Tambahkan tabel
kelaslalu gabungkan dengan JOIN.
Contoh lengkap: toko kecil
Rancang tiga tabel: pelanggan, produk, dan pesanan.
CREATE TABLE pelanggan (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE
);
CREATE TABLE pesanan (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
pelanggan_id INT UNSIGNED NOT NULL,
produk_id INT UNSIGNED NOT NULL,
jumlah INT NOT NULL,
dibuat_pada TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (pelanggan_id) REFERENCES pelanggan(id),
FOREIGN KEY (produk_id) REFERENCES produk(id)
);
Pertanyaan bisnis dan query-nya:
-- 1. Total belanja tiap pelanggan, dari yang terbesar
SELECT pl.nama, SUM(pr.harga * ps.jumlah) AS total_belanja
FROM pesanan ps
JOIN pelanggan pl ON pl.id = ps.pelanggan_id
JOIN produk pr ON pr.id = ps.produk_id
GROUP BY pl.id, pl.nama
ORDER BY total_belanja DESC;
-- 2. Produk yang belum pernah dibeli
SELECT pr.nama
FROM produk pr
LEFT JOIN pesanan ps ON ps.produk_id = pr.id
WHERE ps.id IS NULL;
-- 3. Produk dengan stok menipis
SELECT nama, stok FROM produk WHERE stok < 10 ORDER BY stok;
NULL: nilai "tidak diketahui"
NULL bukan nol dan bukan string kosong. Perbandingan biasa dengan NULL tidak pernah benar:
SELECT * FROM produk WHERE stok = NULL; -- tidak menghasilkan apa pun
SELECT * FROM produk WHERE stok IS NULL; -- benar
Fungsi COALESCE(kolom, 0) mengganti NULL dengan nilai lain saat menampilkan.
Kesalahan umum pemula
| Kesalahan | Akibat | Solusi |
|---|---|---|
UPDATE/DELETE tanpa WHERE | Semua baris berubah/hilang | Tes dengan SELECT dulu, gunakan transaksi |
Memakai FLOAT untuk uang | Pembulatan tak terduga | Gunakan DECIMAL |
| Menyimpan banyak nilai dalam satu kolom ("1,2,3") | Sulit dicari dan di-join | Buat tabel relasi |
Tidak memakai utf8mb4 | Emoji dan karakter tertentu rusak | Atur charset saat membuat database |
| Menyambung string SQL dengan input pengguna | SQL injection | Prepared statement |
| Tidak membuat index pada kolom pencarian | Query lambat saat data besar | Lihat Index Database |
Kesimpulan
Dasar MySQL terdiri dari membuat tabel dengan tipe data yang tepat, menguasai INSERT, SELECT, UPDATE, DELETE, memahami JOIN dan agregasi, serta disiplin pada keamanan dan backup. Fondasi ini dipakai di hampir semua aplikasi web yang kamu bangun nanti.
Komentar (0)
Masuk / Daftar