Bab 10: SQL Dasar (SELECT, WHERE, Filtering, Sorting)

Apa yang Akan Kamu Pahami Setelah Bab Ini
  • Anatomi klausa SQL dasar: SELECT (kolom), FROM (tabel), dan WHERE (filter baris).
  • Kombinasi filter kondisional menggunakan operator AND, OR, LIKE (wildcard %), dan BETWEEN.
  • Pengurutan data hasil query dengan ORDER BY (ASC/DESC) dan pembatasan baris dengan LIMIT.
  • Praktik penulisan sintaks SQL yang bersih, rapi, dan terstruktur untuk query kompleks.

Anatomi Query SELECT

Perintah paling dasar sekaligus paling sering dipakai dalam SQL adalah SELECT, yang berfungsi untuk mengambil dan menampilkan data dari sebuah tabel. Struktur paling sederhana dari perintah ini adalah SELECT nama_kolom FROM nama_tabel;. Perhatikan bahwa setiap perintah SQL biasanya diakhiri dengan tanda titik koma (;), yang menandakan akhir dari satu perintah, meskipun pada beberapa database client tanda ini terkadang bersifat opsional untuk satu perintah tunggal.

Sebagai ilustrasi, jika Belanjain memiliki tabel bernama pelanggan dengan kolom id_pelanggan, nama, alamat, dan nomor_telepon, dan kamu hanya ingin menampilkan kolom nama dan alamat saja, query yang ditulis adalah SELECT nama, alamat FROM pelanggan;. Jika kamu ingin menampilkan seluruh kolom yang ada tanpa perlu menuliskan nama setiap kolom satu per satu, kamu bisa menggunakan tanda bintang (*) sebagai representasi "seluruh kolom", sehingga querynya menjadi SELECT * FROM pelanggan;.

Satu kebiasaan penting yang perlu dibangun sejak awal adalah, meskipun tanda bintang (*) terlihat praktis karena bisa langsung menampilkan seluruh kolom tanpa perlu mengetik nama kolom satu per satu, dalam pekerjaan nyata sebaiknya kamu terbiasa menuliskan nama kolom secara eksplisit sesuai kebutuhan, terutama pada tabel dengan jumlah kolom yang sangat banyak, karena hal ini membuat query lebih jelas maksudnya bagi siapa pun yang membacanya kembali di kemudian hari, termasuk dirimu sendiri, dan juga lebih efisien secara performa karena database tidak perlu memproses kolom-kolom yang sebenarnya tidak dibutuhkan.

Memfilter Data dengan WHERE

Jika SELECT menentukan kolom apa yang ingin ditampilkan, WHERE berfungsi menentukan baris mana saja yang ingin ditampilkan, berdasarkan kondisi tertentu yang ditetapkan. Struktur penulisannya adalah SELECT nama_kolom FROM nama_tabel WHERE kondisi;. Perhatikan bahwa klausa WHERE selalu ditempatkan setelah FROM, sebuah urutan penulisan yang tetap dan tidak bisa diubah posisinya.

Sebagai ilustrasi, jika kamu ingin menampilkan data pelanggan yang berasal dari kota "Jakarta" saja dari tabel pelanggan yang memiliki kolom kota, querynya ditulis sebagai SELECT * FROM pelanggan WHERE kota = 'Jakarta';. Perhatikan bahwa nilai teks dalam SQL selalu ditulis di antara tanda kutip satu (' '), berbeda dengan nama kolom atau nama tabel yang ditulis tanpa tanda kutip. Kesalahan lupa menambahkan tanda kutip pada nilai teks adalah salah satu kesalahan paling umum bagi pemula yang baru belajar SQL, dan akan menghasilkan pesan error karena SQL akan menganggap "Jakarta" tanpa tanda kutip sebagai nama kolom atau objek lain, bukan sebagai nilai teks biasa.

