Belajar dengan membaca secara berurutan

Fungsi ② — Fungsi String (LENGTH / TRIM / REPLACE / UPPER / SUBSTR)

Artikel kedua dari tiga artikel fungsi SQL. Mencakup LENGTH untuk menghitung karakter, TRIM untuk membersihkan spasi, REPLACE untuk substitusi, UPPER / LOWER untuk konversi huruf, dan SUBSTR — semua pada dataset staff yang dimuat dari CSV.

Data yang digunakan di artikel ini — tabel staff

Artikel fungsi kedua fokus pada fungsi string. Kita akan melewati fungsi-fungsi yang akan kamu pakai kapan pun kamu butuh membersihkan atau mengubah teks yang diambil dari tabel produksi: panjang, pembersihan spasi, substitusi, konversi huruf, dan ekstraksi substring.

Dataset adalah tabel staff yang sama seperti sebelumnya (10 baris: name / city / salary, dll.). Memakai nama di kolom name sebagai bintang, empat latihan mencakup perhitungan panjang, substitusi nama belakang, kapitalisasi, dan ekstraksi inisial.

Sebelum mulai latihan, mari cek definisi kolom dan data sampel dari tabel staff.

① Jalankan PRAGMA table_info(staff); untuk melihat nama kolom, tipe, dan primary key.

② Jalankan SELECT * FROM staff LIMIT 5; untuk pratinjau 5 baris pertama.

SQL Editor

Jalankan query untuk melihat hasil

Panjang string — `LENGTH` dan `CHAR_LENGTH`

Fungsi untuk mengukur panjang string berperilaku berbeda antara console kursus ini (SQLite) dan MySQL, jadi hati-hati:

- Console kursus ini (SQLite): LENGTH(s) mengembalikan jumlah karakter ('あいう' → 3)

- MySQL: LENGTH(s) mengembalikan jumlah byte ('あいう' → 9). Untuk mendapatkan jumlah karakter, pakai CHAR_LENGTH(s)

Contoh di sini bahasa Jepang, tapi jebakan yang sama berlaku untuk data non-ASCII apa pun: huruf Latin beraksen ('café' → 4 karakter / 5 byte), bahasa Vietnam ('phở' → 3 karakter / 5 byte), emoji ('🎉' → 1 karakter / 4 byte), dan seterusnya. Bahasa Indonesia natif sebagian besar ASCII jadi jarang kena, tapi begitu nama asing, emoji, atau teks bahasa lain masuk ke database, perbedaan ini langsung jadi penting.

Perbedaan `LENGTH` dan `CHAR_LENGTH`
InputSQLiteLENGTHMySQLLENGTH (byte)MySQLCHAR_LENGTH'ABC'3 (char)3 (byte)3 (char)'あいう'3 (char)9 (byte)3 B/char di UTF-83 (char)'Alice'555
Console kursus ini (SQLite) mengembalikan jumlah karakter dengan LENGTH. MySQL mengembalikan jumlah byte dengan LENGTH, dan jumlah karakter dengan CHAR_LENGTH. Selisih paling kentara dengan karakter multibyte seperti Jepang.
-- 1) Hitung karakter (di console kursus ini, LENGTH mengembalikan jumlah karakter)
SELECT LENGTH('Alice');         -- 5
SELECT LENGTH('あいう');         -- 3 (di sini), 9 (LENGTH MySQL = jumlah byte)

-- 2) Urutkan berdasarkan panjang kolom
SELECT name, LENGTH(name) AS name_len FROM staff
ORDER BY name_len DESC;

-- Referensi: di MySQL, jumlah karakter adalah CHAR_LENGTH(s)
--   SELECT CHAR_LENGTH('あいう') FROM dual;  -- 3

Bayangkan daftar karyawan yang menyoroti «TOP 3 karyawan berdasarkan panjang nama lengkap». (Jika kamu menjalankan dengan benar, penjelasan akan muncul.)

① Dari tabel staff, ambil name dan `LENGTH(name)` dengan alias `name_len` — total 2 kolom.

② Urutkan berdasarkan name_len menurun. Untuk hasil yang seri, pakai name menaik (alfabet) sebagai pemecah seri — sorting multi-level.

③ Batasi ke 3 baris teratas.

④ Verifikasi hasil adalah 3 baris: Iris Watanabe 13 / Alice Tanaka 12 / Carol Tanaka 12.

SQL Editor

Jalankan query untuk melihat hasil

Pembersihan spasi dan substitusi — `TRIM` dan `REPLACE`

