Belajar dengan membaca secara berurutan

Fungsi ③ — Fungsi Matematis (ROUND / FLOOR / CEILING) dan COALESCE

Artikel ketiga dari tiga artikel fungsi SQL. Mencakup fungsi matematis ROUND / FLOOR / CEILING / POWER dan COALESCE — yang mengembalikan nilai non-NULL pertama — menggunakan dataset staff dan test-score yang dimuat dari CSV.

Data yang digunakan di artikel ini — staff dan test_score

Artikel fungsi terakhir mencakup fungsi matematis dan COALESCE. Dengan fungsi matematis, kita akan menangani pembulatan, lantai, langit-langit, dan eksponensiasi pada nilai numerik seperti kolom salary. Dengan COALESCE, kita akan mencakup mengganti NULL dengan nilai lain.

Artikel ini menggunakan dua CSV. Paruh pertama (fungsi matematis) memakai tabel staff yang sama seperti sebelumnya (10 karyawan). Paruh kedua (COALESCE) membawa tabel baru test_score (8 siswa × 3 percobaan tes, dengan NULL). Di test_score, kolom score_1 / score_2 / score_3 punya NULL di tempat siswa tidak hadir dan tidak mengerjakan tes itu — sempurna untuk skenario realistis seperti «pakai nilai dari tes pertama yang siswa bisa kerjakan» untuk belajar cara COALESCE bekerja.

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

① Jalankan PRAGMA table_info(staff); dan PRAGMA table_info(test_score); untuk melihat kolom keduanya.

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

SQL Editor

Jalankan query untuk melihat hasil

Fungsi matematis — ROUND / FLOOR / CEILING / POWER

Ini 4 fungsi utama untuk membentuk nilai numerik:

- ROUND(x, n): membulatkan ke n tempat desimal. Hilangkan n dan ia membulatkan ke integer

- FLOOR(x): lantai (membulatkan ke arah negatif tak hingga)

- CEILING(x) atau CEIL(x): langit-langit (membulatkan ke arah positif tak hingga)

- POWER(x, y): eksponensiasi (x pangkat y)

-- 1) ROUND: pembulatan
SELECT ROUND(3.14);          -- 3 (integer)
SELECT ROUND(3.14, 1);       -- 3.1 (1 tempat desimal)

-- 2) FLOOR: lantai
SELECT FLOOR(3.84);          -- 3
-- Catatan: CEILING bekerja di MySQL / PostgreSQL / Oracle / SQL Server — SELECT CEILING(3.14); → 4

-- 3) POWER: eksponensiasi
SELECT POWER(3, 4);          -- 81 (3 pangkat 4)
SELECT POWER(2, 10);         -- 1024

-- 4) Pada kolom — bulatkan gaji bulanan
SELECT name, salary, ROUND(salary / 12.0) AS monthly
FROM staff;
InputROUND (pembulatan)FLOOR (lantai)CEILING (langit-langit / tidak tersedia di console kursus ini)
3.14334
3.84434
3.50434
-3.14-3-4 (ke arah negatif)-3

Bayangkan permintaan: «bagi gaji tahunan dengan 12 untuk mendapat gaji bulanan, ditampilkan sebagai integer yang dibulatkan». (Jika kamu menjalankan dengan benar, penjelasan akan muncul.)

① Dari tabel staff, ambil name, salary, dan `ROUND(salary / 12.0)` dengan alias `monthly` — total 3 kolom.

② Urutkan berdasarkan monthly menurun.

③ Verifikasi hasil punya 10 baris dan dimulai dengan Frank Tanaka 7,200,000 / 600,000.

SQL Editor

Jalankan query untuk melihat hasil

Bayangkan permintaan: «estimasi gaji tahunan 3 tahun dari sekarang, mengasumsikan kenaikan 10% setiap tahun». Mengalikan dengan faktor yang sama beberapa kali bisa ditulis dalam satu ekspresi dengan `POWER(x, y)` (x pangkat y). Tiga kenaikan × 1.1 berturut-turut menjadi salary * POWER(1.1, 3), yang sama dengan salary * 1.331.

① Dari tabel staff, ambil name, salary, dan *`ROUND(salary POWER(1.1, 3)) dengan alias salary_after_3y`** — total 3 kolom (ROUND menjaga hasil sebagai integer).

② Urutkan berdasarkan salary_after_3y menurun dan simpan hanya 5 baris teratas.

③ Verifikasi hasil adalah 5 baris, dimulai dengan Frank Tanaka 7,200,000 / 9,583,200 dan David Sato 6,800,000 / 9,050,800 sebagai baris 2.

SQL Editor

Jalankan query untuk melihat hasil

Bayangkan permintaan: «di tampilan gaji bulanan, cek bagaimana pembulatan vs. lantai mengubah hasil». Letakkan 2 fungsi pembulatan berdampingan pada ekspresi yang sama untuk melihat perbedaan perilaku sekilas.

