Ekspresi dan Alias

Kolom hasil perhitungan, fungsi bawaan, dan penamaan hasil dengan AS.

Daftar isi

Topik ini membahas ekspresi pada daftar SELECT, yaitu perhitungan yang dihitung untuk setiap baris, mulai dari aritmetika, penyambungan teks, hingga fungsi bawaan ringkas, lalu menutupnya dengan alias yang menamai hasil perhitungan tersebut. Datasetnya adalah tabel buku dan tabel peminjaman yang sudah dipakai di seluruh modul ini. Setelah membaca, kolom hasil perhitungan dapat dibentuk, dinamai, dan dirujuk kembali dengan aturan yang benar.

Dataset contoh#

Blok berikut membangun ulang tabel buku sebagai bahan seluruh contoh pada topik ini.

sql Pembuatan tabel buku
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT * FROM buku;
text Keluaran
1|Dasar Algoritma|Ali|2019|4
2|Peta Langit|Budi|2021|0
3|Dasar Algoritma|Citra|2021|2
4|Sejarah Kertas|Dewi|2019|3
5|Kode dan Sandi|Eka|2023|5
6|Jejak Angin|Farhan|2020|0
7|Peta Langit|Budi|2024|7

Daftar SELECT sejauh ini hanya berisi nama kolom, padahal setiap posisi di sana boleh diisi ekspresi apa pun yang menghasilkan satu nilai. Ekspresi tersebut dihitung terhadap kolom pada baris yang sedang diproses, sehingga hasilnya berbeda-beda antarbaris. Keluaran lengkap di atas menjadi titik pembanding untuk seluruh contoh berikutnya, karena setiap kolom tambahan yang muncul kelak adalah hasil hitung, bukan kolom tersimpan. Nama dan nilai pada tabel ini dijaga tetap sama di seluruh modul, sehingga keluaran yang dihasilkan setiap topik saling menjelaskan satu sama lain. Untuk menjalankan bloknya kembali, simpan pernyataannya sebagai berkas .sql lalu jalankan dengan sqlite3 pada basis data dalam memori, atau tempel langsung pada sesi interaktif sebagaimana topik-topik lain modul ini. Tabel peminjaman akan bergabung pada bagian fungsi bawaan untuk memperagakan perhitungan tanggal, dan bagian berikutnya memperagakan tiga jenis ekspresi, yaitu aritmetika, penyambungan teks, dan pemanggilan fungsi bawaan.

Ekspresi aritmetika#

Operator +, -, *, /, dan % bekerja pada kolom sebagaimana pada angka biasa. Query berikut menghitung usia setiap koleksi pada tahun 2026 dengan mengurangi tahun terbit dari konstanta 2026.

sql Menghitung usia koleksi
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul, tahun, 2026 - tahun FROM buku;
text Keluaran
Dasar Algoritma|2019|7
Peta Langit|2021|5
Dasar Algoritma|2021|5
Sejarah Kertas|2019|7
Kode dan Sandi|2023|3
Jejak Angin|2020|6
Peta Langit|2024|2

Kolom ketiga bukan kolom tersimpan, melainkan hasil hitung yang disusun saat query berjalan. Tanpa penamaan tambahan, nama kolom hasil ekspresi adalah teks ekspresinya sendiri, sehingga pada sesi interaktif yang menampilkan header, kolom ini bernama 2026 - tahun apa adanya. Nama semacam itu kurang nyaman dirujuk, dan alias pada bagian selanjutnya menyelesaikannya.

Operator % pada angka menghasilkan sisa pembagian, dan ekspresi boleh disusun bertingkat selama tanda kurungnya menegaskan urutan hitungnya. Ekspresi serupa dapat dibangun untuk kolom stok, misalnya sisa stok setelah satu eksemplar dipinjam ditulis stok - 1. Konstanta seperti 2026 pada contoh boleh ditulis langsung, dan pada praktiknya angka semacam itu biasanya dilewatkan lewat parameter aplikasi agar tidak tertanam dalam query. Yang penting dipahami adalah hasilnya dihitung saat query berjalan, sehingga perubahan data tabel otomatis mengubah hasilnya tanpa perubahan query.

