Daftar kolom di SELECT tidak harus berisi nama kolom tabel saja — setiap ekspresi yang menghasilkan nilai boleh menempati posisi itu: harga * 0.1 menjadi kolom potongan, stok * harga menjadi nilai persediaan, dan judulnya bisa kita beri nama sendiri lewat alias. Ekspresi dan alias adalah bahan penyusun setiap query nyata, mulai dari laporan sederhana sampai query analitik yang panjang. Pada chapter penutup section ini kita bedah aturan mainnya: alias dengan dan tanpa AS, alias yang memuat spasi, alias tabel, serta satu batasan penting yang selalu mengejutkan pemula — alias boleh dipakai di ORDER BY tetapi tidak boleh dipakai di WHERE, lengkap dengan error aslinya.
Menyiapkan Tabel Latihan #
DROP DATABASE IF EXISTS belajar_fungsi;
CREATE DATABASE belajar_fungsi;
USE belajar_fungsi;Output yang Dihasilkan:
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Database changedCREATE TABLE produk (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(60) NOT NULL,
harga DECIMAL(10,2) NOT NULL,
stok INT NOT NULL
);
INSERT INTO produk (nama, harga, stok) VALUES
('Buku Tulis 38', 4500.00, 120),
('Pensil 2B', 3000.00, 200),
('Penggaris 30 cm', 2500.00, 55),
('Spidol Whiteboard', 6000.00, 8),
('Buku Gambar A4', 9000.00, 13),
('Kertas HVS A4', 25000.00, 5);Output yang Dihasilkan:
Query OK, 0 rows affected (0.00 sec)
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0Tabel produk memuat kolom angka harga dan stok yang akan menjadi bahan ekspresi aritmetika. Semua contoh pada chapter ini membaca tabel tanpa mengubah satu baris pun.
Alias Kolom dengan AS #
Kata kunci AS memberi nama pada kolom hasil query. Nama ini hanya hidup di hasil — kolom asli di tabel tetap bernama seperti semula:
SELECT nama, harga * 0.1 AS potongan
FROM produk
ORDER BY id;Output yang Dihasilkan:
+-------------------+----------+
| nama | potongan |
+-------------------+----------+
| Buku Tulis 38 | 450.000 |
| Pensil 2B | 300.000 |
| Penggaris 30 cm | 250.000 |
| Spidol Whiteboard | 600.000 |
| Buku Gambar A4 | 900.000 |
| Kertas HVS A4 | 2500.000 |
+-------------------+----------+
6 rows in set (0.00 sec)Tanpa alias, judul kolom hasil akan tertulis harga * 0.1 — berfungsi, tetapi tidak enak dibaca dan rentan berubah bila ekspresinya diedit. Kata AS juga boleh dihilangkan sama sekali; cukup menuliskan nama baru setelah ekspresi:
SELECT nama harga_tampil
FROM produk
ORDER BY id;Output yang Dihasilkan:
+-------------------+
| harga_tampil |
+-------------------+
| Buku Tulis 38 |
| Pensil 2B |
| Penggaris 30 cm |
| Spidol Whiteboard |
| Buku Gambar A4 |
| Kertas HVS A4 |
+-------------------+
6 rows in set (0.00 sec)Bentuk tanpa AS ini sah, tetapi berbahaya saat dibaca terburu-buru: nama harga_tampil bisa disalahpahami sebagai dua kolom terpisah, dan kesalahan ketik pada nama kolom pertama justru terbaca sebagai alias. Menuliskan AS secara eksplisit membuat maksud kolom hasil selalu jelas. Untuk judul yang memuat spasi atau karakter khusus, alias harus dibungkus tanda kutip terbalik:
SELECT nama, harga * 0.9 AS `harga setelah diskon`
FROM produk
ORDER BY id;Output yang Dihasilkan:
+-------------------+----------------------+
| nama | harga setelah diskon |
+-------------------+----------------------+
| Buku Tulis 38 | 4050.000 |
| Pensil 2B | 2700.000 |
| Penggaris 30 cm | 2250.000 |
| Spidol Whiteboard | 5400.000 |
| Buku Gambar A4 | 8100.000 |
| Kertas HVS A4 | 22500.000 |
+-------------------+----------------------+
6 rows in set (0.00 sec)Judul kolom hasil kini berbunyi harga setelah diskon — spasi ikut terbawa. Alias bertanda kutip sering dipakai untuk laporan berbahasa Indonesia, namun ingat bahwa alias hanya mengubah judul hasil; aplikasi yang membaca hasil query berdasarkan nama kolom (harga setelah diskon dengan spasi) menjadi lebih rentan kesalahan ketik daripada alias satu kata seperti harga_diskon.
Alias di ORDER BY Boleh #
ORDER BY dievaluasi setelah daftar SELECT selesai dihitung, sehingga alias hasil boleh langsung dipakai sebagai kunci urutan:
SELECT nama, harga, harga * 0.1 AS potongan
FROM produk
ORDER BY potongan DESC;Output yang Dihasilkan:
+-------------------+----------+----------+
| nama | harga | potongan |
+-------------------+----------+----------+
| Kertas HVS A4 | 25000.00 | 2500.000 |
| Buku Gambar A4 | 9000.00 | 900.000 |
| Spidol Whiteboard | 6000.00 | 600.000 |
| Buku Tulis 38 | 4500.00 | 450.000 |
| Pensil 2B | 3000.00 | 300.000 |
| Penggaris 30 cm | 2500.00 | 250.000 |
+-------------------+----------+----------+
6 rows in set (0.00 sec)Baris terurut dari potongan terbesar ke terkecil memakai alias potongan sebagai kunci. Kita juga bisa memakai alias bersama LIMIT untuk mengambil beberapa teratas — pola yang persis sama dengan ORDER BY harga DESC LIMIT 3 yang kita latih di chapter SELECT, hanya kuncinya berganti ke kolom hasil.
Alias di WHERE Tidak Boleh #
Batasannya muncul di WHERE. Mencoba menyaring baris memakai alias kolom hasil langsung memicu error:
-- @error
SELECT nama, harga * 0.1 AS potongan FROM produk WHERE potongan > 100;Output yang Dihasilkan:
Query OK, 0 rows affected (0.00 sec)
ERROR 1054 (42S22): Unknown column 'potongan' in 'where clause'
ByeError 1054 Unknown column 'potongan' in 'where clause' — MySQL mengaku tidak mengenal kolom bernama potongan di klausa WHERE. Alasannya ada pada urutan evaluasi statement: MySQL membaca FROM (menentukan tabel), lalu WHERE (menyaring baris), baru kemudian SELECT (menghitung ekspresi dan alias). Ketika WHERE dievaluasi, alias potongan belum diciptakan — alias itu baru lahir di tahap SELECT, dan ORDER BY yang berjalan setelahnya yang bisa melihatnya.
Solusinya: ulangi ekspresinya di WHERE:
SELECT nama, harga * 0.1 AS potongan
FROM produk
WHERE harga * 0.1 > 100
ORDER BY potongan DESC;Output yang Dihasilkan:
+-------------------+----------+
| nama | potongan |
+-------------------+----------+
| Kertas HVS A4 | 2500.000 |
| Buku Gambar A4 | 900.000 |
| Spidol Whiteboard | 600.000 |
| Buku Tulis 38 | 450.000 |
| Pensil 2B | 300.000 |
| Penggaris 30 cm | 250.000 |
+-------------------+----------+
6 rows in set (0.00 sec)Query ini berhasil karena harga * 0.1 ditulis ulang di WHERE, sementara alias potongan cukup dipakai di ORDER BY. Ekspresi yang sama dihitung dua kali memang tampak boros, tetapi optimizer MySQL umumnya mengenali ekspresi identik dan menghitungnya sekali saja — kejelasan tidak dibayar dengan performa.
Alias Tabel #
Alias tidak hanya milik kolom — tabel di klausa FROM juga bisa diberi nama pendek:
SELECT p.nama, p.harga
FROM produk AS p
ORDER BY p.id;Output yang Dihasilkan:
+-------------------+----------+
| nama | harga |
+-------------------+----------+
| Buku Tulis 38 | 4500.00 |
| Pensil 2B | 3000.00 |
| Penggaris 30 cm | 2500.00 |
| Spidol Whiteboard | 6000.00 |
| Buku Gambar A4 | 9000.00 |
| Kertas HVS A4 | 25000.00 |
+-------------------+----------+
6 rows in set (0.00 sec)Nama p menjadi singkatan resmi tabel produk di seluruh statement, dan kolomnya dirujuk sebagai p.nama, p.harga. Manfaatnya kecil pada satu tabel seperti ini, tetapi besar ketika query menyertakan beberapa tabel — dengan prefiks, kolom nama dari tabel pelanggan dan kolom nama dari tabel produk tidak pernah tertukar. Seperti alias kolom, kata AS pada alias tabel juga boleh dihilangkan (FROM produk p), dan kita akan membiasakan pola ini di section Joins.
Ekspresi Aritmetika dan Prioritas Operator #
Operator aritmetika standar bekerja di ekspresi: +, -, *, /, plus DIV dan MOD (atau %) untuk hasil bagi dan sisa bilangan bulat. Ketika operator berbeda bertemu dalam satu ekspresi, prioritas menentukan hasilnya:
SELECT 2 + 3 * 4 AS perkalian_dulu,
(2 + 3) * 4 AS kurung_dulu,
10 - 4 - 3 AS kiri_ke_kanan;Output yang Dihasilkan:
+----------------+-------------+---------------+
| perkalian_dulu | kurung_dulu | kiri_ke_kanan |
+----------------+-------------+---------------+
| 14 | 20 | 3 |
+----------------+-------------+---------------+
1 row in set (0.00 sec)Perkalian lebih tinggi prioritasnya daripada penjumlahan, jadi 2 + 3 * 4 menjadi 2 + 12 = 14, bukan 5 * 4 = 20 — tanda kurung mengubah nasib itu. Operator - mengikat dari kiri ke kanan, sehingga 10 - 4 - 3 = (10 - 4) - 3 = 3. Peta prioritasnya ringkas:
| Prioritas | Operator | Catatan |
|---|---|---|
| lebih tinggi | *, /, DIV, MOD (%) | dihitung lebih dulu |
| lebih rendah | +, - | mengikat dari kiri |
Praktik Derived Column #
Menggabungkan seluruh bekal section ini: kolom-kolom hasil alias yang dihitung dari ekspresi aritmetika disebut derived column (kolom turunan). Dua yang paling sering muncul di aplikasi nyata — potongan diskon dan nilai persediaan:
SELECT nama,
ROUND(harga * 0.1, 2) AS potongan,
ROUND(harga * stok, 2) AS nilai_persediaan
FROM produk
ORDER BY nilai_persediaan DESC;Output yang Dihasilkan:
+-------------------+----------+------------------+
| nama | potongan | nilai_persediaan |
+-------------------+----------+------------------+
| Pensil 2B | 300.00 | 600000.00 |
| Buku Tulis 38 | 450.00 | 540000.00 |
| Penggaris 30 cm | 250.00 | 137500.00 |
| Kertas HVS A4 | 2500.00 | 125000.00 |
| Buku Gambar A4 | 900.00 | 117000.00 |
| Spidol Whiteboard | 600.00 | 48000.00 |
+-------------------+----------+------------------+
6 rows in set (0.00 sec)Kolom potongan dihitung per baris dari harga baris tersebut, lalu dirapikan ROUND; kolom nilai_persediaan mengalikan harga dengan stok. Kedua nilai ini tidak disimpan di tabel — kolomnya lahir di dalam query dan mati saat query selesai. Bila kolom turunan seperti ini dipakai berulang kali di banyak query, MySQL juga menyediakan generated column yang nilai dihitung dan disimpan permanen di tabel — kita bahasnya di section Table Design.
Membersihkan Database Latihan #
DROP DATABASE belajar_fungsi;Output yang Dihasilkan:
Query OK, 1 row affected (0.00 sec)Section Fungsi SQL kita tutup di sini: teks dirapikan fungsi string, angka oleh fungsi numerik, tanggal oleh fungsi waktu, tipe oleh CAST, NULL dikendalikan COALESCE, keputusan diambil CASE, tabel diringkas agregat, dan semuanya dipadatkan menjadi kolom hasil bernama alias. Berbekal semua fungsi ini, section berikutnya naik kelas: Agregasi Data, tempat GROUP BY dan HAVING mengubah fungsi agregat menjadi mesin laporan yang sesungguhnya.