Belajar dengan membaca secara berurutan

WHERE Deep Dive ② — BETWEEN dan LIKE untuk Filter Rentang dan Pola

Artikel kedua dari deep-dive WHERE. Mencakup rentang dengan BETWEEN, NOT BETWEEN, dan pencocokan prefix / suffix / contains dengan LIKE — dikombinasikan dengan ORDER BY / LIMIT, semua berjalan di dataset staff yang dimuat dari CSV.

Data yang akan kita pakai — tabel staff

Artikel kedua dari deep-dive WHERE membahas filter rentang (BETWEEN) dan pencocokan pola (LIKE). Kalau kamu menggabungkan kondisi compound yang dibangun dengan AND / OR / NOT di artikel sebelumnya dengan BETWEEN / LIKE di artikel ini, kamu bisa menulis kondisi praktis seperti "gaji antara 5.000.000 dan 6.000.000 dan namanya berakhir dengan Tanaka" hanya dengan WHERE saja.

Sebelum latihan, pastikan definisi kolom tabel staff dan contoh datanya.

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

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

SQL Editor

Jalankan query untuk melihat hasil

BETWEEN — filter berdasarkan rentang nilai

Saat kamu ingin menguji apakah sebuah nilai jatuh di dalam rentang — "gaji antara 5.000.000 dan 6.000.000," "birthday antara April 2020 dan Maret 2025" — BETWEEN adalah operatornya.

Menulis kolom BETWEEN nilai1 AND nilai2 mengembalikan baris di mana kolom paling tidak nilai1 dan paling banyak nilai2. Catatan: kedua endpoint dimasukkan. Artinya sama dengan kolom >= nilai1 AND kolom <= nilai2; orang sering memilih BETWEEN cuma untuk keterbacaan.

Menambahkan NOT BETWEEN mengembalikan baris di luar rentangnya (kurang dari nilai1 atau lebih dari nilai2).

-- Staff dengan salary antara 5.000.000 dan 6.000.000 (endpoint dimasukkan)
SELECT name, salary FROM staff
WHERE salary BETWEEN 5000000 AND 6000000;

-- Arti yang sama, ditulis dengan >= dan <= digabung AND
SELECT name, salary FROM staff
WHERE salary >= 5000000 AND salary <= 6000000;

-- Di luar rentangnya (di bawah 5.000.000 ATAU di atas 6.000.000)
SELECT name, salary FROM staff
WHERE salary NOT BETWEEN 5000000 AND 6000000;
Rentang BETWEEN (endpoint dimasukkan)
Rentang BETWEEN (endpoint dimasukkan)salary3,800,0004,500,000(endpoint)5,500,0006,000,000(endpoint)BETWEEN4500000–6000000FALSETRUE(endpoint dimasukkan)TRUETRUE(endpoint dimasukkan)NOT BETWEEN4500000–6000000TRUEFALSEFALSEFALSE
BETWEEN 4500000 AND 6000000 adalah interval tertutup yang mencakup 4.500.000 dan 6.000.000. NOT BETWEEN mengembalikan luarnya. Garis putus-putus yang mengikat endpoint merepresentasikan lebar rentangnya.

BETWEEN memasukkan kedua endpoint

BETWEEN 5000000 AND 6000000 memasukkan tepat 5.000.000 dan tepat 6.000.000. Kalau kamu ingin mengecualikan endpoint, tulis > 5000000 AND < 6000000.

Dengan tanggal, kamu bisa menulis BETWEEN '2020-04-01' AND '2025-03-31' — literalnya dibandingkan sebagai string. Untuk memasukkan "seluruh Maret 2025," mendefinisikan kedua endpoint dengan tanggal akhir bulan yang sebenarnya adalah pendekatan yang aman. BETWEEN '2020-04-01' AND '2025-04-01' akan juga memasukkan `2025-04-01` itu sendiri, yang biasanya bukan yang kamu inginkan.