Konkatenasi teks#

Operator || menyambung dua nilai teks menjadi satu, dan angka yang disambungkan dikonversi menjadi teks secara otomatis. Query berikut menyusun label katalog dari judul dan tahun terbit.

sql Menyambung judul dan tahun
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul || ' (' || tahun || ')' FROM buku
  WHERE id <= 3;
text Keluaran
Dasar Algoritma (2019)
Peta Langit (2021)
Dasar Algoritma (2021)

Tahun yang bertipe angka ikut tersambung tanpa fungsi konversi apa pun. Satu sifat penting perlu diantisipasi, yaitu NULL menular melalui ||. Hasil penyambungan apa pun yang menyentuh NULL bernilai NULL, dan query berikut membuktikannya dengan bantuan COALESCE yang menggantikan hasil kosong tersebut.

sql NULL menular melalui konkatenasi
SELECT COALESCE('kartu-' || NULL, 'kosong');
text Keluaran
kosong

Penyambungan 'kartu-' || NULL menghasilkan NULL, sehingga COALESCE jatuh ke cadangannya dan mencetak kosong. Bila data yang boleh NULL akan disambung, bungkus kolomnya dengan IFNULL atau COALESCE terlebih dahulu agar cadangan teksnya yang tampil. Satu kolom yang kosong memang cukup untuk mengosongkan seluruh hasil penyambungan satu baris, dan aturan di baliknya sama dengan operasi angka, yaitu operasi apa pun yang menyentuh NULL menghasilkan NULL. Penyambungan juga sering dipakai untuk menyusun teks tampilan seperti label atau judul laporan, karena format akhirnya tersusun persis di dalam query.

Fungsi bawaan ringkas#

SQLite menyediakan fungsi skalar yang menerima satu nilai per baris dan mengembalikan satu hasil. Yang paling sering dipakai antara lain upper untuk huruf besar, lower untuk huruf kecil, length untuk panjang teks, substr untuk memotong teks, dan round untuk pembulatan. Query berikut memanggil tiga di antaranya sekaligus pada satu baris.

sql Upper, lower, dan length
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT upper(judul), lower(judul), length(judul)
  FROM buku WHERE id = 1;
text Keluaran
DASAR ALGORITMA|dasar algoritma|15

Panjang 15 terdiri atas lima huruf Dasar, satu spasi, dan sembilan huruf Algoritma. Fungsi substr memotong teks dengan posisi awal yang dihitung mulai dari 1, dan round membulatkan angka pada jumlah desimal tertentu.

sql Memotong teks dengan substr
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT substr(judul, 1, 5) FROM buku WHERE id = 1;
text Keluaran
Dasar
sql Membulatkan angka desimal
SELECT round(3.14159, 2);
text Keluaran
3.14

Fungsi tanggal termasuk dalam keluarga ini. Query berikut memakai tabel peminjaman dan menghitung tanggal jatuh tempo sebagai tujuh hari setelah tanggal pinjam, dengan nilai tanggal yang tetap sehingga keluarannya dapat dihitung ulang kapan pun.

sql Menghitung tanggal jatuh tempo
CREATE TABLE peminjaman (
  id INTEGER PRIMARY KEY,
  nama TEXT,
  buku_id INTEGER,
  tanggal_pinjam TEXT
);
INSERT INTO peminjaman VALUES
  (1, 'Ali', 1, '2026-03-01'),
  (2, 'Budi', 2, '2026-03-03'),
  (3, 'Citra', 3, '2026-03-03'),
  (4, 'Dewi', 1, '2026-03-07'),
  (5, 'Eka', 5, '2026-03-10'),
  (6, 'Farhan', 6, '2026-03-12');