WHERE mendukung berbagai operator perbandingan untuk data numerik maupun tanggal, seperti sama dengan (=), tidak sama dengan (<> atau !=), lebih besar dari (>), lebih besar dari atau sama dengan (>=), lebih kecil dari (<), dan lebih kecil dari atau sama dengan (<=). Sebagai ilustrasi, jika kamu ingin menampilkan data pesanan dari tabel pesanan dengan nilai transaksi lebih dari 500000, querynya ditulis sebagai SELECT * FROM pesanan WHERE nilai_transaksi > 500000;.

Menggabungkan Beberapa Kondisi dengan AND dan OR

Sama seperti SUMIFS dan COUNTIFS pada Spreadsheet yang bisa menerima banyak kriteria sekaligus, WHERE pada SQL juga bisa menggabungkan beberapa kondisi menggunakan operator logika AND dan OR. Operator AND berarti seluruh kondisi yang digabungkan harus terpenuhi bersamaan agar sebuah baris ditampilkan, sementara operator OR berarti baris akan ditampilkan jika setidaknya salah satu dari kondisi yang digabungkan terpenuhi.

Sebagai ilustrasi penggunaan AND, jika kamu ingin menampilkan data pesanan dengan nilai transaksi di atas 500000 dan berasal dari kota Jakarta, querynya ditulis sebagai SELECT * FROM pesanan WHERE nilai_transaksi > 500000 AND kota = 'Jakarta';. Kedua kondisi ini harus sama-sama terpenuhi agar sebuah baris ikut ditampilkan dalam hasil query.

Sebagai ilustrasi penggunaan OR, jika kamu ingin menampilkan data pesanan yang berasal dari kota Jakarta atau kota Surabaya, querynya ditulis sebagai SELECT * FROM pesanan WHERE kota = 'Jakarta' OR kota = 'Surabaya';. Perhatikan bahwa nama kolom kota perlu dituliskan ulang pada setiap kondisi, meskipun kolom yang diperiksa sama, karena SQL memproses setiap kondisi secara terpisah, tidak seperti menuliskan daftar nilai sekaligus seperti pada beberapa fitur di Spreadsheet.

Ketika AND dan OR digabungkan dalam satu query yang sama, penting memperhatikan urutan pemrosesan kondisi, karena bisa menghasilkan hasil yang berbeda tergantung bagaimana kondisi tersebut dikelompokkan menggunakan tanda kurung. Sebagai ilustrasi, jika kamu ingin menampilkan pesanan dari kota Jakarta atau Surabaya, namun keduanya harus memiliki nilai transaksi di atas 500000, querynya perlu ditulis dengan tanda kurung yang jelas seperti SELECT * FROM pesanan WHERE (kota = 'Jakarta' OR kota = 'Surabaya') AND nilai_transaksi > 500000;. Tanpa tanda kurung ini, SQL bisa saja menginterpretasikan kondisi dengan urutan yang berbeda, misalnya menampilkan seluruh data kota Jakarta tanpa syarat nilai transaksi, ditambah data kota Surabaya yang nilai transaksinya di atas 500000 saja, sebuah hasil yang tentu berbeda dari yang dimaksudkan.

LIKE: Mencari Pola Teks

Operator sama dengan (=) hanya bisa mencari kecocokan teks yang persis sama, namun sering kali kamu perlu mencari data berdasarkan pola tertentu, bukan kecocokan yang benar-benar persis. Di sinilah operator LIKE berperan, memungkinkan pencarian berdasarkan pola menggunakan simbol wildcard, yaitu simbol khusus yang mewakili karakter apa pun.

Simbol wildcard yang paling sering dipakai bersama LIKE adalah tanda persen (%), yang mewakili sejumlah karakter apa pun, termasuk tidak ada karakter sama sekali. Sebagai ilustrasi, jika kamu ingin mencari seluruh pelanggan yang namanya diawali dengan "Budi", querynya ditulis sebagai SELECT * FROM pelanggan WHERE nama LIKE 'Budi%';. Tanda persen setelah "Budi" berarti mencari nama apa pun yang diawali "Budi", diikuti karakter apa pun setelahnya, sehingga akan menemukan "Budi Santoso", "Budianto", maupun "Budi" itu sendiri tanpa tambahan apa pun.

