SELECT dan WHERE

Membaca kolom tertentu dan menyaring baris menggunakan operator perbandingan serta logika AND dan OR.

Daftar isi

Topik ini membahas bentuk query paling dasar, yaitu SELECT untuk membaca kolom dan WHERE untuk menyaring baris. Blok penyiapan membangun ulang dataset perpustakaan yang sama dengan topik sebelumnya, sehingga setiap keluaran dapat diulang persis. Setelah topik ini, pembaca mampu mengambil kolom tertentu, menyaring baris dengan operator perbandingan, dan menggabungkan syarat dengan logika boolean.

Blok penyiapan dataset#

bash
# siapkan ulang tabel dan data contoh untuk topik ini
PGOPTIONS='-c client_min_messages=warning' psql -q -U postgres -d perpustakaan <<'SQL'
DROP TABLE IF EXISTS peminjaman, buku, anggota, kategori CASCADE;
CREATE TABLE kategori (id SERIAL PRIMARY KEY, nama TEXT NOT NULL UNIQUE);
CREATE TABLE anggota (id SERIAL PRIMARY KEY, nama TEXT NOT NULL, email TEXT UNIQUE, bergabung DATE NOT NULL, aktif BOOLEAN NOT NULL DEFAULT TRUE);
CREATE TABLE buku (id SERIAL PRIMARY KEY, judul TEXT NOT NULL, penulis TEXT NOT NULL, tahun INTEGER NOT NULL, kategori_id INTEGER REFERENCES kategori(id));
CREATE TABLE peminjaman (id SERIAL PRIMARY KEY, anggota_id INTEGER NOT NULL REFERENCES anggota(id), buku_id INTEGER NOT NULL REFERENCES buku(id), tanggal_pinjam DATE NOT NULL, tanggal_kembali DATE);
INSERT INTO kategori (nama) VALUES ('Pemrograman'), ('Sains'), ('Sejarah'), ('Fiksi'), ('Statistika');
INSERT INTO anggota (nama, email, bergabung, aktif) VALUES ('Ali Rahman', '[email protected]', '2024-01-15', TRUE), ('Budi Santoso', '[email protected]', '2024-03-02', TRUE), ('Citra Kirana', '[email protected]', '2024-05-20', FALSE), ('Dewi Lestari', '[email protected]', '2024-08-11', TRUE), ('Eka Pratama', NULL, '2025-01-30', TRUE);
INSERT INTO buku (judul, penulis, tahun, kategori_id) VALUES ('Dasar Basis Data', 'Sari Wulandari', 2021, 1), ('Jaringan Komputer', 'Ahmad Fauzi', 2019, 1), ('Fisika untuk Pemula', 'Rina Marlina', 2020, 2), ('Kimia Organik', 'Rina Marlina', 2022, 2), ('Sejarah Nusantara', 'Bambang Wijaya', 2018, 3), ('Cerita Kota Lama', 'Nur Aisyah', 2023, 4), ('Statistika Terapan', 'Sari Wulandari', 2022, 5), ('Algoritma dan Struktur Data', 'Ahmad Fauzi', 2021, 1);
INSERT INTO peminjaman (anggota_id, buku_id, tanggal_pinjam, tanggal_kembali) VALUES (1, 1, '2025-03-01', '2025-03-15'), (1, 7, '2025-03-05', '2025-03-20'), (2, 3, '2025-03-10', NULL), (3, 5, '2025-02-20', '2025-03-01'), (2, 1, '2025-04-02', NULL), (4, 6, '2025-04-07', NULL), (5, 8, '2025-04-09', '2025-04-25'), (4, 2, '2025-05-01', NULL);
SQL

Membaca kolom dengan SELECT#

Bentuk paling sederhana adalah SELECT * FROM nama_tabel, yang membaca seluruh kolom dari seluruh baris. Tanda bintang nyaman untuk menjelajah, tetapi query produksi menyebutkan kolomnya secara eksplisit agar kebutuhan data jelas dan tampilannya stabil ketika tabel berubah.

bash
# baca kolom tertentu dari tabel anggota
psql -U postgres -d perpustakaan -c "SELECT nama, email, bergabung FROM anggota;"
text Keluaran
     nama     |       email       | bergabung
--------------+-------------------+------------
 Ali Rahman   | [email protected]   | 2024-01-15
 Budi Santoso | [email protected]  | 2024-03-02
 Citra Kirana | [email protected] | 2024-05-20
 Dewi Lestari | [email protected]  | 2024-08-11
 Eka Pratama  |                   | 2025-01-30
(5 rows)

