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:

idnama_kategori
1Elektronik
2Pakaian

Tabel produk:

idnama_produkkategori_idharga
101Laptop15000
102Kemeja2150
103SepatuNULL300

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) →.