Sejauh ini kita banyak memakai operator tanpa membahasnya secara sistematis: tanda + untuk menjumlah, || untuk menggabung teks, AND untuk menggabung kondisi. Chapter ini merapikan seluruh peta operator PostgreSQL beserta aturan prioritasnya — pemahaman yang mencegah kita salah menafsirkan hasil query yang tampak aneh. Kita akan menyusunnya dari operator aritmetika paling akrab sampai gabungan kondisi yang bertingkat.
Operator Aritmetika #
PostgreSQL menyediakan enam operator aritmetika untuk tipe numerik. Perilakunya mengikuti tipe operand: hasil operasi integer tetap integer, sedangkan salah satu operand pecahan membuat hasil menjadi pecahan.
| Operator | Arti | Contoh | Hasil |
|---|---|---|---|
+ | Penjumlahan | 7 + 3 | 10 |
- | Pengurangan | 7 - 3 | 4 |
* | Perkalian | 7 * 3 | 21 |
/ | Pembagian | 7 / 2 | 3 |
% | Sisa pembagian | 7 % 2 | 1 |
^ | Perpangkatan | 2 ^ 10 | 1024 |
Satu baris pada tabel di atas menyimpan jebakan klasik: 7 / 2 menghasilkan 3, bukan 3.5, karena kedua operand bertipe integer sehingga PostgreSQL memotong bagian pecahannya. Perhatikan demonstrasi berikut, lalu bandingkan dengan 7.0 / 2 yang menghasilkan pecahan karena satu operand sudah numeric:
SELECT 7 + 3 AS tambah,
7 - 3 AS kurang,
7 * 3 AS kali;
SELECT 7 / 2 AS bagi_bulat,
7 % 2 AS sisa,
7.0 / 2 AS bagi_pecahan;
SELECT 'Budi' || ' dan ' || 'Siti' AS nama_gabung;Output yang Dihasilkan:
tambah | kurang | kali
--------+--------+------
10 | 4 | 21
(1 row)
bagi_bulat | sisa | bagi_pecahan
------------+------+--------------------
3 | 1 | 3.5000000000000000
(1 row)
nama_gabung
---------------
Budi dan Siti
(1 row)Mari kita bedah tiga pernyataan dalam file tersebut:
- Pernyataan pertama mengevaluasi tiga operator dasar sekaligus. Ketiganya menghasilkan integer karena kedua operand setiap operasi bertipe integer.
- Pernyataan kedua memperlihatkan perbedaan pembagian:
7 / 2menghasilkan3(integer division), sementara7.0 / 2menghasilkan3.5000karena operand kiri numeric mempromosikan seluruh perhitungan ke tipe numeric. Operator%mengembalikan sisa1. - Pernyataan ketiga memakai operator
||yang bekerja pada teks, bukan angka — menggabung tiga potongan string menjadi satu kolom hasil.
Operator String dan Unary #
Untuk teks, operator utama adalah || (konkatenasi) yang sudah kita lihat di atas. Sementara itu, tanda minus bisa bekerja sebagai operator unary — operator yang hanya butuh satu operand di kanannya. Kombinasi keduanya dengan function seperti abs() dan factorial() memperlihatkan ekspresi yang lebih beragam:
SELECT 2 ^ 10 AS pangkat,
abs(-15) AS nilai_mutlak,
-abs(15) AS unary_negatif,
factorial(5) AS faktorial;Output yang Dihasilkan:
pangkat | nilai_mutlak | unary_negatif | faktorial
---------+--------------+---------------+-----------
1024 | 15 | -15 | 120
(1 row)Dua hal menarik dari contoh ini: abs(-15) mengembalikan nilai mutlak 15, lalu operator unary minus diterapkan kembali pada hasilnya lewat -abs(15) sehingga menjadi -15 — tanda minus di depan function tetap berupa operator, bukan bagian dari angka. Operator ^ menghitung perpangkatan 1024, dan factorial(5) menghitung 120.
Prioritas Operator #
Ketika satu ekspresi memuat banyak operator, PostgreSQL tidak mengevaluasi dari kiri ke kanan begitu saja. Setiap operator punya tingkat prioritas, dan operator dengan prioritas lebih tinggi dihitung lebih dulu. Tabel berikut merangkum urutannya dari yang tertinggi:
| Prioritas | Operator | Contoh |
|---|---|---|
| Tertinggi | . (akses kolom tabel) | t.nama |
:: (cast) | harga::text | |
unary - | -stok | |
^ | harga ^ 2 | |
*, /, % | harga * stok | |
+, - biner | harga + ppn | |
| (operator lain, ` | ||
<, >, =, <=, >=, <> | harga > 5000 | |
IS, IS NULL, IS NOT NULL | promo IS NULL | |
NOT | NOT aktif | |
AND | aktif AND stok > 0 | |
| Terendah | OR | aktif OR promo |
Konsekuensi paling sering mengejutkan pemula: perkalian dihitung sebelum penjumlahan, dan AND mengikat lebih kuat daripada OR (topik yang kita bedah tuntas di chapter AND OR NOT). Demonstrasi berikut memperlihatkan efek kurung pada urutan hitung:
SELECT 2 + 3 * 4 AS tanpa_kurung,
(2 + 3) * 4 AS dengan_kurung;
SELECT (1 = 1) AND (2 < 1 OR 3 > 2) AS logika_bertingkat;Output yang Dihasilkan:
tanpa_kurung | dengan_kurung
--------------+---------------
14 | 20
(1 row)
logika_bertingkat
-------------------
t
(1 row)Tanpa kurung, 3 * 4 dihitung lebih dulu sehingga 2 + 12 menghasilkan 14. Dengan kurung, 2 + 3 dihitung lebih dulu menjadi 5, lalu 5 * 4 menghasilkan 20. Pernyataan kedua menggabung perbandingan dan logika: (1 = 1) benar, (2 < 1 OR 3 > 2) juga benar karena salah satu operandnya benar, sehingga AND menghasilkan true.
Ekspresi pada Kolom Tabel #
Seluruh contoh di atas mengevaluasi konstanta. Kekuatan sesungguhnya muncul ketika ekspresi diterapkan pada kolom tabel: kita bisa menghitung nilai turunan tanpa menyimpannya. File berikut membuat tabel kecil, lalu menghitung nilai persediaan dan pajak per unit langsung dari kolom yang ada:
CREATE TABLE barang (
id integer PRIMARY KEY,
nama text NOT NULL,
harga numeric(10, 2) NOT NULL,
stok integer NOT NULL
);
INSERT INTO barang (id, nama, harga, stok) VALUES
(1, 'Buku Tulis', 4500, 120),
(2, 'Pulpen Hitam', 3000, 75),
(3, 'Kertas HVS A4', 55000, 12);
SELECT nama,
harga * stok AS nilai_persediaan,
round(harga * 0.11, 2) AS ppn_per_unit
FROM barang
ORDER BY id;Output yang Dihasilkan:
CREATE TABLE
INSERT 0 3
nama | nilai_persediaan | ppn_per_unit
---------------+------------------+--------------
Buku Tulis | 540000.00 | 495.00
Pulpen Hitam | 225000.00 | 330.00
Kertas HVS A4 | 660000.00 | 6050.00
(3 rows)Tiga hal yang layak dicermati dari query terakhir:
harga * stok: perkalian kolom numeric dengan integer menghasilkan numeric, sehingga4500.00 * 120menghasilkan540000.00tanpa galat pembulatan — alasan tipe numeric dipilih untuk kolom uang (lihat Section Tipe Data).round(harga * 0.11, 2): ekspresi boleh menjadi argument function. Kita menghitung PPN 11% per unit lalu membulatkan ke dua desimal.- Alias
ASmemberi nama sementara pada kolom hasil sehingga output terbaca jelas; alias juga bisa dipakai diORDER BYsepertiORDER BY nilai_persediaan.
Ketika Tipe Tidak Cocok #
Operator hanya menerima operand dengan tipe yang bisa dioperasikan. Menjumlahkan teks dengan angka ditolak langsung oleh PostgreSQL — tidak ada konversi diam-diam seperti yang terjadi pada beberapa bahasa pemrograman:
SELECT 'lima' + 3;Output yang Dihasilkan:
psql:error-bagi-string.sql:1: ERROR: invalid input syntax for type integer: "lima"
LINE 1: SELECT 'lima' + 3;
^Pesan operator does not exist: text + integer memberi tahu dua hal sekaligus: nama operator yang gagal dan kombinasi tipe operand yang tidak dikenal. Solusinya adalah konversi eksplisit — topik yang kita bahas mendalam pada dua chapter berikutnya: Fungsi Konversi Tipe Data untuk sintaks dasarnya, lalu Type Casting untuk aturan konteks implisit dan eksplisitnya.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
aritmetika.sql
Unduh berkasSELECT 7 + 3 AS tambah,
7 - 3 AS kurang,
7 * 3 AS kali;
SELECT 7 / 2 AS bagi_bulat,
7 % 2 AS sisa,
7.0 / 2 AS bagi_pecahan;
SELECT 'Budi' || ' dan ' || 'Siti' AS nama_gabung;
ekspresi-kolom.sql
Unduh berkasCREATE TABLE barang (
id integer PRIMARY KEY,
nama text NOT NULL,
harga numeric(10, 2) NOT NULL,
stok integer NOT NULL
);
INSERT INTO barang (id, nama, harga, stok) VALUES
(1, 'Buku Tulis', 4500, 120),
(2, 'Pulpen Hitam', 3000, 75),
(3, 'Kertas HVS A4', 55000, 12);
SELECT nama,
harga * stok AS nilai_persediaan,
round(harga * 0.11, 2) AS ppn_per_unit
FROM barang
ORDER BY id;
error-bagi-string.sql
Unduh berkasSELECT 'lima' + 3;
pangkat-unary.sql
Unduh berkasSELECT 2 ^ 10 AS pangkat,
abs(-15) AS nilai_mutlak,
-abs(15) AS unary_negatif,
factorial(5) AS faktorial;
precedence.sql
Unduh berkasSELECT 2 + 3 * 4 AS tanpa_kurung,
(2 + 3) * 4 AS dengan_kurung;
SELECT (1 = 1) AND (2 < 1 OR 3 > 2) AS logika_bertingkat;