Di tabel dunia nyata, kamu akan menemukan spasi tak diinginkan — «seseorang melakukan copy-paste dengan spasi tambahan di awal/akhir», «sistem sebelum migrasi meninggalkan spasi full-width di dalam data», dll. `TRIM(s)` membersihkan spasi dari kedua ujung string; LTRIM(s) hanya membersihkan sisi kiri, dan RTRIM(s) hanya kanan.

`REPLACE(s, cari, ganti)` mengganti setiap kemunculan cari di s dengan ganti. Ini fungsi andalan untuk normalisasi dan migrasi — «singkat nama belakang umum Tanaka menjadi T. untuk tampilan ringkas», «tukar bagian domain alamat email dengan domain baru», dll. Gabungkan dengan UPDATE dan kamu bisa menulis ulang nilai langsung di tabelnya sendiri.

-- 1) Pembersihan spasi: TRIM / LTRIM / RTRIM
SELECT TRIM('  Hello  ');     -- 'Hello'
SELECT LTRIM('  Hello  ');    -- 'Hello  '
SELECT RTRIM('  Hello  ');    -- '  Hello'

-- TRIM pada kolom: deteksi baris dengan spasi via selisih panjang
SELECT name FROM staff
WHERE LENGTH(name) <> LENGTH(TRIM(name));

-- 2) Substitusi: REPLACE
SELECT REPLACE('I LIKE APPLE', 'APPLE', 'BANANA');
-- 'I LIKE BANANA'

-- REPLACE pada kolom — singkat 'Tanaka' menjadi 'T.'
SELECT name, REPLACE(name, 'Tanaka', 'T.') AS short_name
FROM staff;

Aplikasikan TRIM — gabung dengan UPDATE untuk membenahi teks yang tidak konsisten

TRIM bukan hanya untuk membaca — dikombinasikan dengan UPDATE, ia bisa menulis ulang nilai langsung di tabel. Misalnya, untuk menormalisasi kolom name yang punya spasi tak diinginkan di awal/akhir secara massal, tulis sesuatu seperti UPDATE staff SET name = TRIM(name) WHERE LENGTH(name) <> LENGTH(TRIM(name)); — pola aman adalah filter dulu dengan WHERE, lalu UPDATE. Jika kamu menghapus WHERE, setiap baris terkena TRIM (sebagian besar tak berbahaya tapi UPDATE-nya sia-sia). REPLACE bekerja sama: UPDATE tabel SET kolom = REPLACE(kolom, 'A', 'B') adalah teknik dasar untuk perbaikan massal teks yang tidak konsisten.

Bayangkan permintaan: «di dashboard yang ringkas, singkat nama belakang umum Tanaka menjadi T.».

① Dari tabel staff, ambil name dan `REPLACE(name, 'Tanaka', 'T.')` dengan alias `short_name` — total 2 kolom.

② Verifikasi hasil punya 10 baris. 4 nama yang mengandung Tanaka (Alice / Carol / Frank / Jack) harus punya short_name seperti 'Alice T.' / 'Carol T.'.

SQL Editor

Jalankan query untuk melihat hasil

Konversi huruf dan substring — `UPPER` / `LOWER` / `SUBSTR`

`UPPER(s)` mengonversi string menjadi semua huruf besar, dan `LOWER(s)` menjadi semua huruf kecil. Pakai keduanya saat kamu ingin kondisi pencarian tidak peka huruf besar/kecil (WHERE UPPER(email) = 'X@Y.COM') atau format tampilan yang konsisten. Tidak berefek pada karakter tanpa perbedaan huruf (seperti Jepang).

`SUBSTR(s, mulai, panjang)` mengekstrak `panjang` karakter dimulai dari posisi `mulai` (bisa juga ditulis sebagai SUBSTRING). Posisi di SQL dimulai dari 1, jadi SUBSTR('Alice Tanaka', 1, 5) mengembalikan 'Alice'. Hilangkan argumen ketiga dan ia mengembalikan semua hingga akhir; berikan mulai negatif seperti SUBSTR(s, -3) dan ia menghitung dari akhir.

UPPER / LOWER / SUBSTR sekilas
FungsiContoh panggilanHasilUPPERUPPER('Alice')'ALICE'LOWERLOWER('ALICE')'alice'SUBSTRSUBSTR('Alice Tanaka', 1, 5)'Alice'
UPPER dan LOWER mengambil satu argumen dan mengubah huruf seluruh string. SUBSTR mengambil 3 argumen — (target, mulai, panjang) — dan posisi mulai berbasis 1.
-- 1) UPPER / LOWER
SELECT UPPER('apple'), LOWER('APPLE');
-- 'APPLE', 'apple'

-- Pada kolom: ambil nama dalam huruf besar dan kecil
SELECT name, UPPER(name) AS upper_name, LOWER(name) AS lower_name
FROM staff;