Bayangkan rapat manajemen butuh jumlah "earner tier menengah (salary 5.000.000 – 6.000.000)." (Setelah kamu menjalankannya dengan benar, penjelasannya akan muncul.)

① Dari staff, ambil kolom name dan salary.

② Saring ke baris di mana `salary` paling tidak 5.000.000 dan paling banyak 6.000.000 (endpoint dimasukkan).

③ Pastikan hasilnya 3 baris (Bob 5.200.000 / Grace 5.500.000 / Jack 5.900.000).

SQL Editor

Jalankan query untuk melihat hasil

Bayangkan permintaan untuk "melihat staff di luar tier menengah (4.500.000 – 6.000.000), disortir berdasarkan salary tertinggi dulu."

① Dari staff, ambil kolom name dan salary.

② Saring ke baris di mana `salary` di luar rentang 4.500.000 – 6.000.000 (yaitu di bawah 4.500.000 atau di atas 6.000.000).

③ Sortir berdasarkan `salary` descending.

④ Pastikan hasilnya 6 baris, dimulai dengan Frank 7.200.000 dan diakhiri dengan Emi 3.800.000.

SQL Editor

Jalankan query untuk melihat hasil

LIKE — filter berdasarkan pencocokan pola

Saat kamu ingin menyaring berdasarkan pola string — "nama yang berakhir dengan Tanaka," "email yang mengandung @example.com" — LIKE adalah operatornya. Tulis kolom LIKE 'pola'. Di dalam pola kamu bisa memakai dua wildcard berikut.

WildcardArti
%Mencocokkan string apa pun yang panjangnya nol atau lebih karakter ("apa pun dengan panjang berapa pun")
_Mencocokkan tepat satu karakter ("karakter tunggal apa pun di posisi ini")

'A%' adalah dimulai dengan A, '%a' adalah berakhir dengan a, '%a%' adalah mengandung a, 'A___%' adalah dimulai dengan A dan punya paling tidak tiga karakter lagi — kombinasikan sesuai kebutuhan. Menambahkan NOT LIKE mengembalikan baris yang tidak cocok dengan polanya.

-- 1) Pencocokan prefix: name dimulai dengan A
SELECT name FROM staff WHERE name LIKE 'A%';

-- 2) Pencocokan suffix: surname Tanaka
SELECT name FROM staff WHERE name LIKE '%Tanaka';

-- 3) Mengandung: name mengandung 'a' di mana saja
SELECT name FROM staff WHERE name LIKE '%a%';

-- 4) Karakter tunggal: karakter ke-2 adalah 'a', sisanya apa saja
SELECT name FROM staff WHERE name LIKE '_a%';

-- 5) Negasi: tidak berakhir dengan Tanaka
SELECT name FROM staff WHERE name NOT LIKE '%Tanaka';
Wildcard LIKE (% dan _)
PolaContoh kecocokanArti'A%'prefixAlice / Adam /Appledimulai dengan A'%Tanaka'suffixAlice Tanaka /Frank Tanakaberakhir dengan Tanaka'%a%'containsAlice / David /Frank / Carolmengandung a'_a%'_ + %Carol / Dave /Jackkarakter ke-2 adalah a
% artinya "panjang apa pun dari apa pun"; _ artinya "tepat satu karakter." Mengkombinasikan posisinya mengekspresikan prefix / suffix / contains dalam tiga pola. Garis putus-putus menghubungkan setiap pola dengan contoh kecocokan dan deskripsi bahasa biasa.

LIKE dan `=` mengikuti aturan case-sensitivity yang berbeda

Di konsol kursus ini (SQLite), di dalam ASCII, LIKE adalah case-insensitive. name LIKE '%a%' dan name LIKE '%A%' mengembalikan baris yang sama. Untuk membuatnya case-sensitive, jalankan PRAGMA case_sensitive_like = 1; atau normalisasi kedua sisinya dengan LOWER(...).