Urutan kolom pada hasil mengikuti urutan yang disebut pada query, bukan urutan pada tabel. Kolom email milik Eka Pratama kosong karena datanya memang NULL, persoalan yang dibahas tuntas pada modul jenis data.

Menyaring baris dengan WHERE#

Klausa WHERE menyaring baris dengan sebuah ekspresi boolean, dan hanya baris yang bernilai benar yang ikut ke hasil. Operator perbandingannya adalah =, <> untuk tidak sama dengan, <, >, <=, dan >=, sedangkan nilai teks ditulis dalam tanda kutip tunggal.

bash
# anggota yang bergabung setelah pertengahan 2024
psql -U postgres -d perpustakaan -c "SELECT nama, bergabung FROM anggota WHERE bergabung > '2024-06-01';"
text Keluaran
     nama     | bergabung
--------------+------------
 Dewi Lestari | 2024-08-11
 Eka Pratama  | 2025-01-30
(2 rows)

Perbandingan tanggal memakai format teks YYYY-MM-DD yang diterjemahkan server ke jenis date. Untuk boolean, syaratnya ditulis langsung sebagai kolomnya, sehingga WHERE aktif sama maknanya dengan WHERE aktif = TRUE, sedangkan bentuk negatifnya adalah WHERE NOT aktif.

Menggabungkan syarat dengan AND dan OR#

Operator AND, OR, dan NOT menggabungkan syarat, dan tanda kurung menetapkan urutan penilaiannya. Tanpa tanda kurung, AND dinilai lebih dahulu daripada OR, kebiasaan yang sering melahirkan syarat yang tidak sesuai maksud penulisnya.

bash
# buku Rina Marlina yang terbit mulai 2021
psql -U postgres -d perpustakaan -c "SELECT judul, penulis, tahun FROM buku WHERE penulis = 'Rina Marlina' AND tahun >= 2021;"
text Keluaran
     judul     |   penulis    | tahun
---------------+--------------+-------
 Kimia Organik | Rina Marlina |  2022
(1 row)

Perbandingan string seperti penulis = 'Rina Marlina' bersifat persis, termasuk spasi dan kapitalisasinya. Ketika satu penulis mencocokkan banyak baris, setiap baris yang lolos syarat muncul terpisah, dan pemilahan urutannya adalah tugas ORDER BY pada topik tersendiri.

Pencocokan pola dengan LIKE dan ILIKE#

Operator LIKE mencocokkan teks dengan pola, di mana % mewakili sejumlah karakter apa pun dan _ mewakili tepat satu karakter. Versi tak peka kapitalnya adalah ILIKE, kependekan khas PostgreSQL yang praktis untuk pencarian nama.

bash
# buku dengan judul berawalan kata Algoritma
psql -U postgres -d perpustakaan -c "SELECT judul FROM buku WHERE judul LIKE 'Algoritma%';"
text Keluaran
            judul
-----------------------------
 Algoritma dan Struktur Data
(1 row)

LIKE peka huruf kapital, sehingga 'algoritma%' tidak menemukan apa pun pada data ini. Untuk pencarian teks yang lebih serius, PostgreSQL menyediakan pencarian teks penuh yang dibahas pada modul JSONB dan pencarian teks penuh.

Kesalahan umum#

Kesalahan pertama adalah membandingkan dengan NULL menggunakan =, misalnya WHERE email = NULL. Perbandingan itu tidak pernah benar karena NULL bukan nilai, dan bentuk yang tepat adalah WHERE email IS NULL, dibahas lengkap pada topik semantik NULL. Kesalahan kedua adalah lupa tanda kutip tunggal pada nilai, misalnya WHERE penulis = Rina, sehingga server menganggapnya sebagai nama kolom dan mengembalikan error kolom tidak ada.

Kesalahan ketiga adalah mencampur AND dan OR tanpa tanda kurung. Syarat aktif = FALSE OR bergabung > '2024-06-01' AND email IS NOT NULL dinilai sebagai satu syarat OR dengan satu syarat AND, bukan dua kelompok yang terlihat. Selalu kelompokkan maksud logis dalam tanda kurung agar query membaca seperti maksudnya.

Ringkasan#

  • SELECT menyebutkan kolom yang dibaca, dan menyebut kolom secara eksplisit lebih stabil daripada tanda bintang.
  • WHERE menyaring baris dengan ekspresi boolean, dan hanya nilai benar yang lolos ke hasil.
  • AND dinilai lebih dahulu daripada OR, sehingga kelompok syarat ditandai dengan tanda kurung.
  • LIKE mencocokkan pola dengan % dan _, sedangkan ILIKE menambahkan ketidakpekaan huruf kapital.

Referensi#