-- 2) SUBSTR: posisi berbasis 1
SELECT SUBSTR('Alice Tanaka', 1, 5);   -- 'Alice'
SELECT SUBSTR('Alice Tanaka', 7, 6);   -- 'Tanaka'
SELECT SUBSTR('Alice Tanaka', 7);      -- 'Tanaka'  -- hilangkan panjang → ke akhir
SELECT SUBSTR('Alice Tanaka', -6);     -- 'Tanaka'  -- negatif → dari akhir

-- Karakter pertama tiap nama
SELECT name, SUBSTR(name, 1, 1) AS initial FROM staff;

-- Referensi: REVERSE adalah fungsi MySQL / Oracle — tidak ada di console kursus ini
--   SELECT REVERSE('Alice Tanaka');  -- 'akanaT ecilA' (bekerja di MySQL)

Bayangkan permintaan: «kelompokkan file karyawan berdasarkan inisial, jadi ekstrak setiap inisial dan urutkan».

① Dari tabel staff, ambil name, `UPPER(name)` sebagai `upper_name`, dan `SUBSTR(name, 1, 1)` sebagai `initial` — total 3 kolom.

② Urutkan berdasarkan initial menaik (alfabet), dengan name menaik sebagai pemecah seri.

③ Verifikasi hasil punya 10 baris, dimulai dengan Alice Tanaka / ALICE TANAKA / A dan diakhiri dengan Jack Tanaka / JACK TANAKA / J.

SQL Editor

Jalankan query untuk melihat hasil

Mencari posisi substring — `INSTR`

`INSTR(target, cari)` mengembalikan posisi (indeks berbasis 1) tempat `cari` muncul pertama kali di target. Posisi dimulai dari 1, dan jika string yang dicari tidak ditemukan, mengembalikan 0. Misalnya, INSTR('Alice Tanaka', ' ') mengembalikan 6 karena spasi ada di posisi ke-6.

Gabungkan dengan SUBSTR dan kamu bisa memotong string berdasarkan separator daripada posisi tetap. Kombo andalan untuk mengubah string panjang variabel — «pisahkan email di sekitar @», «ekstrak hanya nama belakang dari nama lengkap», dll.

-- 1) INSTR sendiri — cek posisi spasi
SELECT name, INSTR(name, ' ') AS space_pos FROM staff;
-- 'Alice Tanaka' → 6, 'Bob Suzuki' → 4, ...

-- 2) Gabungkan dengan SUBSTR untuk ekstrak nama belakang
SELECT name,
       SUBSTR(name, INSTR(name, ' ') + 1) AS last_name
FROM staff;

-- 3) Pisahkan di sekitar '@' (contoh email)
SELECT INSTR('alice@example.com', '@'); -- 6
Bagaimana INSTR + SUBSTR memotong nama belakang
LangkahEkspresiHasil① Cari posisispasiINSTR('Alice Tanaka',' ')6② Hitung awalnama belakang6 + 17③ Potong darisana sampai akhirSUBSTR('Alice Tanaka', 7)'Tanaka'
3 langkah untuk mengekstrak nama belakang dari 'Alice Tanaka'. ① INSTR menemukan posisi spasi (karakter ke-6) → ② +1 menghitung awal nama belakang (karakter ke-7) → ③ SUBSTR memotong dari sana sampai akhir, mengembalikan 'Tanaka'.

Bayangkan permintaan: «ekstrak hanya bagian nama belakang dari setiap nama lengkap dan tampilkan top 5 berurutan alfabet berdasarkan nama belakang». Di staff, name berbentuk «Alice Tanaka» — «nama depan spasi nama belakang», dipisah spasi half-width. Karena panjang nama bervariasi, alih-alih memotong di posisi tetap, pakai `INSTR` untuk mencari posisi spasi lalu potong setelahnya.

① Dari tabel staff, ambil name dan `SUBSTR(name, INSTR(name, ' ') + 1)` dengan alias `last_name` — total 2 kolom.

② Sorting multi-level: `last_name` menaik, dengan `name` menaik sebagai pemecah seri. Batasi ke 5 baris teratas.

③ Verifikasi hasil adalah 5 baris (David Sato / Emi Sato / Henry Sato / Bob Suzuki / Grace Suzuki).

SQL Editor

Jalankan query untuk melihat hasil
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Di console kursus ini (SQLite), apa yang dikembalikan SELECT LENGTH('あいう');?

Soal 2Apa yang dikembalikan SELECT REPLACE('I LIKE APPLE', 'APPLE', 'BANANA');?

Soal 3Apa yang dikembalikan SELECT SUBSTR('Alice Tanaka', 7, 6);?