MySQL Fungsi: String, Numerik, Buatan Pengguna, Tersimpan
⚡ Ringkasan Cerdas
MySQL Fungsi mengubah data sebelum disimpan atau diambil, dan mengembalikan satu hasil perhitungan. Artikel ini menjelaskan fungsi string, numerik, dan tanggal bawaan, kemudian menunjukkan bagaimana fungsi yang tersimpan dan yang didefinisikan pengguna memperluas mesin basis data itu sendiri.

Apa MySQL Fungsi?
MySQL dapat melakukan lebih dari sekedar menyimpan dan mengambil data. Hal ini dapat juga melakukan manipulasi pada data sebelum mengambil atau menyimpannya. Di situlah MySQL Di sinilah fungsi berperan. Fungsi hanyalah bagian kode yang melakukan suatu operasi dan kemudian mengembalikan hasilnya. Beberapa fungsi menerima parameter, sementara fungsi lain tidak menerima parameter.
Mari kita lihat contohnya secara singkat. Secara default, MySQL menyimpan tipe data tanggal dalam format “YYYY-MM-DD”. Misalkan kita telah membuat aplikasi dan pengguna kita menginginkan tanggal yang dikembalikan dalam format “DD-MM-YYYY”. Kita dapat menggunakan MySQL fungsi bawaan DATE_FORMAT digunakan untuk mencapai hal ini. DATE_FORMAT adalah salah satu fungsi yang paling sering digunakan dalam MySQL, dan kita akan membahasnya secara detail nanti di pelajaran ini.
Apa pun jenisnya, sebuah fungsi selalu mengembalikan nilai tunggal, dapat menerima nol atau lebih parameter di dalam tanda kurung, dan dapat digunakan di mana saja ekspresi diperbolehkan. — dalam daftar SELECT, klausa WHERE, atau klausa ORDER BY.
Mengapa Menggunakan MySQL Fungsi?
Sekarang setelah kita mengetahui apa itu fungsi, pertanyaan selanjutnya adalah mengapa kita harus memasukkan pekerjaan ini ke dalam basis data sama sekali.
Seperti yang ditunjukkan diagram di atas, sebuah fungsi menerima nilai masukan, menerapkan logika sekali di dalam mesin basis data, dan mengembalikan satu hasil tunggal kepada setiap aplikasi yang memintanya.
Para programmer mungkin berpikir, “Untuk apa repot-repot dengan ini?” MySQL Fungsi? Efek yang sama dapat dicapai dengan bahasa skrip atau pemrograman.” Memang benar bahwa kita dapat mencapainya dengan menulis prosedur dalam program aplikasi.
Kembali ke contoh TANGGAL kita, agar pengguna mendapatkan data dalam format yang diinginkan, lapisan bisnis harus melakukan pemrosesan yang diperlukan sendiri.
Hal ini menjadi masalah ketika aplikasi harus berintegrasi dengan sistem lain. Saat kita menggunakan MySQL Fungsi seperti DATE_FORMAT, fungsionalitas tersebut tertanam dalam basis data, dan aplikasi apa pun yang membutuhkan data tersebut akan mendapatkannya dalam format yang dibutuhkan. Ini Mengurangi pengerjaan ulang dalam logika bisnis dan mengurangi inkonsistensi data..
Alasan lain untuk dipertimbangkan MySQL Salah satu fungsinya adalah dapat membantu mengurangi lalu lintas jaringan pada aplikasi klien/server.Lapisan bisnis hanya perlu memanggil fungsi yang tersimpan, tanpa perlu mengambil data mentah melalui jaringan untuk memanipulasinya. Secara rata-rata, penggunaan fungsi dapat sangat meningkatkan kinerja sistem secara keseluruhan.
Jenis dari MySQL Fungsi
Setelah memahami "apa" dan "mengapa", kita sekarang dapat melihat tiga kelompok fungsi. MySQL Menawarkan: fungsi bawaan, fungsi tersimpan, dan fungsi yang ditentukan pengguna.
Fungsi bawaan
MySQL hadir dengan sejumlah fungsi bawaan — fungsi yang sudah diimplementasikan di MySQL server. Mereka memungkinkan kita untuk melakukan berbagai jenis manipulasi pada data, dan termasuk dalam kelompok-kelompok yang umum digunakan berikut ini.
- Fungsi string – beroperasi pada tipe data string
- Fungsi numerik – beroperasi pada tipe data numerik
- Fungsi tanggal – beroperasi pada tipe data tanggal
- Fungsi agregat – beroperasi pada semua tipe data di atas dan menghasilkan kumpulan hasil yang diringkas.
- Fungsi lainnya - MySQL juga mendukung jenis fungsi bawaan lainnya, tetapi kami membatasi pelajaran ini pada kelompok-kelompok yang disebutkan di atas.
Sekarang mari kita lihat setiap grup yang disebutkan di atas secara detail. Kita akan menjelaskan fungsi-fungsi yang paling sering digunakan dengan menggunakan basis data sampel "Myflixdb" kita.
Fungsi string
Fungsi string beroperasi pada nilai teks. Dalam tabel film kita, judul disimpan menggunakan campuran huruf kecil dan huruf besar. Misalkan kita menginginkan kueri yang mengembalikan judul dalam huruf besar. Fungsi “UCASE” mengambil string sebagai parameter dan mengubah setiap huruf menjadi huruf besar, seperti yang ditunjukkan oleh skrip di bawah ini.
SELECT `movie_id`, `title`, UCASE(`title`) AS `upper_case_title` FROM `movies`;
SINI
- UCASE(`judul`) adalah fungsi bawaan yang menerima judul sebagai parameter dan mengembalikannya dalam huruf kapital.
- AS `judul_huruf_atas` memberikan alias pada kolom yang dihitung, sehingga hasil set membawa header yang mudah dibaca alih-alih ekspresi mentah.
Menjalankan skrip di atas dalam MySQL Hasil yang diperoleh dari Workbench terhadap Myflixdb ditunjukkan di bawah ini.
| film_id | judul | judul_huruf_atas |
|---|---|---|
| 16 | 67% Bersalah | 67% BERSALAH |
| 6 | malaikat dan iblis | MALAIKAT DAN IBLIS |
| 4 | Code Nama Hitam | KODE NAMA HITAM |
| 5 | Gadis Kecil Ayah | GADIS-GADIS KECIL AYAH |
| 7 | Da Vinci Code | KODE DAVINCI |
| 2 | Melupakan Sarah Marshal | MELUPAKAN SARAH MARSHAL |
| 9 | Honey mooners | MADU MOONERS |
| 19 | film 3 | FILM 3 |
| 1 | Bajak Laut Karibia 4 | Bajak Laut Karibia 4 |
| 18 | contoh film | CONTOH FILM |
| 17 | The Great Dictator | DIKTATOR HEBAT |
| 3 | X-Men | X-MEN |
Ada dua mitra yang patut diingat selain UCASE: LCASE mengubah string menjadi huruf kecil, dan MENGHUBUNGKAN Menggabungkan dua string atau lebih menjadi satu. Untuk daftar lengkapnya, lihat MySQL referensi fungsi string.
Fungsi numerik
Seperti yang telah disebutkan sebelumnya, fungsi numerik beroperasi pada tipe data numerik. Kita juga dapat melakukan perhitungan matematika pada data numerik secara langsung dalam pernyataan SQL kita.
Operator aritmatika
MySQL Mendukung operator aritmatika berikut, yang dapat digunakan untuk melakukan perhitungan dalam pernyataan SQL.
| Nama | Deskripsi |
|---|---|
| DIV | Divisi integer |
| / | Divisi |
| - | Subtracproduksi |
| + | Tambahan |
| * | Perkalian |
| % atau MOD | Modulus |
Berikut adalah contoh dari masing-masing operator.
Pembagian bilangan bulat (DIV) — DIV mengabaikan bagian pecahan dan hanya mengembalikan bilangan bulat.
SELECT 23 DIV 6;
Menjalankan skrip di atas akan memberi kita 3.
Operator pembagian (/) — tidak seperti DIV, operator pembagian mempertahankan bagian desimal dari hasilnya.
SELECT 23 / 6;
Menjalankan skrip di atas akan memberi kita 3.8333.
Subtracoperator tion (-)
SELECT 23 - 6;
Menjalankan skrip di atas akan memberi kita 17.
Operator penjumlahan (+)
SELECT 23 + 6;
Menjalankan skrip di atas akan memberi kita 29.
Operator perkalian (*)
SELECT 23 * 6 AS `multiplication_result`;
Hasil:
| hasil_perkalian |
|---|
| 138 |
Operator modulo (% atau MOD)
Operator modulo membagi N dengan M dan memberikan sisanya. Mari kita lihat contoh operator modulo, menggunakan nilai yang sama seperti pada contoh sebelumnya.
SELECT 23 % 6; -- OR, equivalently: SELECT 23 MOD 6;
Menjalankan salah satu skrip tersebut akan memberi kita 5.
Sekarang mari kita lihat beberapa fungsi numerik yang umum MySQL.
LANTAI – Fungsi ini menghilangkan angka desimal dari suatu bilangan dan membulatkannya ke bawah ke bilangan bulat terdekat. Skrip yang ditunjukkan di bawah ini mendemonstrasikan penggunaannya.
SELECT FLOOR(23 / 6) AS `floor_result`;
Hasil:
| hasil_lantai |
|---|
| 3 |
ROUND – Fungsi ini membulatkan angka ke bilangan bulat terdekat. Karena 23 / 6 hasilnya 3.8333, ROUND mengembalikan 4 sedangkan FLOOR mengembalikan 3 — keduanya tidak dapat saling menggantikan.
SELECT ROUND(23 / 6) AS `round_result`;
Hasil:
| hasil_putaran |
|---|
| 4 |
RAND – Fungsi ini menghasilkan angka acak. Nilainya berubah setiap kali fungsi dipanggil. Skrip yang ditunjukkan di bawah ini mendemonstrasikan penggunaannya.
SELECT RAND() AS `random_result`;
Fungsi tanggal
Fungsi tanggal beroperasi pada tipe data tanggal dan tanggal-waktu. DATE_FORMAT adalah fungsi yang memecahkan masalah “YYYY-MM-DD versus DD-MM-YYYY” yang dijelaskan di bagian pengantar.
FORMAT TANGGAL Skrip ini menerima dua parameter: nilai tanggal yang akan diformat, dan string format yang dibuat dari placeholder. Skrip di bawah ini mengembalikan setiap tanggal rilis dalam format hari-bulan-tahun seperti yang diminta pengguna kami.
SELECT `title`, DATE_FORMAT(`date_released`, '%d-%m-%Y') AS `formatted_date` FROM `movies`;
Berikut adalah daftar placeholder format yang paling sering digunakan.
| placeholder | Arti | Contoh keluaran |
|---|---|---|
| %d | Tanggal dalam bulan, dua digit | 04 |
| %m | Bulan, dua digit | 08 |
| %Y | Tahun, empat digit | 2012 |
| %M | Nama bulan selengkapnya | Agustus |
| %Miliknya | Hoursmenit, detik | 14:35:09 |
Tiga fungsi tanggal lainnya selalu muncul dalam pekerjaan sehari-hari:
- CURDATE() Mengembalikan tanggal saat ini dalam format YYYY-MM-DD.
- SEKARANG() mengembalikan tanggal saat ini ke waktu.
- PERBEDAAN TANGGAL(d1, d2) Mengembalikan jumlah hari antara dua tanggal — dasar dari setiap laporan tunggakan sewa.
Untuk daftar lengkapnya, lihat MySQL Referensi fungsi tanggal dan waktu.
Fungsi tersimpan
Fungsi bawaan mencakup kasus-kasus umum. Ketika aturan bisnis lebih spesifik, kita menulis sendiri — dan itulah fungsi tersimpan.
Fungsi tersimpan (stored function) berperilaku sama seperti fungsi bawaan (built-in function), kecuali bahwa Anda mendefinisikannya sendiri. Setelah dibuat, fungsi tersimpan dapat digunakan dalam pernyataan SQL persis seperti fungsi lainnya. Sintaks dasarnya ditunjukkan di bawah ini.
CREATE FUNCTION sf_name ([parameter(s)]) RETURNS data_type [DETERMINISTIC | NOT DETERMINISTIC] BEGIN -- procedural statements END
SINI
- “BUAT FUNGSI sf_name ([parameter(s)])” bersifat wajib dan memberitahukan MySQL Server akan membuat fungsi bernama `sf_name` dengan parameter opsional yang ditentukan di dalam tanda kurung.
- “MENGEMBALIKAN tipe_data” Ini wajib dan menentukan tipe data yang dikembalikan oleh fungsi tersebut.
- “DETERMINISTIK” menyatakan bahwa fungsi tersebut mengembalikan nilai yang sama setiap kali argumen yang sama diberikan. “TIDAK DETERMINISTIK” menyatakan sebaliknya.
- “MULAI … SELESAI” membungkus kode prosedural yang dijalankan oleh fungsi tersebut.
Misalkan kita ingin mengetahui film-film sewaan mana yang sudah melewati tanggal pengembaliannya. Kita dapat membuat fungsi tersimpan yang menerima tanggal pengembalian sebagai parameter dan membandingkannya dengan tanggal saat ini di server. Jika tanggal saat ini lebih besar dari tanggal pengembalian, film tersebut sudah melewati batas waktu pengembalian dan kita mengembalikan "Ya"; jika tidak, kita mengembalikan "Tidak".
DELIMITER | CREATE FUNCTION sf_past_movie_return_date (return_date DATE) RETURNS VARCHAR(3) NOT DETERMINISTIC BEGIN DECLARE sf_value VARCHAR(3); IF CURDATE() > return_date THEN SET sf_value = 'Yes'; ELSEIF CURDATE() <= return_date THEN SET sf_value = 'No'; END IF; RETURN sf_value; END| DELIMITER ;
⚠️ Peringatan — jangan beri label fungsi ini sebagai DETERMINISTIK. Fungsi tersebut memanggil CURDATE(), sehingga argumen yang sama dapat mengembalikan "Tidak" hari ini dan "Ya" besok. Mendeklarasikan fungsi yang bergantung pada waktu sebagai DETERMINISTIC akan menyesatkan pengoptimal dan tidak aman untuk replikasi berbasis pernyataan. Gunakan BUKAN DETERMINISTIK setiap kali badan fungsi memanggil CURDATE(), NOW(), atau RAND().
Menjalankan skrip di atas akan membuat fungsi tersimpan `sf_past_movie_return_date`. Sekarang mari kita uji.
SELECT `movie_id`, `membership_number`, `return_date`, CURDATE(), sf_past_movie_return_date(`return_date`) AS `is_overdue` FROM `movierentals`;
Menjalankan skrip di atas dalam MySQL Pengujian Workbench terhadap myflixdb memberikan hasil sebagai berikut.
| film_id | Nomor keanggotaan | tanggal pengembalian | CURDATE() | sudah jatuh tempo |
|---|---|---|---|---|
| 1 | 1 | NULL | 04-08-2012 | NULL |
| 2 | 1 | 25-06-2012 | 04-08-2012 | Ya |
| 2 | 3 | 25-06-2012 | 04-08-2012 | Ya |
| 2 | 2 | 25-06-2012 | 04-08-2012 | Ya |
| 3 | 3 | NULL | 04-08-2012 | NULL |
Perhatikan dua baris NULL. Ketika `return_date` adalah NULL, kedua perbandingan menghasilkan NULL dan bukan TRUE atau FALSE, sehingga tidak ada cabang IF yang berjalan dan fungsi mengembalikan NULL — hasil yang diharapkan, karena film yang tidak dikembalikan tidak memiliki tanggal pengembalian untuk dibandingkan.
Fungsi yang ditentukan pengguna
Ketika SQL saja tidak cukup cepat, MySQL memungkinkan opsi ketiga. Fungsi yang ditentukan pengguna (UDF) ditulis dalam bahasa yang dikompilasi seperti C or C++, dibangun ke dalam pustaka bersama, dan didaftarkan ke server. Setelah ditambahkan, UDF dipanggil seperti fungsi lainnya. Karena UDF berjalan sebagai kode asli di dalam proses server, UDF cocok untuk komputasi berat — tetapi bug di dalamnya dapat menyebabkan server crash, sehingga UDF digunakan jauh lebih jarang daripada fungsi tersimpan.
Fungsi Bawaan vs Fungsi Tersimpan vs Fungsi yang Didefinisikan Pengguna: Mana yang Harus Anda Gunakan?
Ketiga keluarga fungsi tersebut mengembalikan satu nilai tunggal dan dapat dipanggil dari pernyataan SQL apa pun, tetapi perbedaannya terletak pada siapa yang menulisnya, di mana fungsi tersebut dijalankan, dan seberapa besar risiko yang ditimbulkannya. Tabel di bawah ini merangkum perbedaan-perbedaan tersebut.
| Kriterium | Fungsi bawaan | Fungsi tersimpan | Fungsi yang ditentukan pengguna (UDF) |
|---|---|---|---|
| Siapa yang menulisnya? | Dikirim dengan MySQL | Anda, dalam SQL | Anda, di C atau C++ |
| Tempat tinggalnya | Di dalam server | Di dalam basis data, yang dibuat dengan CREATE FUNCTION | Pustaka bersama yang telah dikompilasi dimuat oleh server. |
| Penggunaan khas | Pemformatan, matematika, agregasi | Aturan bisnis yang dapat digunakan kembali, seperti cek yang jatuh tempo. | SQL tidak dapat mengekspresikan logika yang membutuhkan banyak daya CPU atau logika khusus. |
| Risiko utama | None | Lambat jika dipanggil baris demi baris pada tabel yang besar. | Kerusakan pada sistem perpustakaan dapat menyebabkan server mati. |
Sebagai aturan umum, mulailah dengan fungsi bawaan. Jika tidak ada yang sesuai, tulis fungsi tersimpan agar aturannya berada di satu tempat. Gunakan UDF hanya jika fungsi tersimpan terbukti terlalu lambat.