① Dari tabel staff, ambil name, salary, `ROUND(salary / 12.0)` sebagai `round_monthly`, dan `FLOOR(salary / 12.0)` sebagai `floor_monthly` — total 4 kolom.

② Urutkan berdasarkan salary menaik dan simpan hanya 5 baris teratas.

③ Verifikasi hasil adalah 5 baris berurutan Emi / Carol / Iris / Alice / Bob. Untuk Alice (gajinya habis dibagi 12), round_monthly dan floor_monthly harus sama; untuk yang lain harus berbeda (bagian desimal mengubah perilaku).

SQL Editor

Jalankan query untuk melihat hasil

COALESCE — mengembalikan nilai non-NULL pertama

`COALESCE(nilai1, nilai2, nilai3, ...)` mengevaluasi argumennya dari kiri ke kanan dan mengembalikan yang pertama tidak NULL. Jika semuanya NULL, ia mengembalikan NULL. Pakai kapan pun kamu ingin fallback untuk NULL: «pakai kolom utama jika punya nilai, kalau tidak kolom cadangan, kalau tidak nilai default».

Artikel ini memakai tabel test_score. Untuk setiap student_id, score_1 / score_2 / score_3 menyimpan nilai tes ke-1, 2, dan 3, dengan NULL di tempat siswa tidak hadir. Melewatkan (score_1, score_2, score_3, 0) ke COALESCE memberi kamu nilai dari tes pertama yang siswa bisa kerjakan, diperlakukan sebagai «nilai akhir». Menambahkan 0 di akhir berarti «jika dia bolos ketiganya, perlakukan sebagai 0».

Cara COALESCE bekerja — kembalikan non-NULL pertama dari kiri
ArgumenNilai dipilihArti(85, 92, 78)85Ke-1 non-NULL,kembalikan(NULL, 78, 88)78Ke-1 NULL,kembalikan ke-2(NULL, NULL, 95)95Ke-1 & 2 NULL,kembalikan ke-3(NULL, NULL, NULL)NULLSemua NULL,kembalikan NULL
Argumen dievaluasi dari kiri ke kanan, dan nilai non-NULL pertama dikembalikan. Letakkan literal (seperti 0 atau 'unknown') di akhir untuk mengatur nilai default.
-- 1) Cek dengan nilai literal
SELECT COALESCE(NULL, NULL, 'C');         -- 'C'
SELECT COALESCE(NULL, NULL, NULL);        -- NULL

-- 2) Ambil nilai akhir dari tabel test_score
SELECT student_id, name, score_1, score_2, score_3,
       COALESCE(score_1, score_2, score_3) AS first_score
FROM test_score;

-- 3) Pakai nilai default — «tidak hadir semua = 0 poin»
SELECT student_id, name,
       COALESCE(score_1, score_2, score_3, 0) AS final_score
FROM test_score;

Versi 2 argumen bisa ditulis sebagai IFNULL

Untuk kasus 2 argumen yang lebih sederhana — «jika NULL, pakai nilai default; kalau tidak, nilai asli» — kamu juga bisa menulis IFNULL(kolom, default) (didukung baik di console kursus ini maupun MySQL). COALESCE(email, 'belum terdaftar') dan IFNULL(email, 'belum terdaftar') persis sama.

Ketika butuh 3 argumen atau lebih, pakai COALESCE. Karena COALESCE adalah standar SQL, bentuk yang sama bekerja di PostgreSQL, Oracle, SQL Server, dll. — pilihan yang lebih portable.

Bayangkan permintaan: «kami melakukan 3 tes, tapi ada yang bolos — pakai nilai dari tes pertama yang setiap siswa bisa kerjakan sebagai nilai akhir».

① Dari tabel test_score, ambil student_id, name, score_1, score_2, score_3, dan `COALESCE(score_1, score_2, score_3)` dengan alias `first_score` — total 6 kolom.

② Verifikasi hasil adalah 8 baris: Alice 85 (score_1 non-NULL), Bob 78 (score_1 NULL jadi score_2 dipilih), Carol 95 (score_1 dan score_2 NULL jadi score_3), Dave NULL (semuanya NULL).

SQL Editor

Jalankan query untuk melihat hasil

Bayangkan permintaan: «beri setiap siswa nilai akhir. Perlakukan siswa yang konsisten tidak hadir sebagai 0, dan beri penghargaan top 3 berdasarkan nilai akhir».

① Dari tabel test_score, ambil student_id, name, dan `COALESCE(score_1, score_2, score_3, 0)` dengan alias `final_score` — total 3 kolom.

② Urutkan berdasarkan final_score menurun dan simpan hanya 3 baris teratas.

③ Verifikasi hasil adalah 3 baris: Carol 95 / Frank 90 / Grace 88.

SQL Editor

Jalankan query untuk melihat hasil
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Manakah berikut yang merupakan hasil benar dari SELECT ROUND(3.84);?

Soal 2Apa yang dikembalikan SELECT FLOOR(3.84), CEILING(3.14);?

Soal 3Apa yang dikembalikan SELECT COALESCE(NULL, NULL, 'C', 'D');?