SQL Lanjutan
Setelah menguasai CRUD dasar, kamu perlu tahu query SQL lanjutan untuk menangani skenario dunia nyata seperti pencarian, pengurutan, dan penggabungan tabel.
1. Pencarian & Filter (WHERE, LIKE)
Menggabungkan Kondisi (AND / OR)
-- Mencari pengguna yang aktif DAN tinggal di Jakarta
SELECT * FROM users WHERE status = 'aktif' AND kota = 'Jakarta';
-- Mencari produk elektronik ATAU pakaian
SELECT * FROM produk WHERE kategori = 'elektronik' OR kategori = 'pakaian';
Di PHP (PDO):
$stmt = $pdo->prepare("SELECT * FROM produk WHERE kategori = ? AND stok > ?");
$stmt->execute(['elektronik', 0]);
$produk = $stmt->fetchAll();
Pencarian Teks (LIKE)
LIKE digunakan untuk mencari teks yang mengandung kata tertentu. Tanda % mewakili karakter apa saja.
-- Berawalan 'Budi'
SELECT * FROM users WHERE nama LIKE 'Budi%';
-- Berakhiran 'gmail.com'
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- Mengandung kata 'sepatu' di mana saja
SELECT * FROM produk WHERE nama LIKE '%sepatu%';
Di PHP (PDO):
$keyword = 'sepatu';
$searchTerm = "%$keyword%"; // Tambahkan % di PHP
$stmt = $pdo->prepare("SELECT * FROM produk WHERE nama LIKE ?");
$stmt->execute([$searchTerm]);
$hasilCari = $stmt->fetchAll();
2. Pengurutan & Batasan (ORDER BY, LIMIT)
ORDER BY (Mengurutkan)
-- Mengurutkan dari termurah ke termahal (ASC - Ascending)
SELECT * FROM produk ORDER BY harga ASC;
-- Mengurutkan dari terbaru ke terlama (DESC - Descending)
SELECT * FROM artikel ORDER BY created_at DESC;
-- Mengurutkan multi-kolom (berdasarkan kategori dulu, baru harga)
SELECT * FROM produk ORDER BY kategori ASC, harga DESC;
LIMIT & OFFSET (Membatasi)
LIMIT membatasi jumlah data yang diambil. OFFSET melompati sejumlah data di awal.
-- Ambil 5 produk termahal
SELECT * FROM produk ORDER BY harga DESC LIMIT 5;
-- Ambil 10 produk, tapi lewati 20 produk pertama (untuk halaman 3)
SELECT * FROM produk LIMIT 10 OFFSET 20;
-- Bisa juga ditulis: LIMIT 20, 10 (OFFSET dulu, baru LIMIT)
3. Fungsi Agregasi (Menghitung)
SQL punya fungsi bawaan untuk menghitung data tanpa perlu melooping array di PHP.
-- Menghitung total jumlah user
SELECT COUNT(*) as total_user FROM users;
-- Menghitung total pendapatan (jumlahkan kolom harga)
SELECT SUM(harga) as pendapatan FROM pesanan;
-- Mencari harga rata-rata
SELECT AVG(harga) as rata_rata FROM produk;
-- Mencari harga termurah dan termahal
SELECT MIN(harga) as termurah, MAX(harga) as termahal FROM produk;
4. Pengelompokan (GROUP BY)
GROUP BY digabungkan dengan fungsi agregasi untuk mengelompokkan data.
-- Menghitung jumlah produk per kategori
SELECT kategori, COUNT(*) as jumlah_produk
FROM produk
GROUP BY kategori;
-- Total pendapatan per bulan
SELECT MONTH(tanggal_pesan) as bulan, SUM(total_harga) as pendapatan
FROM pesanan
GROUP BY MONTH(tanggal_pesan);
5. Penggabungan Tabel (JOIN)
Dalam database relasional, data sering dipisah ke beberapa tabel. Misalnya tabel users dan tabel pesanan. JOIN menggabungkan mereka.
Struktur Tabel Contoh:
Tabel kategori:
Tabel produk:
INNER JOIN
Hanya mengambil data yang punya pasangan di KEDUA tabel.
SELECT produk.nama_produk, produk.harga, kategori.nama_kategori
FROM produk
INNER JOIN kategori ON produk.kategori_id = kategori.id;
Hasil: Sepatu TIDAK muncul karena kategori_id-nya NULL.
LEFT JOIN
Mengambil SEMUA data dari tabel KIRI (produk), meskipun tidak punya pasangan di tabel KANAN (kategori).
SELECT produk.nama_produk, kategori.nama_kategori
FROM produk
LEFT JOIN kategori ON produk.kategori_id = kategori.id;
Hasil: Sepatu TETAP muncul, tapi nama_kategori-nya berisi NULL.
Di PHP (PDO):
$sql = "
SELECT p.id, p.nama_produk, p.harga, k.nama_kategori
FROM produk p
LEFT JOIN kategori k ON p.kategori_id = k.id
ORDER BY p.id DESC
";
$stmt = $pdo->query($sql);
$produkList = $stmt->fetchAll();
foreach ($produkList as $item) {
$kategori = $item['nama_kategori'] ?? 'Tanpa Kategori';
echo "{$item['nama_produk']} - Kategori: {$kategori} <br>";
}
(Catatan: p dan k adalah alias/singkatan untuk nama tabel agar query lebih pendek)
Selanjutnya
Dengan perintah SQL lanjutan ini, kita sudah bisa membuat fitur yang sangat umum di website: Pagination (Penomoran Halaman) →.