Jika tanda persen diletakkan di kedua sisi, seperti WHERE nama LIKE '%budi%', pencarian akan menemukan seluruh nama yang mengandung kata "budi" di mana pun posisinya, baik di awal, tengah, maupun akhir nama tersebut. Pola pencarian seperti ini sangat berguna ketika kamu tidak yakin persis di posisi mana sebuah kata kunci berada dalam teks yang dicari, misalnya mencari seluruh alamat yang menyebutkan kata "Jakarta" tanpa peduli apakah kata tersebut muncul di awal, tengah, atau akhir alamat lengkap.

BETWEEN: Mencari Data dalam Rentang Nilai

Operator BETWEEN digunakan untuk mencari data yang berada dalam rentang nilai tertentu, baik rentang angka maupun rentang tanggal, dan menjadi alternatif yang lebih ringkas dibanding menuliskan dua kondisi terpisah menggunakan operator lebih besar dari atau sama dengan dan lebih kecil dari atau sama dengan yang digabungkan dengan AND. Struktur penulisannya adalah WHERE nama_kolom BETWEEN nilai_awal AND nilai_akhir.

Sebagai ilustrasi pencarian rentang angka, jika kamu ingin menampilkan data pesanan dengan nilai transaksi antara 100000 hingga 500000, querynya ditulis sebagai SELECT * FROM pesanan WHERE nilai_transaksi BETWEEN 100000 AND 500000;. Perlu diperhatikan bahwa BETWEEN bersifat inklusif, artinya nilai batas awal dan batas akhir yang disebutkan ikut termasuk dalam hasil pencarian, sehingga transaksi dengan nilai tepat 100000 maupun tepat 500000 akan tetap ikut ditampilkan.

BETWEEN juga sangat sering dipakai untuk mencari data dalam rentang tanggal tertentu. Sebagai ilustrasi, jika kamu ingin menampilkan data pesanan yang terjadi sepanjang bulan Januari 2026, querynya ditulis sebagai SELECT * FROM pesanan WHERE tanggal_pesanan BETWEEN '2026-01-01' AND '2026-01-31';. Perhatikan bahwa format penulisan tanggal dalam SQL umumnya mengikuti format tahun-bulan-tanggal (YYYY-MM-DD) yang ditulis dalam tanda kutip, format yang perlu diperhatikan agar tidak tertukar dengan format tanggal lain yang mungkin lebih familiar, misalnya format hari-bulan-tahun yang umum dipakai di Indonesia.

Mengurutkan Hasil dengan ORDER BY

Setelah data yang diinginkan berhasil difilter, sering kali kamu juga ingin menampilkan hasilnya dalam urutan tertentu, bukan urutan default sesuai bagaimana data tersimpan dalam tabel. Di sinilah ORDER BY berperan, memungkinkan pengurutan hasil query berdasarkan satu atau lebih kolom, baik secara menaik (ascending) maupun menurun (descending).

Struktur penulisannya adalah SELECT nama_kolom FROM nama_tabel ORDER BY nama_kolom [ASC atau DESC];, dengan ASC sebagai urutan menaik (dari kecil ke besar, atau dari A ke Z untuk teks) dan DESC sebagai urutan menurun (dari besar ke kecil, atau dari Z ke A untuk teks). Perlu diperhatikan bahwa jika kamu tidak menuliskan ASC maupun DESC secara eksplisit, SQL akan secara default mengurutkan secara menaik (ASC), sehingga kata kunci ASC sebenarnya opsional untuk urutan menaik, namun DESC wajib dituliskan jika kamu ingin urutan menurun.

Sebagai ilustrasi, jika kamu ingin menampilkan data pesanan Belanjain diurutkan dari nilai transaksi tertinggi ke terendah, querynya ditulis sebagai SELECT * FROM pesanan ORDER BY nilai_transaksi DESC;. ORDER BY juga bisa menggunakan lebih dari satu kolom sekaligus untuk pengurutan bertingkat, misalnya SELECT * FROM pesanan ORDER BY kota ASC, nilai_transaksi DESC;, yang akan mengurutkan data pertama-tama berdasarkan kota secara alfabetis, dan untuk pesanan-pesanan dalam kota yang sama, akan diurutkan lagi berdasarkan nilai transaksi dari yang tertinggi ke terendah.