SELECT nama, tanggal_pinjam, date(tanggal_pinjam, '+7 days') AS jatuh_tempo
  FROM peminjaman;
text Keluaran
Ali|2026-03-01|2026-03-08
Budi|2026-03-03|2026-03-10
Citra|2026-03-03|2026-03-10
Dewi|2026-03-07|2026-03-14
Eka|2026-03-10|2026-03-17
Farhan|2026-03-12|2026-03-19

Pengubah +7 days menambahkan tujuh hari kalender pada tanggal pinjamnya. Fungsi-fungsi ini juga dapat dipanggil di dalam WHERE, sehingga penyaringan dan penyusunan kolom hasil memakai perangkat yang sama. Daftar lengkap fungsi bawaan ada pada dokumentasi resmi yang dirujuk di bagian akhir topik ini.

Alias dengan AS dan tanpa AS#

Alias memberi nama pada kolom hasil, ditulis dengan kata AS di antara ekspresi dan namanya. Query berikut menamai hasil pengurangan tadi menjadi usia.

sql Menamai kolom hasil dengan AS
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul, 2026 - tahun AS usia FROM buku;
text Keluaran
Dasar Algoritma|7
Peta Langit|5
Dasar Algoritma|5
Sejarah Kertas|7
Kode dan Sandi|3
Jejak Angin|6
Peta Langit|2

Kata AS sebenarnya opsional, karena spasi saja sudah cukup untuk menetapkan alias. Query berikut memakai bentuk tanpa AS untuk dua kolomnya sekaligus, lalu langsung merujuk alias usia pada ORDER BY agar tiga koleksi termuda yang tampil.

sql Alias tanpa AS dirujuk ORDER BY
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul koleksi, 2026 - tahun usia FROM buku
  ORDER BY usia LIMIT 3;
text Keluaran
Peta Langit|2
Kode dan Sandi|3
Peta Langit|5

Alias koleksi menamai kolom judul, sedangkan alias usia menamai ekspresinya, dan ORDER BY menyusun usia dari yang terkecil sehingga koleksi terbaru lebih dahulu. Bentuk tanpa AS ini sah, tetapi spasi yang menetapkan alias mudah terlewat oleh pembaca, sehingga penulisan AS secara eksplisit lebih disarankan pada query yang akan dibaca orang lain. Alias pada contoh ini sekaligus menunjukkan aturan pentingnya, yaitu alias dapat dirujuk pada ORDER BY di query yang sama. Pada query dengan banyak kolom hasil, memberi alias pada setiap kolom ekspresi adalah kebiasaan yang murah dengan dampak keterbacaan yang besar.

Alias pada ORDER BY dan WHERE#

Alias dirujuk dengan cara yang berbeda pada tiap klausa, dan contoh berikut menunjukkan perbedaannya. ORDER BY menilai nama setelah daftar hasil tersusun, sehingga alias usia langsung dikenalinya.

sql Alias pada ORDER BY
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul, 2026 - tahun AS usia FROM buku
  ORDER BY usia DESC LIMIT 2;
text Keluaran
Dasar Algoritma|7
Sejarah Kertas|7

Pada WHERE, SQLite menyelesaikan nama terhadap kolom asli terlebih dahulu, lalu memakai alias sebagai kandidat terakhir bila tidak ada kolom yang cocok. Karena tabel buku tidak memiliki kolom bernama usia, query berikut tetap berjalan dan hasilnya benar.

sql Alias pada WHERE yang berhasil
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul, 2026 - tahun AS usia FROM buku
  WHERE usia > 5;
text Keluaran
Dasar Algoritma|7
Sejarah Kertas|7
Jejak Angin|6

Tiga baris dengan usia 7, 7, dan 6 lolos, sesuai harapan. Persoalan muncul ketika nama alias bentrok dengan nama kolom asli. Query berikut menamai hasil stok % 3, yaitu sisa pembagian stok dengan 3, dengan nama stok yang sama persis dengan kolom aslinya, lalu menyaring stok > 2.