Sementara itu, perbandingan string dengan `=` (dibahas di artikel SELECT) adalah case-sensitive — perhatikan perbedaan perilaku antara = dan LIKE.

Mencari literal `%` atau `_` — klausa `ESCAPE`

Kalau string yang kamu cari sebenarnya mengandung literal % atau _ (misalnya, kode produk seperti 'A_001'), maka secara default _ akan diinterpretasikan sebagai wildcard. Klausa ESCAPE membuatmu bisa menentukan karakter escape, setelah itu % / _ diperlakukan sebagai karakter literal.

Contoh: WHERE code LIKE 'A\_001' ESCAPE '\'; (mendeklarasikan \ sebagai karakter escape, jadi \_ diperlakukan sebagai underscore literal). Karakter escape tidak harus \ESCAPE '#' membuat # jadi escape, ESCAPE '!' membuatnya jadi !, dan seterusnya. Kamu akan memakai ini saat mencari kolom kode yang mengandung _ atau %.

Jalankan tiga pola — prefix, suffix, contains-via-_ — dalam satu konsol dan bandingkan hasilnya.

① Untuk setiap query, ambil name, city, dan salary dari staff.

② Ambil baris di mana `name` dimulai dengan `A` (pencocokan prefix 'A%').

③ Lalu ambil baris di mana `name` berakhir dengan `Tanaka` (pencocokan suffix '%Tanaka').

④ Lalu ambil baris di mana karakter ke-2 dari `name` adalah `a` ('_a%', di mana _ adalah karakter tunggal apa saja).

⑤ Pastikan jumlah barisnya 1 / 4 / 3.

SQL Editor

Jalankan query untuk melihat hasil

Mengkombinasikan WHERE, ORDER BY, dan LIMIT

Query dunia nyata biasanya mengkombinasikan filter (WHERE) → sort (ORDER BY) → batas baris (LIMIT) dalam urutan persis itu. Urutan klausa tetap, dan menukarnya adalah error sintaks.

Urutan klausa (kiri ke kanan)
SELECTcolsFROMtabelWHEREkond.ORDER BYcolLIMITNOFFSETM
Tulis SELECT cols → FROM tabel → WHERE kondisi → ORDER BY col → LIMIT N OFFSET M, dalam urutan itu.

Urutan eksekusi DB-nya kira-kira FROM → WHERE → SELECT → ORDER BY → LIMIT — pertama persempit baris, pilih kolom yang kamu butuh, sortir, lalu potong jumlah yang kamu inginkan.

Alur eksekusi WHERE → ORDER BY → LIMIT
1) WHEREname LIKE '%a%'→ saring ke baris yang cocok (9)2) ORDER BYsalary DESC→ sortir berdasarkan salary tertinggi3) LIMITLIMIT 3→ ambil 3 baris pertamaHasilFrank 7,200,000David 6,800,000Henry 6,100,000
WHERE mempersempit baris, ORDER BY menyortir, LIMIT memotong N pertama. Baik urutan penulisan maupun urutan eksekusi sejajar seperti ini — hafalkan sekali, tidak akan bingung lagi.

Bayangkan dashboard yang menunjukkan ranking salary untuk "staff dengan a di namanya."

① Dari staff, ambil kolom name dan salary.

② Saring ke baris di mana `name` mengandung `a` (pencocokan contains).

③ Sortir berdasarkan `salary` descending, dan ambil hanya 3 baris pertama.

④ Pastikan hasilnya 3 baris: Frank Tanaka 7.200.000 / David Sato 6.800.000 / Henry Sato 6.100.000.

SQL Editor

Jalankan query untuk melihat hasil
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Mana yang menggambarkan SELECT * FROM staff WHERE salary BETWEEN 5000000 AND 6000000; dengan benar?

Soal 2Nama mana yang cocok dengan pola name LIKE '%Tanaka'?

Soal 3Mana dari query berikut yang punya klausa dalam urutan yang benar?