Membatasi Jumlah Hasil dengan LIMIT

Ketika bekerja dengan tabel yang memiliki ribuan bahkan jutaan baris data, menampilkan seluruh hasil query sekaligus bisa menjadi tidak praktis, baik dari sisi kecepatan pemrosesan maupun kemudahan membaca hasilnya. LIMIT berfungsi membatasi jumlah baris yang ditampilkan dari hasil sebuah query, sangat berguna ketika kamu hanya ingin melihat sebagian data sebagai sampel, atau ketika dikombinasikan dengan ORDER BY untuk menemukan nilai tertinggi atau terendah tanpa perlu melihat keseluruhan data.

Sebagai ilustrasi, jika kamu ingin menampilkan sepuluh pesanan dengan nilai transaksi tertinggi dari seluruh data Belanjain, querynya menggabungkan ORDER BY dan LIMIT sekaligus, ditulis sebagai SELECT * FROM pesanan ORDER BY nilai_transaksi DESC LIMIT 10;. Query ini pertama-tama akan mengurutkan seluruh data berdasarkan nilai transaksi dari tertinggi ke terendah, kemudian hanya menampilkan sepuluh baris teratas dari hasil pengurutan tersebut, sebuah pola yang sangat sering dipakai untuk kebutuhan seperti menemukan produk terlaris, pelanggan dengan transaksi terbesar, atau kombinasi kebutuhan serupa lainnya.

Menyusun Query Kompleks: Menarik Data Pelanggan VIP

Untuk melihat bagaimana seluruh elemen yang sudah dibahas bisa digabungkan dalam satu query yang lebih kompleks, mari bayangkan skenario berikut. Tim manajemen Belanjain ingin mengidentifikasi pelanggan VIP, yang didefinisikan sebagai pelanggan dengan setidaknya satu transaksi bernilai di atas 1000000, berasal dari kota Jakarta atau Surabaya, dan transaksi tersebut terjadi dalam rentang bulan Januari 2026, dengan hasil diurutkan dari nilai transaksi tertinggi dan hanya ingin melihat dua puluh data teratas sebagai sampel awal.

Menggabungkan seluruh kebutuhan ini ke dalam satu query, hasilnya akan menjadi seperti berikut:

SELECT nama, kota, nilai_transaksi, tanggal_pesanan
FROM pesanan
WHERE nilai_transaksi > 1000000
  AND (kota = 'Jakarta' OR kota = 'Surabaya')
  AND tanggal_pesanan BETWEEN '2026-01-01' AND '2026-01-31'
ORDER BY nilai_transaksi DESC
LIMIT 20;

Perhatikan bagaimana query ini disusun rapi dengan setiap klausa (SELECT, FROM, WHERE, ORDER BY, LIMIT) ditulis pada baris terpisah, sebuah kebiasaan penulisan yang sangat disarankan terutama ketika query mulai memiliki banyak kondisi, karena akan jauh lebih mudah dibaca dan ditelusuri kembali dibanding menuliskan seluruh query dalam satu baris panjang yang sulit dipahami sekilas. Kebiasaan menulis SQL dengan format rapi seperti ini akan semakin penting seiring query yang kamu tulis menjadi semakin kompleks pada bab-bab berikutnya.

Rangkuman Bab
  • Sintaks Spesifik vs Asterisk: Memilih nama kolom secara eksplisit lebih disarankan daripada `SELECT *` demi efisiensi dan kejelasan.
  • Logika Pengelompokan: Penggunaan tanda kurung pada klausa `WHERE (A OR B) AND C` penting untuk menghindari interpretasi salah.
  • Filtering Lanjutan: `LIKE 'teks%'` mengekstrak pola string dan `BETWEEN` inklusif menyaring nilai angka/tanggal.
  • Urutan Eksekusi Penulisan: `SELECT` → `FROM` → `WHERE` → `ORDER BY` → `LIMIT` merupakan alur sintaks dasar yang baku.