sql Nama bentrok pada WHERE
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul, stok % 3 AS stok FROM buku
  WHERE stok > 2;
text Keluaran
Dasar Algoritma|1
Sejarah Kertas|0
Kode dan Sandi|2
Peta Langit|1

Baris Sejarah Kertas tampil dengan nilai alias 0 padahal syaratnya menyebut stok > 2. Bukti ini menunjukkan bahwa penyaringan memakai kolom asli yang bernilai 3, bukan alias yang bernilai 0, karena kolom asli selalu diutamakan pada WHERE. Pada ORDER BY pilihan justru terbalik, yaitu alias yang diutamakan bila namanya bentrok.

sql Nama bentrok pada ORDER BY
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul, stok % 3 AS stok FROM buku
  ORDER BY stok;
text Keluaran
Peta Langit|0
Sejarah Kertas|0
Jejak Angin|0
Dasar Algoritma|1
Peta Langit|1
Dasar Algoritma|2
Kode dan Sandi|2

Tiga baris bernilai alias 0 menempati urutan teratas, urutan yang tidak mungkin muncul bila pengurutan memakai kolom stok asli. Aturan ganda seperti ini sulit diingat dan berbeda dari mesin basis data lain, sehingga kebiasaan yang lebih aman adalah menulis ulang ekspresinya pada WHERE.

sql Ekspresi ditulis ulang pada WHERE
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul, 2026 - tahun AS usia FROM buku
  WHERE 2026 - tahun > 5;
text Keluaran
Dasar Algoritma|7
Sejarah Kertas|7
Jejak Angin|6

Hasilnya sama dengan versi alias, tetapi query ini portabel, maksudnya eksplisit, dan tidak terpengaruh bentrokan nama. Alias tetap dipakai untuk menamai hasilnya bagi pembaca.

Kesalahan umum#

Kesalahan aritmetika yang paling sering mengejutkan adalah pembagian bilangan bulat. SQLite membagi dua nilai bulat dengan hasil bulat pula, sehingga bagian desimalnya hilang tanpa peringatan.

sql Pembagian bulat dan pembagian desimal
SELECT 7 / 2;
SELECT 7 / 2.0;
text Keluaran
3
3.5

Kedua query hanya berbeda pada operan keduanya, yaitu 2 bulat dan 2.0 desimal, dan hasilnya 3 berbanding 3.5. Aturannya satu, yaitu bila hasil desimal diharapkan, pastikan salah satu operannya desimal, misalnya dengan menulis stok / 2.0. Contoh lain yang senada adalah pembagian dengan 100 untuk menghitung bentuk persentase, yang menghasilkan 0 untuk stok kecil karena bagian desimalnya hilang sebelum sempat dibulatkan. Gejalanya mudah dikenali pada laporan, yaitu hasil yang tampil tanpa desimal padahal nilai sebenarnya memuat pecahan, dan selisih semacam ini dapat menyebar ke perhitungan berikutnya. Periksa kembali bentuk operannya setiap kali hasil pembagian terlihat lebih kecil dari perkiraan. Kesalahan kedua yang sering menyertai adalah lupa memberi alias pada kolom ekspresi, sehingga nama kolomnya berupa teks ekspresi yang panjang dan sulit dirujuk pada query lanjutan.

Ringkasan#

  • Ekspresi pada daftar SELECT dihitung untuk setiap baris, dan tanpa alias kolomnya bernama persis teks ekspresinya.
  • Operator || menyambung teks dan mengonversi angka otomatis, tetapi NULL menular ke hasilnya.
  • Alias ditulis dengan AS atau spasi saja, dan alias berikan untuk menamai hasil perhitungan.
  • Pada WHERE, SQLite lebih dahulu mencari kolom asli lalu memakai alias bila tidak ada yang cocok, sedangkan ORDER BY mengutamakan alias, sehingga menulis ulang ekspresi pada WHERE menjadi kebiasaan yang lebih aman.

Referensi#