Dengan menjalankan perintah di atas, maka MySQL akan menciptakan file buku_db.sql yang ditempatkan pada direktori backup.
+
File tersebut berisi perintah-perintah untuk membuat ulang database beserta objek-objek di dalamnya.
+
+
+
mysqldump memiliki beberapa opsi yang bisa disertakan saat kita menjalankannya, yaitu:
+
+
+
--quick
+
Digunakan untuk mentransformasikan data yang terdapat di dalam database ke dalam dump file secara langsung, tanpa harus menyimpannya ke dalam memori komputer terlebih dahulu. Ini adalah opsi default untuk mempercepat proses pembuatan dump file.
+
+
+
--add-drop-table
+
Ini akan membuat perintah DROP TABLE sebelum CREATE TABLE di dalam dump file.
+
+
+
--add-lock
+
Ini akan menambahkan perintah LOCK TABLES dan UNLOCK TABLES di dalam dump file yang dihasilkan.
+
+
+
--extended-insert
+
Ini digunakan untuk menginstruksikan kepada MySQL agar menambahkan baris-baris data ke dalam tabel yang terbuat hanya dengan menggunakan satu perintah INSERT.
+
+
+
--databases
+
Digunakan jika kita ingin membuat salinan data dari beberapa (lebih dari satu) database dengan satu perintah.
+
+
+
--all-databases
+
Digunakan jika kita ingin membuat salinan data dari semua database yang terdapat pada server MySQL dalam satu perintah.
+
+
+
-d atau --no-data
+
Digunakan jika kita hanya ingin membuat salinan struktur datanya saja, tidak termasuk data yang terdapat di dalamnya.
+
+
+
Sebagai contoh, kita bisa menjalankan perintah berikut via command prompt.
+
mysqldump -u root -p --databases buku_db mysql > D:\backup\dump.sql
+
Menggunakan mysqlhotcopy
+
+
mysqlhotcopy merupakan program yang dikembangkan menggunakan Perl, maka untuk mengaksesnya kita perlu menginstall software perl di komputer.
+
mysqlhotcopy bekerja dengan menyalin daftar file data aktual yang terdapat di dalam database operasional dan memindahkannya ke lokasi baru.
+
Semua proses terjadi di belakang layar.
+
+
Berikut format perintah untuk menjalankan mysqlhotcopy
Sebenarnya kita bisa saja membackup database dengan cara manual, yaitu menyalin file databasenya secara langsung. Ini merupakan versi manual daripada mysqlhotcopy.
Setelah dijalankan, maka MySQL akan membuat salinan dari tabel myisam1 (myisam1.frm, myisam1.myd) dan myisam2 (myisam2.frm, myisam2.myd) ke dalam direktori C:\tmp.
+
Perlu diperhatikan, kita menggunakan forward slash (/), bukan back slash (\) saat menuliskan direktori tujuan.
+
+
Mengimpor Data
+
+
Salinan file yang dihasilkan oleh proses backup selanjutnya bisa disimpan dan digunakan sewaktu-waktu jika terjadi kesalahan atau kerusakan data pada server MySQL maupun pada komputer server.
+
Proses pengembalian data ke keadaan sebelumnya disebut sebagai restore/ impor data.
+
+
Berikut langkah-langkah restore data yang dihasilkan dari program mysqldump.
+
+
+
Menggunakan MySQL Client, buatlah database baru dengan nama tertetntu. Contoh:
+
CREATEDATABASEdb_baru;
+
+2. Melalui terminal atau command prompt jalankan perintah dengan format berikut.
+
mysql -u [nama_user] -p [nama_database] [file_backup]
+
+Contoh:
+
mysql -u root -p db_baru D:\backup\buku_db.sql
+
+Sekarang kita bisa mengecek hasilnya dengan menjalankan query pada MySQL Monitor.
+
Selamat datang di panduan belajar MySQL edisi best practice. Panduan ini kami susun dengan harapan dapat menjadi sarana belajar yang efektif bagi siapa saja, terutama siswa-siswi di bidang Rekayasa Perangkat Lunak atau mereka yang baru mengenal MySQL.
+
Panduan ini dirancang ringkas namun tetap komprehensif, berisi teori dasar, format sintaks, dan penerapan dalam kasus nyata. Dengan membaginya ke dalam 12 bab, kami berusaha menyajikan setiap topik secara bertahap agar mudah dipahami, mulai dari dasar hingga fitur lanjutan seperti prosedur, trigger, hingga manajemen user.
+
Sebagai pengajar, panduan ini juga merupakan bagian dari ikhtiar saya untuk menyampaikan ilmu dengan cara yang lebih terstruktur dan mudah diakses, terutama dalam bentuk website. Saya percaya, kemudahan akses ini akan membuka peluang belajar lebih luas bagi siapa saja.
+
Semoga panduan ini bermanfaat, menjadi amal jariyah, dan membawa kebaikan bagi kita semua. Jika Anda merasa panduan ini berguna, jangan ragu untuk membagikannya kepada yang lain.
+
Madiun, 4 Desember 2024
+Salam hangat,
+Ipnu Masyaid
Terima kasih telah menggunakan panduan belajar MySQL ini. Saya berharap panduan ini dapat memberikan manfaat nyata dalam memahami dan menguasai MySQL, baik untuk kebutuhan belajar, mengajar, maupun pengembangan profesional.
+
Jika ada kekurangan dalam penyusunan panduan ini, saya dengan rendah hati menerima saran dan kritik membangun agar panduan ini bisa terus diperbaiki dan dikembangkan.
+
Mari bersama-sama menjadikan ilmu yang kita pelajari sebagai bekal untuk kebaikan dan kemajuan. Saya percaya, dengan berbagi ilmu, kita tidak hanya membantu sesama, tetapi juga mendekatkan diri pada keberkahan ilmu itu sendiri.
+
Selamat belajar, dan semoga sukses selalu menyertai langkah Anda!
ALTER TABLE\n kategori\nRENAME TO\n kategori_buku;\n
Menambah kolom
ALTER TABLE\n buku\nADD COLUMN\n buku_sinopsis text;\n
Mengubah Kolom
ALTER TABLE\n buku\nCHANGE\n buku_isbn buku_id char(15);\n
Menghapus kolom
ALTER TABLE\n buku\nDROP\n buku_sinopsis;\n
Menambah primary key
ALTER TABLE\n buku\nADD\n primary key(buku_judul);\n
Menambah foreign key
ALTER TABLE\n link_buku_kategori\nADD\n foreign key(buku_isbn)\n references buku(buku_isbn);\n
Menghapus primary key
ALTER TABLE\n buku\nDROP primary key;\n
Menghapus foreign key
ALTER TABLE\n fk_link_buku_kategori;\n
Menambah indeks
ALTER TABLE\n buku\nADD INDEX\n idx_judul(buku_judul);\n
Menghapus indeks
ALTER TABLE\n buku\nDROP INDEX\n idx_judul;\n
Menghapus Tabel
DROP TABLE IF EXIST\n link_buku_kategori;\nDROP TABLE\n link_buku_kategori,\n link_buku_pengarang;\n
"},{"location":"bab10/","title":"Prosedur dan Fungsi","text":"
Prosedur dan fungsi merupakan objek database yang berisi runtutan perintah untuk melaksanakan satu tugas khusus tertentu.
Prosedur dan fungsi disimpan di dalam database, sehingga jika database dihapus, keduanya kan hilang.
Prosedur dan fungsi sering juga disebut sebagai stored procedure dan stored function.
Sekali dibuat, prosedur dan fungsi dapat digunakan secara berulang.
"},{"location":"bab10/#manfaat-prosedur-dan-fungsi","title":"Manfaat Prosedur dan Fungsi","text":"
Pembuatan prosedur dan fungsi memiliki beberapa manfaat, di antaranya:
Sintaks SQL lebih fleksibel
Mengizinkan kita untuk menulis kode logis di dalam prosedur atau fungsi (bisa mengandung kontruksi pengulangan maupun percabangan).
Memiliki kemampuan untuk menanganni kesalahan (error)
Kesalahan yang terjadi pada saat eksekusi prosedur atau fungsi dapat ditangani dengan benar.
Pembungkusan kode (code packaging and encapsulation)
Prosedur dan fungsi di simpan di dalam server database. Dengan demikian, kode hanya ditulis sekali, tapi prosedur atau fungsi tersebut dapat digunakan oleh banyak aplikasi klien. Tentu hal ini akan meringankan tugas dari aplikasi klien.
Mudah dipelihara
Kita hanya perlu merubah kode prosedur atau fungsi di sisi server dan perubahan otomatis akan diterpakna ke semua aplikasi klien.
"},{"location":"bab10/#perbedaan-prosedur-dan-fungsi","title":"Perbedaan Prosedur dan Fungsi","text":"
Perbedaan antara prosedur dan fungsi terletak pada peruntukan, cara pembuatan dan cara eksekusinya. Berikut hal-hal yang perlu diperhatikan.
Prosedur tidak mengembalikan nilai
Prosedur hanya melakukan suatu proses atau operasi tertentu, contohnya mengubah struktur tabel dan data dalam suatu tabel. Prosedur dieksekusi menggunakan perintah CALL.
Fungsi mengembalikan nilai
Cara eksekusinya adalah dengan meletakkan nama fungsi (beserta parameternya, jika ada) sebagai ekspresi, misalnya dalam perintah SELECT, dalam rumus perhitungan maupun ayng lain. Ini berarti bahwa pemanggilan fungsi sama seperti penggunaan variabel atau konstanta.
Cara Eksekusi
Fungsi tidak bisa dieksekusi menggunakan perintah CALL. Demikian juga, prosedur tidak dapat dieksekusi di dalam ekspresi.
Parameter
Parameter yang didefinisikan di dalam prosedur dapat bersifat sebagai parameter masukan (input only), parameter keluaran (output only), mapupun gabungan dari keduanya (dikenal dengan parameter masukan/keluaran). Karena alasan tersebut,s ebenarnya prosedur juga dapat digunakan untuk mengembalikan nilai, asalkan nilai tersebut ditampung ke dalam parameter keluaran. Fungsi hanya memiliki parameter masukan.
Klausa RETURNS
Karena fungsi merupakan sub-program yagn mengembalikan nilai, maka saat pembuatannya kita harus menggunakan klausa RETURNS di bagian kepala atau judul fungsi dan diikuti dengan tipe data dari nilai yang akan dikembalikan.
Selain itu, di bagian akhir badan fungsi kita juga perlu menggunakan klausa RETURN untuk mengembalikan nilai yang diperoleh dari proses yang telah dilakukan oleh fungsi. Klausa RETURNS dan RETURN tidak ditemukans saat kita mendeklarasikan prosedur.
"},{"location":"bab10/#membuat-dan-mengeksekusi-prosedur","title":"Membuat dan Mengeksekusi Prosedur","text":"
Prosedur dapat memiliki satu atau lebih perintah yang dikumpulkan menjadi satu kelompok. Oleh karena itu, kita perlu menggunakan blok BEGIN-END.
Setiap perintah di dalma prosedur harus dipisahkan menggunakan tanda titik koma/ semicolon (;).
Format pembuatan prosedur pada umumnya sebagaimana berikut.
DELIMITER //\nCREATE PROCEDURE select_penerbit()\nBEGIN\n SELECT penerbit_nama\n FROM penerbit\n WHERE penerbit_id='PB06';\nEND;\n//\n
Sekarang coba kita jalankan prosedurnya.
CALL select_penerbit();\n
Setelah dijalankan, kita tahu bahwa prosedur select_penerbit() tersebut berfungsi untuk menampilkan nama penerbit yang memiliki id penerbit PB06.
Selanjutnya, kita coba membuat prosedur yang memiliki parameter.
DELIMITER //\nCREATE PROCEDURE\n insert_penerbit(id char(4), nama varchar(50))\nBEGIN\n INSERT INTO penerbit\n (penerbit_id, penerbit_nama)\n VALUES (id, nama);\nEND;\n//\n
Selanjutnya kita coba eksekusi.
CALL insert_penerbit('PB10','Sinar Terang');\n
Kita tahu bahwa prosedur yang baru saja kita buat dan kita jalankan berfungsi untuk menambahkan data penerbit. Untuk membuktikannya coba kita cek data penerbit dengan perintah
SELECT * FROM penerbit;\n
Tentu saja ada penerbit Sinar Terang dengan penerbit_id PB10 bertengger di baris terakhir."},{"location":"bab10/#membuat-dan-mengeksekusi-fungsi","title":"Membuat dan Mengeksekusi Fungsi","text":"
Untuk membuat fungsi kita perlu menggunakan CREATE FUNCTION disusul dengan RETURNS dan diakhiri dengan RETURN. Berikut formatnya.
RETUNRS [tipe data] berfungsi untuk menentukan tipe data keluaran dari fungsi tersebut. Semisal kita ingin emngembalikan nilai berupa bilangan bulat, berarti kita perlu menulis RETURNS INT.
Mari kita buat contohnya.
CREATE FUNCTION harga_buku(isbn CHAR(13))\n RETURNS DECIMAL(10, 0) DETERMINISTIC\nBEGIN\n-- Mendeklarasikan veriabel\nDECLARE harga DECIMAL(10,0);\n\n-- Seleksi data dan menampung hasilnya ke dalam variabel\nSELECT buku_harga INTO harga\nFROM buku\nWHERE buku_isbn = isbn;\n\n-- Mengembalikan nilai hasil proses\nRETURN harga;\n\nEND;\n//\n
Kita juga bisa memanggil fungsi di dalam ekspresi secara langsung. Contoh:
SET total = harga_buku('222-34222-1-0') * 2;\n
Dalam contoh tersebut, pemanggilan fungsi secara langsung digunakan untuk proses perkalian dengan bilangan lain. Dengan demikian, eksekusi fungsi perlakuannya sama dengan penggunaan variabel normal."},{"location":"bab10/#menghapus-prosedur-dan-fungsi","title":"Menghapus Prosedur dan Fungsi","text":"
Kita gunakan DROP PROCEDURE untuk menghapus prosedur, dan DROP FUNCTION untuk menghapus fungsi, diikuti nama prosedur ataupun fungsi. Contoh:
-- Menghapus prosedur\nDROP PROCEDURE select_penerbit;\n\n-- Menghapus fungsi\nDROP FUNCTION harga_buku;\n
"},{"location":"bab10/#menampilkan-daftar-prosedur-dan-fungsi","title":"Menampilkan Daftar Prosedur dan Fungsi","text":"
Ada beberapa variasi perintah di dalam MySQL untuk menampilkan prosedur maupun fungsi.
Query-1
Menampilkan seluruhprosedur yang tersimpan di dalam database beserta properti dan informasi metadata lainnya.
SHOW PROCEDURE STATUS;\n
Query-2
Menampilkan prosedur berdasarkan filter yang dilakukan menggunakan klausa LIKE.
SHOW PROCEDURE STATUS\nWHERE name LIKE 'insert';\n
Query-3
Menampilkan seluruh fungsi yang tersimpan dalam database, beserta properti dan informasi metadata dari fungsi-fungsi tersebut.
SHOW FUNCTION STATUS;\n
"},{"location":"bab10/#hak-akses-untuk-bekerja-dengan-prosedur-dan-fungsi","title":"Hak Akses untuk Bekerja dengan Prosedur dan Fungsi","text":"
Untuk bekerja menggunakan prosedur dan fungsi kita perlu memiliki beberapa hak akses berikut.
CREATE ROUTINE
Untuk membuat prosedur maupun fungsi.
EXECUTE
Untuk mengeksekusi prosedur maupun fungsi.
ALTER ROUTINE
Untuk mengubah atau menghapus prosedur maupun fungsi.
"},{"location":"bab10/#variabel-di-dalam-prosedur-dan-fungsi","title":"Variabel di dalam Prosedur dan Fungsi","text":"
Pada saat membuat prosedur maupun fungsi, terkadang kita memerlukan satu atau lebih variabel untuk menampung nilai sementara dari proses yang dilakukan di dalam prosedur atau fungsi bersangkutan.
Untuk mendeklarasikan variabel, kita gunakan perintah DECLARE, formatnya adalah
DECLARE [nama_variabel] [tipe data];\n
Perintah DECLARE harus berada di dalam blok BEGIN-END sebagai mana pada contoh sebelumnya di sini. Pada contoh tersebut kita mendeklarasikan variabel harga dengan tipe DECIMAL dengan lebar 10.
Untuk melakukan inisialisasi nilai terhadap variabel yang telah dideklarasikan, kita perlu menggunakan perintah SET dengan format
SET [nama_variabel] = [nilai]\n
Contoh:
BEGIN\n DECLARE harga DECIMAL(10, 0);\n SET harga = 0;\n ...\nEND;\n
Jika suatu variabel diugnakan untuk menampung nilai yang diperoleh dari suatu tabel dalam database, kita bisa mengisikannya ke dalam variabel dengan perintah SELECT ... INTO. Contoh:
BEGIN\n ...\n SELECT buku_harga INTO harga\n FROM buku\n WHERE buku_isbn = isbn;\n ...\nEND;\n
"},{"location":"bab10/#pemilihan-dalam-prosedur-dan-fungsi","title":"Pemilihan dalam Prosedur dan Fungsi","text":"
IF dan CASE bisa kita gunakan untuk melakukan pemilihan perintah atau aksi. Pemilihan ini didasarkan pada kondisi tertentu.
Dalam blok pemilihan, aksi hanya dieksekusi jika kondisi yang didefinisikan bernilai benar.
Ini adalah bentuk yang paling sederhana, karena hanya memiliki satu kondisi untuk diperiksa. Jika ekspresi bernilai benar, maka daftar aksi akan dieksekusi, namun jika salah, maka aksi tidak akan dijalankan.
Ini adalah bentuk yang sedikit lebih kompleks. Jika kondisi1 bernilai benar, maka daftar aksi1 akan dijalankan. Jika tidak, maka akan dilanjutkan pengecekan kondisi2, jika benar, maka daftar aksi2 akan dijalankan. Jika tidak maka daftar aksi3 yang akan dijalankan.
Kita coba contoh berikut.
DELIMITER //\nCREATE FUNCTION get_penerbit9isbn CHAR(13)\n RETURNS VARCHAR(50) DETERMINISTIC\nBEGIN\n DECLARE namapenerbit VARCHAR(50);\n SELECT b.penerbit_nama INTO namapenerbit\n FROM\n buku a,\n penerbit b\n WHERE\n a.penerbit_id = b.penerbit_id\n AND\n a.buku_isbn = isbn;\n\n IF namapenerbit IS NULL THEN\n SET namapenerbit = '';\n END IF;\n\n RETURN namapenerbit;\nEND;\n//\n
Penjelasan Kode
Inti penggunaan IF pada kode di atas adalah, jika namapenerbit bernilai NULL maka variabel namapenerbit akan diisi dengan nilai string kosong.
CASE [ekspresi]\n WHEN [nilai1]\n THEN [daftar aksi1];\n WHEN [nilai2]\n THEN [daftar aksi2];\n ...[dst]\n\n ELSE [daftar aksi]\nEND CASE\n
Penjelasan Kode
Jika ekspresi yang diperiksa memiliki nilai yang sama dengan nilai1, maka yang akan dieksekusi adalah daftar aksi1. Jika ekspresi sama dengan nilai2, maka yang akan dieksekusi adalah daftar aksi2, dan seterusnya.
Jika semua nilai konstan yang didefinisikan tidak ada yang sama dengan ekspresi, maka yang akan dieksekusi adalah daftar aksi yang terdapat pada bagian ELSE.
Sekarang kita coba menerapkan CASE dengan fungsi berikut.
DELIMITER //\nCREATE FUNCTION ubah_format_tanggal(tanggal DATE)\n RETURNS VARCHAR(30) DETERMINISTIC\nBEGIN\n DECLARE dd INT(2);\n DECLARE mm INT(2);\n DECLARE yy INT(4);\n DECLARE bulan VARCHAR(9);\n\n SET dd = EXTRACT(DAY FROM tanggal);\n SET mm = EXTRACT(MONTH FROM tanggal);\n SET yy = EXTRACT(YEAR FROM tanggal);\n\n CASE mm\n WHEN 1 THEN SET bulan = 'Januari';\n WHEN 2 THEN SET bulan = 'Februari';\n WHEN 3 THEN SET bulan = 'Maret';\n WHEN 4 THEN SET bulan = 'April';\n WHEN 5 THEN SET bulan = 'Mei';\n WHEN 6 THEN SET bulan = 'Juni';\n WHEN 7 THEN SET bulan = 'Juli';\n WHEN 8 THEN SET bulan = 'Agustus';\n WHEN 9 THEN SET bulan = 'September';\n WHEN 10 THEN SET bulan = 'Oktober';\n WHEN 11 THEN SET bulan = 'November';\n WHEN 12 THEN SET bulan = 'Desember';\n END CASE;\n\n RETURN CONCAT(\n CONVERT(dd, CHAR),\n ' ',\n bulan,\n ' ' ,\n CONVERT(yy, CHAR)\n );\nEND\n//\n
Penjelasan Kode
Fungsi di atas berguna untuk mengubah format tanggal yang dilewatkan sebagai parameter, dari bentuk standar (dalam format angka) ke bentuk tanggal yang menggunakan nama bulan.
LOOP merupakan bentuk perulangan yang tidak memiliki kondisi, maka normalnya perulangan akan dilakukan secara terus-menerus.
Untuk menghentikan perulangan tersebut, kita perlu menggunakan perintah LEAVE.
Berikut format sintaksnya
LOOP\n [daftar aksi];\nEND LOOP\n
Mari langsung kita buat contohnya dengan memasukkan LOOP ke dalam sebuah fungsi.
DELIMITER //\nCREATE FUNCTION jumlahkan(n INT)\n RETURNS int(11) DETERMINISTIC\nBEGIN\n DECLARE i INT DEFAULT 0;\n DECLARE total INT DEFAULT 0;\n myloop: LOOP\n SET i = i + 1;\n IF i > n THEN\n -- keluar dari perulangan\n LEAVE myloop;\n END IF;\n SET total = total + i;\n END LOOP myoop;\n\n RETURN total;\nEND;\n//\n
Penjelasan Kode
Kita memberi label pada badan perulangan dengan nama myloop. Fungsi di atas berguna untuk menjumlahkan n buah bilangan positif pertama.
Sebagai contoh, jika n bernilai 5, maka hasilnya adalah 15, berasal dari 1 + 2 + 3 + 4 + 5.
Sekarang, kita coba eksekusi fungsi LOOP tersebut.
WHILE merupakan bentuk preintah untuk melakukan perulangan dengan cara memeriksa kondisi tertentu.
Kondisi yang akan diperiksa ditempatkan di bagian awal blok.
Aksi yang berada di dalam badan perulangan hanya akan dieksekusi jika kondisi terpenuhi (bernilai benar).
Jika kondisi bernilai salah, maka aksi di dalam badan perulangan akan diabaikan dan proses eksekusi dilanjutkan ke aksi setelah blok perulangan (jika ada).
Bentuk umum sintaksnya adalah
WHILE [kondisi] DO\n [daftar aksi];\nENd WHILE\n
Mari kita buat fungsi yang mengandung WHILE
DELIMITER //\nCREATE FUNCTION jumlahkan_while(n INT)\n RETURNS int(11) DETERMINISTIC\nBEGIN\n DECLARE i INT DEFAULT 1;\n DECLARE total INT DEFAULT 0;\n WHILE (i <= n) DO\n SET total = total + i;\n SET i = i + 1;\n END WHILE;\n\n RETURN total;\nEND;\n//\n
Penjelasan Kode
Fungsi di atas merupakan modifikasi dari kode program sebelumnya. Perbedaannya, kali ini kita menggunakan perintah WHILE dalam proses pengulangan aksinya. Hasil yang diperoleh sama seperti pada fungsi sebelumnya.
Sekarang, mari kita coba implementasikan ke dalam sebuah fungsi.
DELIMITER //\nCREATE FUNCTION jumlahkan_repeat(n INT)\n RETURNS int(11) DETERMINISTIC\nBEGIN\n DECLARE i INT DEFAULT 1;\n DECLARE total INT DEFAULT 0;\n\n REPEAT\n SET total = total + i;\n SET i = i + 1;\n UNTIL (i > n)\n END REPEAT;\n\n RETURN total;\nEND;\n//\n
Penjelasan Kode
Ketika dieksekusi, cara kerja fungsi di atas akan sama seperti dua fungsi sebelumnya \ud83d\ude02
"},{"location":"bab10/#perintah-leave-dan-iterate","title":"Perintah LEAVE dan ITERATE","text":"
Proses pengulangan dapat dipaksa untuk berhenti atau untuk diteruskan menggunakan pernyataan loncat (jump statement).
Untuk menghentikan, kita bisa menggunakan LEAVE, sedangkan untuk melanjutkan perulangan kita bisa menggunakan ITERATE.
Mari kita coba terapkan keduanya pada fungsi berikut.
DELIMITER //\nCREATE PROCEDURE tampilkan_bil_genap(n INT)\nBEGIN\n DECLARE i INT DEFAULT 0;\n DECLARE str VARCHAR(200) DEFAULT '';\n next: LOOP\n SET i = i + 1;\n IF (i mod 2 = 1) THEN\n ITERATE next;\n END IF;\n IF (i > n) THEN\n LEAVE next;\n END IF;\n SET str = CONCAT(str, CONVERT(i, CHAR), ' ');\n ENd LOOP next;\n SELECT str AS \"Bilangan Genap\";\nEND;\n//\n
Penjelasan Kode
Pada kode di atas, kita membuat sebuah prosedur yang dapat menampilkan bilangan genap yang terdapat antara bilangan 1 dan n. Nilai n ditentukan pada saat pemanggilan prosedur.
Sekarang kita coba panggil prosedur di atas.
CALL tampilkan_bil_genap(50);\n
Tentu saja
Perintah tersebut akan menampilkan bilangan genap aygn berada dalam rentang 1 dan 20.
"},{"location":"bab11/#alasan-menggunakan-trigger","title":"Alasan Menggunakan Trigger","text":"
Beberapa alasan kita menggunakan trigger adalah:
Trigger dapat memvalidasi data yang akan dimasukkan maupun yang akan digunakan untuk melakukan perubahan data.
Trigger dapat memperoleh nilai lama dari baris data yang dihapus atau dirubah (misalnya untuk pencatatan histori data suatu tabel).
Trigger dapat mengolah nilai kolom pada tabel lain.
Selain ketiga manfaat di atas, Trigger juga dapat meringankan kode di bagian aplikasi atau stored procedure yang dikembangkan. Kita tidak perlu menulis kode program di dalam aplikasi untuk melakukan validasi data.
Beberapa konsep yang perlu diketahui dan dipahami tentang trigger yaitu:
Trigger adalah objek database yang berisi kumpulan perintah SQL yang akan dieksekusi atau diaktivasi ketika suatu event terjadi.
Dalam satu database, kita dapat mendefinisikan lebih dari satu trigger. Setiap trigger harus memiliki nama yang unik.
Trigger harus berasosiasi dengan tabel tertentu sebagai pemicu trigger untuk menentukan kapan trigger yang bersangkutan akan dieksekusi.
Trigger memiliki event:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
Trigger memiliki referensi NEW dan OLD.
"},{"location":"bab11/#daftar-event-untuk-aktivasi-trigger","title":"Daftar Event untuk Aktivasi Trigger","text":"Event Keterangan BEFORE INSERT Trigger diaktivasi sebelum data ditambahkan ke dalam suatu tabel. AFTER INSERT Trigger diaktivasi setelah data ditambahkan ke dalam suatu tabel. BEFORE UPDATE Trigger diaktivasi sebelum data dalam suatu tabel diubah. AFTER UPDATE Trigger diaktivasi setelah data daalam suatu tabel diubah. BEFORE DELETE Trigger diaktivasi sebelum data dihapus daru suatu tabel. AFTER DELETE Trigger diaktivasi setelah data dihapus dari suatu tabel."},{"location":"bab11/#membuat-trigger","title":"Membuat Trigger","text":"
Perintah di atas akan membuat trigger tr_ai_buku yang akan diaktivasi setiap kali user memasukkan baris data baru ke dalam tabel buku.
Trigger tersebut akan memasukkan data baru ke dalam tabel histori_buku, nilainya diambil dari data yang baru saja dimasukkan ke dalam tabel buku.
Untuk mengambil nilai dari data yang baru dimasukkan menggunakan referensi new seperti pada new.buku_isbn.
'INSERT' digunakan untuk mengisi jenis aksi yang dilakukan oleh user.
CURRENT_DATE() berfungsi untuk mengisi nilai kolom berisi tanggal saat proses memasukkan data.
Perintah DELIMITER $$ berfungsi untuk menentukan bahwa tanda $$ akan digunakan sebagai pembatas berakhirnya pembuatan kode trigger.
"},{"location":"bab11/#memeriksa-pengaruh-trigger","title":"Memeriksa Pengaruh Trigger","text":"
Untuk memeriksa pengaruh daripada trigger, sekarang kita coba memasukkan sampel data ke dalam tabel buku.
INSERT INTO buku VALUES(\n '999-11555-2-2',\n 'Microsoft Excell',\n 'PB04',\n '2009/02/07',\n 200,\n NULL,\n 60000\n);\n
Ketika perintah tersebut dijalankan dan tidak terjadi error maka harusnya datanya masuk ke dalam tabel buku dan ada data baru di tabel histori_buku. Mari kita cek.
Jika perintah di atas dieksekusi maka MySQL akan menyimpan nilai-nilai tersebut ke dalam referensi NEW. Dengan demikian new.penerbit_id akan bernilai PB06 dan new.penerbit_nama akan bernilai INFORMATIKA.
Contoh lagi
UPDATE penerbit\n SET penerbit_nama = 'Informatika Bandung'\nWHERE\n penerbit_id = 'PB06';\n
Pada perintah UPDATE, referensi NEW berfungsi untuk menyimpan nilai-nilai yang akan digunakan untuk melakukan perubahan.
Nilai lama yang akan ditimpa dapat diakses menggunakan referensi OLD.
new.penerbit_nama bernilai Informatika Bandung, sedangkan old.penerbit_nama bernilai INFORMATIKA.
Contoh lagi
DELETE FROM penerbit\nWHERE penerbit_id = 'PB06';\n
Ketika perintah tersebut dieksekusi, maka referensi OLD akan menyimpan nilai-nilai dari baris data yang dihapus.
Maka old.penerbit_id bernilai PB06.
Kesimpulan
Referensi NEW akan menyimpan data baru pada proses INSERT dan UPDATE
Referensi OLD akan menyimpan data lama pada proses UPDATE dan DELETE
Baik referensi NEW maupun OLD bisa diakses dengan format new.[nama_kolom] atau old.[nama_kolom] contoh new.penerbit_nama atau old.penerbit_nama
Kita sudah tahu bahwasanya menggunakan trigger dapat membantu pekerjaan kita, namun kita perlu tahu juga bahwasanya trigger juga memiliki beberapa batasan berikut.
Kita tidak dapat menggunakan perintah CALL (perintah untuk mengeksekusi stored procedure),
Kita tidak dapat melakukan transaksi, semisal COMMIT dan ROLLBACK,
Kita tidak dapat membuat trigger untuk tabel temporari.
Untuk memberikan kasus yang lebih nyata, kita akan mencoba membuat beberapa trigger sesuai dengan database yang sedang kita kelola yaitu buku_db.
Kita akan membuat trigger AFTER UPDATE dan AFTER DELETE yang bertujuan untuk mencatat setiap perubahan data dan penghapusan data pada tabel buku, nantinya catatan tersebut disimpan di tabel histori_buku
Trigger AFTER UPDATE
Membuat trigger tr_au_buku yang akan diaktivasi setiap kali user mengubah data pada tabel buku.
DELIMITER $$\nCREATE TRIGGER tr_au_buku\nAFTER UPDATE\nON buku\nFOR EACH ROW\nBEGIN\n DECLARE isbn CHAR(13);\n DECLARE judul VARCHAR(75);\n DECLARE penerbit_id CHAR(4);\n DECLARE tgl_terbit DATE;\n DECLARE jml_halaman INT;\n DECLARE deskripsi TEXT;\n DECLARE harga DECIMAL(10,0);\n\n -- Mengisi nilai isbn\n IF new.buku_isbn IS NULL THEN\n SET isbn = old.buku_isbn;\n ELSE\n SET isbn = new.buku_isbn;\n END IF;\n\n -- mengisi nilai judul\n IF new.buku_judul IS NULL THEN\n SET judul = old.buku_judul;\n ELSE\n SET judul = new.buku_judul;\n END IF;\n\n -- mengisi nilai penerbit_id\n IF new.penerbit_id IS NULL THEN\n SET penerbit_id = old.penerbit_id;\n ELSE\n SET penerbit_id = new.penerbit_id;\n END IF;\n\n -- mengisi nilai tgl_terbit\n IF new.buku_tglterbit IS NULL THEN\n SET tgl_terbit = old.buku_tglterbit;\n ELSE\n SET tgl_terbit = new.buku_tglterbit;\n END IF;\n\n -- mengisi nilai jml_halaman\n IF new.buku_jmlhalaman IS NULL THEN\n SET jml_halaman = old.buku_jmlhalaman;\n ELSE\n SET jml_halaman = new.buku_jmlhalaman;\n END IF;\n\n -- mengisi nilai deskripsi\n IF new.buku_deskripsi IS NULL THEN\n SET deskripsi = old.buku_deskripsi;\n ELSE\n SET deskripsi = new.buku_deskripsi;\n END IF;\n\n -- mengisi nilai harga\n IF new.buku_harga IS NULL THEN\n SET harga = old.buku_harga;\n ELSE\n SET harga = new.buku_harga;\n END IF;\n\n -- memasukkan data ke dalam tabel histori_buku\n INSERT INTO histori_buku\n VALUES (\n isbn,\n judul,\n penerbit_id,\n tgl_terbit,\n jml_halaman,\n deskripsi,\n harga,\n 'UPDATE',\n CURRENT_DATE()\n ); \n\nEND $$\n
Trigger AFTER DELETE
Membuat trigger tr_ad_buku yang akan diaktivasi setiap kali user mengubah data pada tabel buku.
Selanjutnya, kita coba menghapus data dari tabel buku.
DELETE FROM buku\nWHERE buku_isbn = '999-11555-2-2';\n
Harusnya ada tambahan 2 baris data pada tabel histori_buku. Sekarang mari kita cek.
SELECT * FROM histori_buku;\n
Trigger BEFORE INSERT
Kali ini kita juga akan membuat trigger yang berfungsi melakukan validasi sebelum data dimasukkan ke dalam tabel buku.
Sebagai contoh, kita ingin memastikan bahwa kolom buku_jmlhalaman harus lebih besar dari 149, dan jika nilainya sama atau lebih kecil, maka MySQL server akan menolak untuk memasukkan baris data tersebut.
DELIMITER $$\nCREATE TRIGGER tr_bi_buku\nBEFORE INSERT\nON buku\nFOR EACH ROW\nBEGIN\n IF new.buku_jmlhalaman <= 149 THEN\n SIGNAL SQLSTATE '45000'\n SET MESSAGE_TEXT = 'Tidak bisa menambah buku, jumlah halaman terlalu sedikit.';\n END IF;\nEND $$\n
Untuk membuktikan pengaruh trigger tersebut, sekarang kita coba tambahkan data buku baru.
INSERT INTO buku VALUES(\n '999-11555-2-3',\n 'Microsoft Publisher',\n 'PB04',\n '2021/02/07',\n 100,\n NULL,\n 6000\n);\n
Hasilnya? \ud83d\ude0e
"},{"location":"bab12/","title":"Ekspor dan Impor","text":""},{"location":"bab12/#mengekspor-data","title":"Mengekspor Data","text":""},{"location":"bab12/#menggunakan-mysqldump","title":"Menggunakan mysqldump","text":""},{"location":"bab12/#menggunakan-mysqlhotcopy","title":"Menggunakan mysqlhotcopy","text":""},{"location":"bab12/#menyalin-file-data","title":"Menyalin File Data","text":""},{"location":"bab12/#menggunakan-backup-table","title":"Menggunakan BACKUP TABLE","text":""},{"location":"bab12/#mengimpor-data","title":"Mengimpor Data","text":""},{"location":"bab2/","title":"Manipulasi Data Dengan DML","text":"
INSERT, UPDATE, DELETE\n
"},{"location":"bab2/#memasukkan-data-tabel","title":"Memasukkan Data Tabel","text":""},{"location":"bab2/#tabel-kategori","title":"Tabel Kategori","text":"
INSERT INTO kategori (kategori_nama) VALUES\n('Database'),\n('Desain Grafis'),\n('Jaringan Komputer'),\n('Pemrograman'),\n('Web dan Internet'),\n('Office Application');\n
INSERT INTO penerbit VALUES\n('PB01','Angkasa Raya'),\n('PB02','Cahaya Ilmu Persada'),\n('PB03','Sinar Ilmu Perkasa'),\n('PB04','Intan'),\n('PB05','Sinar Raya'),\n('PB06','Informatika'),\n('PB07','Tiga Sekawan'),\n('PB08','Cipta Ilmu');\n
INSERT INTO buku VALUES\n('222-34222-1-0','Belajar Photoshop','PB01','2019/07/02',300,NULL,42000),\n('222-34222-1-1','Panduan CorelDRAW','PB02','2020/03/15',400,NULL,55000),\n('979-96446-9-0','Belajar SQL','PB06','2019/10/12',346,NULL,45000),\n('979-96446-9-1','Panduan Basis Data','PB01','2017/03/02',257,NULL,37000),\n('979-96446-9-2','Perancangan Sistem','PB03','2013/09/20',403,NULL,37000),\n('979-96446-9-3','Microsoft Access','PB06','2015/07/13',400,NULL,48500),\n('888-96771-3-0','Pemrograman Pascal','PB08','2014/11/01',350,NULL,50000),\n('888-96771-3-1','Pemrograman Java','PB06','2017/01/23',450,NULL,72000),\n('888-96771-3-2','Pemrograman C untuk Hardware','PB05','2016/12/25',398,NULL,47000),\n('888-96771-3-3','Panduan C++','PB06','2015/07/15',490,NULL,65000),\n('888-96771-3-4','Belajar Delphi','PB05','2018/08/11',328,NULL,50000),\n('888-96771-3-5','Visual Basic','PB02','2017/10/14',250,NULL,50000),\n('666-96771-2-0','Panduan Membangun Jaringan TCP/IP','PB08','2016/08/02',200,NULL,60000),\n('666-96771-2-1','Implementasi TCP/IP di Linux','PB08','2018/11/21',230,NULL,350000),\n('777-76723-5-0','Belajar PHP 8','PB07','2020/05/02',600,NULL,95000),\n('777-76723-5-1','Aplikasi Web dengan Python','PB07','2014/08/01',180,NULL,30000),\n('777-76723-5-2','Internet Marketing','PB07','2017/01/24',150,NULL,38500),\n('777-76723-5-3','Panduan Menjadi Youtuber','PB07','2017/01/24','243',NULL,38500),\n('999-11555-2-0','Microsoft Power Point','PB06','2018/11/23',300,NULL,57500),\n('999-11555-2-1','Microsoft Word','PB04','2017/12/01',270,NULL,60000);\n
"},{"location":"bab2/#tabel-link-buku-pengarang","title":"Tabel Link Buku Pengarang","text":"
INSERT INTO link_buku_pengarang VALUES\n('222-34222-1-0','P01'),\n('222-34222-1-1','P04'),\n('666-96771-2-0','P04'),\n('666-96771-2-0','P07'),\n('666-96771-2-0','P06'),\n('666-96771-2-1','P04'),\n('666-96771-2-1','P01'),\n('777-76723-5-0','P02'),\n('777-76723-5-0','P04'),\n('777-76723-5-1','P03'),\n('777-76723-5-1','P12'),\n('777-76723-5-1','P10'),\n('777-76723-5-2','P13'),\n('777-76723-5-3','P08'),\n('777-76723-5-3','P09'),\n('888-96771-3-0','P04'),\n('888-96771-3-1','P02'),\n('888-96771-3-1','P11'),\n('888-96771-3-2','P01'),\n('888-96771-3-2','P06'),\n('888-96771-3-3','P02'),\n('888-96771-3-4','P10'),\n('888-96771-3-4','P09'),\n('888-96771-3-5','P02'),\n('979-96446-9-0','P11'),\n('979-96446-9-0','P02'),\n('979-96446-9-1','P07'),\n('979-96446-9-2','P13'),\n('979-96446-9-2','P10'),\n('979-96446-9-2','P12'),\n('979-96446-9-2','P03'),\n('979-96446-9-3','P11'),\n('999-11555-2-0','P11'),\n('999-11555-2-0','P13'),\n('999-11555-2-1','P08'),\n('999-11555-2-1','P09'),\n('999-11555-2-1','P10'),\n('999-11555-2-1','P06');\n
"},{"location":"bab2/#tabel-link-buku-kategori","title":"Tabel Link Buku Kategori","text":"
INSERT INTO link_buku_kategori VALUES\n('222-34222-1-0',2),\n('222-34222-1-1',2),\n('979-96446-9-0',1),\n('979-96446-9-1',1),\n('979-96446-9-2',1),\n('979-96446-9-2',4),\n('979-96446-9-3',1),\n('888-96771-3-0',4),\n('888-96771-3-1',4),\n('888-96771-3-2',4),\n('888-96771-3-3',4),\n('888-96771-3-4',4),\n('888-96771-3-5',4),\n('666-96771-2-0',3),\n('666-96771-2-1',3),\n('777-76723-5-0',4),\n('777-76723-5-0',5),\n('777-76723-5-1',4),\n('777-76723-5-1',5),\n('777-76723-5-2',5),\n('777-76723-5-3',5),\n('999-11555-2-0',6),\n('999-11555-2-1',6);\n
Data yang ditampilkan dapat disaring (filter) berdasarkan kebutuhan informasi yang akan disajikan. Untuk menyaring data, perlu didefinisikan kondisi yang akan dijadikans ebagai kriteria penyaringan. Dalam perintah SELECT ditambah klausa WHERE setelahnya.
Contoh 1 Menampilkan data buku yang harganya kurang dari Rp. 45.000
SELECT\n buku_isbn as 'ISBN',\n buku_judul as 'JUDUL BUKU',\n buku_harga as 'HARGA'\nFROM\n buku\nWHERE\n buku_harga < 45000;\n
Menampilkan data buku yang harganya kurang dari Rp. 45.000 dan ISBN diawali oleh angka 777
SELECT\n buku_isbn as 'ISBN',\n buku_judul as 'JUDUL BUKU',\n buku_harga as 'HARGA'\nFROM\n buku\nWHERE\n (buku_harga < 45000) AND\n (buku_isbn LIKE '777%');\n
Menampilkan data dengan rentang tertentu Menggunakan klausa BETWEEN
Contoh BETWEEN 1
SELECT\n buku_isbn,\n buku_judul,\n buku_harga\nFROM\n buku\nWHERE\n buku_harga\n BETWEEN 50000 AND 60000;\n
Secara default data yang disajikan menggunakan printah SELECT akan ditmpilkan sesuai urutan data dimasukkan, kecuali pada kolom yang diatur sebagai primary key, maka dia akan urut sesui bilangan. Untuk mengurutkan data sesuai kolom tertentu kita bisa menggunakan klausa ORDER BY.
Contoh Penggunaan ORDER BY Mengurutkan datan sesuai kolom 'buku_judul'
"},{"location":"bab5/","title":"Seleksi Data - Bagian 2","text":""},{"location":"bab5/#pengelompokan-data-menggunakan-group-by","title":"Pengelompokan Data menggunakan GROUP BY","text":"
Penggunaan kalusa GROUP BY disertakan dalam perintah SELECT - Contoh 1
"},{"location":"bab5/#join-seleksi-data-dari-2-tabel-atau-lebih","title":"Join : Seleksi Data dari 2 Tabel atau Lebih","text":"
Seleksi data dari 2 tabel atau lebih, lebih rumit dibandingkan seleksi data dari 1 tabel. Syarat utamanya adalah adanya kolom relasi. Kolom relasi adalah kolom yang digunakan sebagai kunci untuk menghubungkan antara tabel yang satu dengan tabel yang lain.
Tampilkan data dari kolom buku_isbn dan buku_judul pada tabel buku dengan nama alias a, serta kolom penerbit nama pada tabel penerbit dengan nama alias b yang nilai penerbit_id nya sama.
Subquery adalah perintah SELECT yang terdapat dalam perintah SELECT lain. Hal ini memudahkan kita untuk membuat berbagai format laporan semisal crosstab query.
Contoh 1 Membuat query yang dapat menampilkan jumlah buku yang diterbitkan oleh masing-masing penerbit. kita akan menggunakan tabel buku dan tabel penerbit.
Pada contoh tersebut perintah SELECT bagian luar digunakan untuk menyeleksi data dari tabel penerbit, sedangkan bagian dalam digunakan untuk menyeleksi data dari tabel buku.
Subquery juga biasa digunakan sebagai kolom penentu kondisi query (di bagian WHERE).
Perintah di atas digunakan untuk menampilkan data pada tabel 'penerbit' (kolom 'penerbit_id' dan 'penerbit_nama') yang datanya tidak terdapat pada tabel buku.
View adalah objek di dalam database yang berisi kumpulan kolom yang dihasilkan dari perintah SELECT. Sederhananya view adalah objek yang menyimpan hasil query, baik dari satu tabel atau lebih. View juga sering disebut sebagai tabel virtual, karena view sebenranya tidak memiliki data. Data yang ditampilkan oleh view diambil dari tabel-tabel aktual yang disertakan dalam perintah SELECT.
"},{"location":"bab6/#mengapa-perlu-menggunakan-tabel-virtual","title":"Mengapa Perlu Menggunakan Tabel Virtual?","text":"
Dalam pengelolaan database, view memiliki manfaat bagi kita, di antaranya:
Akses data menjadi lebih mudah.
Dapat digunakan untuk menampilkan rangkuman dari suatu perhitungan tertentu.
Dapat menampilkan beberapa kolom atau beberapa baris saja dari suatu tabel, tergantung dari kondisi yang didefinisikan.
Dapat digunakan untuk menampilkan data yang berasal dari dua tabel atau lebih.
View dapat digunakan untuk menampilkan data yang berbeda untuk masing-masing user, sehingga setiap user hanya dapat melihat data yang sesuai dengan hak aksesnya.
Pada kasus-kasus tertentu, data yang terdapat dalam satu view juga harus dapat dimodifikasi menggunakan perintah INSERT, UPDATE maupun DELETE. Jika data dalam suatu view diubah, sebenarnya yang berubah adalah data pada base table.
Perintah di atas akan mendefinisikan view di dalam database dengan nama v_buku. View tersebut berisi perintah SELECT yang melibatkan dua tabel, yaitu buku dan penerbit. Kolom relasi antara dua tabel tersebut adalah kolom penerbit_id.
Sekarang kita bisa menampilkan data buku dengan SELECT view tersebut, berikut query-nya.
SELECT * FROM v_buku;\n
"},{"location":"bab6/#melihat-daftar-kolom-di-dalam-view","title":"Melihat Daftar Kolom di dalam view","text":"
Sama halnya seperti pada objek tabel, kita juga dapat melihat daftar kolom yang terdapat di dalam suatu view. Untuk melakukan hal ini kita bisa menjalankan query. Contoh:
Untuk mengubah definisi dari suatu view yang sebelumnya sudah dibuat, kita perlu menggunakan perintah ALTER VIEW. Perintah ini akan membuang atau menghapus definisi view yang lama dan menimpanya dengan definisi view yang baru. Format query-nya sebagai berikut.
ALTER VIEW [nama_view] AS [perintah SELECT yang baru]\n
Sekarang perhatikan dan jalankan query berikut.
ALTER VIEW v_buku AS\nSELECT\n a.buku_isbn,\n a.buku_judul,\n b.penerbit_nama,\n a.buku_harga\nFROM\n buku a,\n penerbit b\nWHERE\n a.penerbit_id = b.penerbit_id\nORDER BY\n a.buku_judul;\n
Kita dapat menghapus satua tau lebih view yang terdapat di dalam database dengan menggunakan perintah DROP VIEW. Format umum query-nya adalah sebagai berikut.
DROP VIEW [IF EXISTS] [nama_view];\n
IF EXISTS bersifat opsional dan berfungsi untuk mencegah terjadinya kesalahan pada saat perintah tersebut dieksekusi, yaitu dengan cara melakukan pemeriksaan terlebih dahulu, apakah view yang akan dihapus tersebut ada di dalam database atau tidak.
Jika nama view yang disertakan dalam perintah DROP VIEW ternyata tidak ada, maka server MySQL akan mengeluarkan pesan peringatan/ warning. Kitadapat menampilkan isi peringatan tersebut dengan perintah SHOW WARNINGS.
Perhatikan query berikut.
DROP VIEW v1, v2;\n
Query di atas akan menghapus dua view sekaligus. Sekarang jalankan query berikut untuk menghapus view v_buku.
DROP VIEW v_buku;\n
"},{"location":"bab6/#membuat-view-yang-dapat-dimodifikasi","title":"Membuat View yang Dapat Dimodifikasi","text":"
Suatu view dapat dimodifikasi jika kolom-kolom dalam view tersebut mengacu langsung ke kolom yang terdapat pada base tabel, bukan hasil proses perhitungan. Sebagai contoh, coba perhatikan dan jalankan query berikut.
Setelah berhasil mengupdate view v_jmlHalaman, kita coba ulangi perintah berikut dan perhatikan hasilnya.
SELECT * FROM v_jmlHalaman\nWHERE\n buku_isbn = \"999-1555-2-1\";\n
Perhatikan nilai dari kolom buku_jmlhalaman. Nilai yang ditampilkan sekarang adalah 280, yang awalnya bernilai 270. Ini terjadi karena kita telah melakukan modifikasi terhadap view v_jmlHalaman menggunakan perintah UPDATE.
Data yang sebenarnya diubah adalah data pada kolom tabel yang diakses, bukan data di dalam view yang bersangkutan. karena secara fisik view tidak pernah memiliki data. Karena inilah view sering disebut sebagai tabel virtual. Untuk membuktikan hal ini sekarang mari kita lihat datanya langsung dari tabel asli.
Hasil yang diperoleh akan sama seperti pada asat kita mengaksesnya melalui view v_jmlHalaman."},{"location":"bab6/#batasan-batasan-dalam-penggunaan-view","title":"Batasan-batasan dalam Penggunaan View","text":"
Pendefinisian view dapat menggunakan klausa-klausa yang terdapat pada perintah SELECT, seperti WHERE, GROUP BY, ORDER BY dan lain-lain. Namun demikian ada batasan-batasan yang perlu diperhatikan, yaitu:
Kita tidak dapat membuat view temporari
Kita tidak dapat mengasosiasikan trigger dengan view
Tabel-tabel yang diakses oleh view harus ada di dalam database. Jika nama tabel diubah, maka view tidak dapat digunakan lagi, karena terjadi kesalahan pada saat dieksekusi
Perintah SELECT yang didefinisikan di dalam view tidak boleh berisi kontruksi-kontruksi berikut:
User adalah orang yang dapat menggunakan database. Sejauh mana user tersebut dapat bekerja di dalam database ditentukan dari hak akses yang dimilikinya: apakah sebagai Database Administrator yang memiliki hak akses penuh terhadap database yang diolah ataupun sekedar Operator yang memiliki hak akses terbatas sesuai jenis pekerjaannya.
Format query untuk membuat user adalah sebagai berikut.
CREATE USER [nama_user] IDENTIFIED BY [password];\n
Jalankan query berikut untuk membuat user baru.
CREATE USER 'admin' IDENTIFIED BY 's3cr3t';\n
Query tersebut akan membuat user baru dengan nama admin dan password s3cr3t. Ingat, bahwa user tersebut baru kita buat dan belum memiliki hak akses apapun terhadap database, namun kita sudah bisa login ke server MySQL menggunakan user tersebut.
Keluar dari user saat ini dengan perintah \\q lalu ENTER. Selanjutnya mari kita login
mysql -u admin -p\n
Tekan ENTER lalu masukkan password s3cr3t dan tekan ENTER. Setelah berhasil coba jalankan query berikut.
Menampilkan database
SHOW DATABASES;\n
Mengaktifkan/ menggunakan database buku_db
USE buku_db;\n
Apa hasilnya? \ud83d\ude02"},{"location":"bab7/#mengenal-hak-akses","title":"Mengenal Hak Akses","text":"
Hak akses adalah suatu izin yang dapat diberikan kepada seorang user. Dengan izin tersebut, seorang user dapat melakukan aksi-aksi tertentu terhadap database.
Hak akses tersebut dikelompokkan menjadi 2, yaitu:
Tingkat User
Tingkat Administrator
Hak Akses Tingkat User
Hak Akses Keterangan CREATE Membuat database, tabel atau indeks CREATE TEMPORARY TABLE Membuat tabel temporari CREATE VIEW Membuat view DELETE Menghapus baris data EXECUTE Mengeksekusi prosedur INDEX Membuat indeks INSERT Memasukkan baris-baris data ke dalam tabel LOCK TABLES Mengunci suatu tabel SELECT Mengambil/ memilih data dari tabel SHOW DATABASES Menampilkan semua database SHOW VIEW Melihat daftar view yang dimiliki database UPDATE Mengubah data di dalam tabel USAGE Melakukan login, tapi tidak bisa melakukan apapun
Hak Akses Tingkat Administrator
Hak Akses Keterangan ALL Memiliki semua hak akses, kecuali WITH GRANT OPTION ALTER Mengubah struktur tabel CREATE USER Membuat user lain DROP Menghapus database, tabel atau view FILE Memuat data dari suatu file PROCESS Melihat daftar proses yang dieksekusi MySQL RELOAD Menggunakan perintah FLUSH SHUTDOWN Menghentikan server MySQL"},{"location":"bab7/#memberi-hak-akses","title":"Memberi Hak Akses","text":"
Perintah yagn digunakan untuk memberikan hak akses adalah GRANT, format umumnya sebgaimana berikut.
GRANT [hak akses]\nON [nama_tabel]|*|*.*|[nama_database]\nTO [nama_user]\nIDENTIFIED BY [password];\n
Jalankan query berikut untuk memberikan semua hak akses pada semua tabel yang terdapat dalam database bukudb kepada user admin.
GRANT ALL\nON bukudb.*\nTO 'admin'@'%'\nIDENTIFIED BY 's3cr3t';\n
Terkadang kita tidak perlu memberikan semua hak akses kepada user tertentu, untuk itu kita bisa menjalankan query berikut sebagai contohnya.
GRANT USAGE, INSERT, UPDATE, DELETE, SELECT\nON pengarang\nTO 'admin'@'%'\nIDENTIFIED BY 's3cr3t';\n
Dengan query tersebut, maka user admin hanya bisa memasukkan, mengubah, menghapus dan mengambil/ menampilkan data yang terdapat pada tabel pengarang saja.
"},{"location":"bab7/#mencabut-hak-akses","title":"Mencabut Hak Akses","text":"
Untuk mencabut/ menarik kembali hak akses dari user tertentu bisa menggunakan perintah REVOKE dengan format
Query tersebut akan mencabut hak akses USAGE, INSERT, UPDATE, DELETE, SELECT dari user admin terhadap tabel pengarang."},{"location":"bab7/#menghapus-user","title":"Menghapus User","text":"
Untuk menghapus user format query-nya adalah
DROP USER [nama_user_1], [nama_user_2], ...dst;\n
Mari kita coba
DROP USER 'admin'@'%';\n
"},{"location":"bab7/#mengetahui-tabel-hak-akses","title":"Mengetahui Tabel Hak Akses","text":"
Ketika kita menjalankan query GRANT dan REVOKE, sebenarnya MySQL menyimpan data hak akses tersebut di dalam database mysql. Sehingga sebenarnya kita bisa saja melihat bahkan memberi ataupun menghapus hak akses user dengan memanipulasi database mysql tanpa melakukan query GRANT dan REVOKE.
Jika kita ingin memodifikasi data secara langsung, kita harus menjalankan query
FLUSH PRIVILEGES\n
Perintah tersebut berfungsi me-refresh perubahan yang telah dilakukan ke dalam database mysql.
Berikut beberapa tabel dalam database mysql yang berkaitan dengan proses pemberian dan pencabutan hak akses user.
user
Menyimpan informasi global tentang user dan hak akses yang dimilikinya.
db
Menyimpan informasi hak akases yang berkaitan dengan database untuk user tertentu.
tables_priv
Menyimpan informasi hak akses yang berkaitan dengan tabel untuk user tertentu.
columns_priv
Menyimpan informasi hak akses yang berkaitan dengan kolom untuk user tertentu.
Coba kita jalankan query berikut.
Mengaktifkan database mysql dan menampilkan seluruh tabel di dalamnya.
Fungsi Agregasi adalah fungsi di dalam MySQL yang digunakan untuk melakukan perhitungan pada query. Pada umumnya penggunaannya dikombinasikan dengan klausa GROUP BY untuk menghasilkan rangkuman nilai yang dikelompokkan berdasarkan nilai tertentu.
Berikut ini beberapa fungsi yang termasuk dalam fungsi agregasi:
MIN() berfungsi untuk mengembalikan nilai terkecil dari suatu kolom.
Jika fungsi MIN() digunakan pada kolom bertipe numerik, maka akan mengembalikan angka terkecil, jika diterapkan pada kolom bertipe karakter, maka akan mengembalikan karakter dengan urutan alfabet paling awal. Berikut contohnya.
Menampilkan jumlah halaman paling sedikit
SELECT MIN(buku) FROM buku;\n
Menampilkan urutan abjad paling awal dari judul buku
SUM() berguna untuk menjumlahkan nilai dari suatu kolom dalam tabel tertentu. Contoh:
SELECT SUM(buku_jmlhalaman) FROM buku;\n
Nilai yang tampil merupakan total dari semua jumlah halaman buku pada kolom buku_jmlhalaman."},{"location":"bab8/#fungsi-count","title":"Fungsi COUNT()","text":"
Berbeda dengan SUM(), fungsi COUNT() akan mengembalikan jumlah baris data pada kolom dari tabel tertentu.
Contoh, menampilkan jumlah buku dari penerbit dengan penerbit_id = PB06.
Berfungsi untuk mendapatkan nilai rata-rata dari suatu kolom. Sebagai contoh, kita ibsa menghitung nilai rata-rata dari jumlah halaman buku dengan kode penerbit PB06 dengan perintah berikut.
Fungsi GROUP_CONCAT() memiliki beberapa bentuk penggunaan, yaitu:
Dalam keadaan standar (default), pemisah yang digunakan adalah tanda koma (,). Kita dapat mengubah pemisah tersebut menggunakan karakter lain dengan menambahkan klausa SEPARATOR, contoh:
Kita dapat menggunakan ORDER BY untuk mengurutkan nilai yang akan digabung dalam teks tunggal, contoh:
SELECT\n GROUP_CONCAT(penerbit_nama ORDER BY penerbit_nama)\nFROM\n penerbit;\n
Jika terdapat duplikasi nilai yang akan digabung ke dalam teks tunggal, maka nilai duplikat tersebut dapat dihilangkan menggunakan klausa DISTINCT, contoh:
Hasilnya adalah 1 karena nilai NULL tidak dihitung sebagai 1 baris data, dengan kata lain NULL diabaikan.
Perintah SELECT mungkin saja menghasilkan baris kosong atau nilai NULL di setiap barisnya. Jika kita menggunakan fungsi agregasi pada kolom yang berisi baris kosong atau nilai NULL di setiap baris yang ada, maka:
Untuk fungsi COUNT(), nilai yang dihasilkan adalah 0 (nol)
Untuk fungsi MIN(), MAX(), SUM(), AVG() dan GROUP_CONCAT() akan menghasilkan nilai NULL
Sebagai bukti, coba kita hapus 1 baris data yang berisi nilai non-NULL.
DELETE FROM tnull\nWHERE a=1;\n
Lalu kita cek data yang tersisa
SELECT * FROM tnull;\n
Selanjutnya kita coba eksekusi satu-persatu fungsi agregasi untuk mengetahui nilai yang dikembalikan.
SELECT COUNT(a) FROM tnull;\n
Perintah di atas akan menghasilkan nilai 0 (nol), namun jika kita mencoba fungsi agregasi yang lain,
SELECT MIN(a) FROM tnull;\nSELECT MAX(a) FROM tnull;\nSELECT SUM(a) FROM tnull;\nSELECT AVG(a) FROM tnull;\nSELECT GROUP_CONCAT(a) FROM tnull;\n
Semua perintah di atas akan menghasilkan nilai NULL."},{"location":"bab9/","title":"Operator dan Fungsi","text":"
MySQL menyediakan banyak operator dan fungsi built-in yang dapat bermanfaat dalam pembuatan query.
Fungsi built-in adalah fungsi siap pakai yang sudah didefinisikan oleh MySQL untuk menunjang kemudahan bagi para penggunanya.
Pada umumnya operator dan fungsi digunakan pada perintah SELECT dan klausa WHERE.
Beberapa fungsi yang sering dipakai dapat dikelompokkan menjadi:
Operator merupakan simbol-simbol khusus yang digunakan untuk melakukan operasi-operasi tertentu, misalnya perhitungan, perbandingan dua nilai dan lain-lain.
Ketika menulis sebuah query kita akan sering menggunakan operator.
Operator aritmatika digunakan untuk melakukan perhitungan di dalam query maupun prosedur/ fungsi. Berikut daftarnya
Operator Keterangan + Untuk melakukan operasi penjumlahan - Untuk melakukan operasi pengurangan * Untuk melakukan operasi perkalian / Untuk melakukan operasi pembagian
Contoh kasus, kita akan menghitung harga buku tertentu yang sudah didiskon sebanyak 25%.
Operator relasional digunakan untuk membandingkan dua nilai atau ekspresi. Berikut tabel operator-operator yang termasuk.
Operator Keterangan = Sama dengan != atau <> Tidak sama dengan < Lebih kecil <= Lebih kecil atau sama dengan > Lebih besar >= Lebih besar atau sama dengan n BETWEEN min AND max Memeriksa n apakah berada di dalam rentang min dan max atau tidak n IN (set) Memeriksa keanggotaan himpunan (set), apakah n anggota dari himpunan yang didefinisikan atau tidak n IS NULL Memeriksa nilai n dengan nilai NULLISNULL(n) Memeriksa nilai n, NULL atau tidak
Sebagai contoh, kita akan menampilkan daftar buku yang harganya di bawah Rp. 50.000.
Query di atas akan mencari teks base di dalam teks Pemrograman Database MySQL dimulai dari posisi karakter ke-1. Jika karakter yang dimaksud tidak ditemukan, maka MySQL akan mengembalikan nilai 0.
Fungsi lower() dan upper()
lower() berfungsi untuk mengubah teks menjadi huruf kecil, sedangkan upper() berfungsi mengubah teks menjadi huruf kapital. Contoh:
quote() digunakan untuk mengapit teks menggunakan tanda petik tunggal. Sebagai contoh, jika kita igin membuat teks untuk proses INSERT dalam suatu prosedur/ fungsi yang didefinisikan sendiri. Contoh:
SET @STR = 'MySQL';\nSELECT @STR;\n
Perintah di atas akan memberikan hasil berupa string 'MySQL'. Sekarang coba yang ini.
SET @STR = quote('MySQL');\nSELECT @STR;\n
Perintah tersebut akan menampilkan string 'MySQL' yang mengandung tanda kutip.
Fungsi replace()
Kita bisa mengganti bagian teks tertentu dengan fungsi ini. Contoh:
Perintah di atas akan mengganti teks Database yang berada pada string Pemrograman Database dengan teks MySQL.
Fungsi substring()
Digunakan untuk mengambil karakter atau bagian teks (dengan jumlah tertentu) dari suatu teks. Contoh:
SELECT SUBSTRING('MySQL', 1, 2);\n
Perintah di atas akan mengambil 2 karakter dari teks MySQL dimulai dari karakter ke-1, sehingga menghasilkan teks QL.
Fungsi trim()
Pada kasus-kasus tertentu, sering kali terjadi data yang tersimpan di dalam dataabse memiliki format yang belum sempurna. Sebagai contoh, data yang seharusnya berupa 'MySQL', tapi pada kenyataannya di dalamd database tertulis 'My SQL' atau ' MySQL' (mengandung whitespace atau karakter kosong baik di depan atau di belakang teks).
Kesalahan data seperti ini biasanya (tanpa sengaja) dilakukan oleh pneggna aplikasi atau operator entri data. Sebagai contoh, secara tidak sadar pengguna aplikasi telah menekan tombol spasi pada saat sedang melakukan entri data. Dengan demikian, data yang tersimpan di dalam database juga akan ikut mengandung spasi.
Kasus semacam ini terkadang sering membuat pusing para programmer database dan DBA (Database Administrator) pada saat mereka menulis query. Pasalnya, emreka merasa bahwa query sudah tertulis dengan benar, tapi data atau hasil yagn ditampilkan tidak sesuai dengan keinginan.
Untuk mengatasi masalah tersebut, kita bisa menggunakan fungsi trim() pada saat membandingkan data berupa teks. Jika kita ingin menghilangkan whitespace di awal string kita gunakan ltrim(), sedangkan jika di akhir string menggunakan rtrim(). Contoh:
Untuk mengolah data bilangan, MySQL sudah menyediakan beberapa fungsi. Berikut tabelnya.
Fungsi Keterangan abs() Mengembalikan nilai mutlak dari n. Misal abs(-10) akan mengembalikan nilai 10. round() Membulatkan bilangan desimal n menjadi bilangan bulat. Misal round(3.45) hasilnya 3. ceiling(n) Pembulatan ke atas terdekat. Misal ceiling(3.25) menghasilkan 4. floor(n) Pembulatan ke bawah terdekat. Misal floor(3.97) menghasilkan nilai 3. mod(n,m) Operasi sisa hasil bagi/ modulus. Misal mod(11,4) menghasilkan nilai 3. power(n,m) Mengembalikan nilai n pangkat m. Misal power(10,2) hasilnya 100. sqrt(n) Mengembalikan akar pangkat 2 dari n. Misal sqrt(4) hasilnya 2. rand(n) Mengembalikan nilai acak (random) antara 0 dan 1. Parameter n bersifat opsional."},{"location":"bab9/#fungsi-tanggal-dan-waktu","title":"Fungsi Tanggal dan Waktu","text":"
Kolom bertipe tanggal dan waktu umumnya digunakan untuk mencatat kapan suatu transaksi atau kejadian terjadi dalam database.
Fungsi Keterangan Contoh now() Mengembalikan tanggal dan waktu saat ini (tanggal penuh dengan jam, menit, detik). SELECT now(); hasil: 2024-11-29 10:15:30curdate() Mengembalikan tanggal hari ini (hanya tanggal, tanpa waktu). SELECT curdate(); hasil: 2024-11-29curtime() Mengembalikan waktu saat ini (hanya jam, menit, dan detik). SELECT curtime(); hasil: 10:15:30extract(day from [tanggal]) Mengambil nilai hari dari kolom tanggal. SELECT extract(day from '2024-11-29'); hasil: 29extract(month from [tanggal]) Mengambil nilai bulan dari kolom tanggal. SELECT extract(month from '2024-11-29'); hasil: 11extract(year from [tanggal]) Mengambil nilai tahun dari kolom tanggal. SELECT extract(year from '2024-11-29'); hasil: 2024dayname([tanggal]) Mengembalikan nama hari dari tanggal tertentu (dalam bahasa Inggris). SELECT dayname('2024-11-29'); hasil: Fridaydate_format([tanggal], format) Memformat tanggal sesuai pola tertentu. SELECT date_format('2024-11-29', '%d-%m-%Y'); hasil: 29-11-2024time_format([waktu], format) Memformat waktu sesuai pola tertentu. SELECT time_format('10:15:30', '%h:%i %p'); hasil: 10:15 AM
Penjelasan Format untuk date_format dan time_format:
%d = Hari (01-31)
%m = Bulan (01-12)
%Y = Tahun (4 digit)
%h = Jam (01-12, format 12 jam)
%i = Menit (00-59)
%p = AM atau PM
Catatan:
Format dapat disesuaikan dengan kebutuhan untuk menampilkan data yang lebih user-friendly. Contoh-contoh di atas juga dapat digunakan dalam perintah SQL untuk pengolahan data.
"}]}
\ No newline at end of file
+{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Beranda","text":""},{"location":"#selamat-datang","title":"Selamat Datang","text":""},{"location":"#tutorial-belajar-mysql","title":"Tutorial Belajar MySQL","text":""},{"location":"#edisi-best-practice","title":"Edisi Best Practice","text":"
Mulai Belajar
Beliin Kopi
"},{"location":"bab1/","title":"Mendefinisikan Data dengan DML","text":"
ALTER TABLE\n kategori\nRENAME TO\n kategori_buku;\n
Menambah kolom
ALTER TABLE\n buku\nADD COLUMN\n buku_sinopsis text;\n
Mengubah Kolom
ALTER TABLE\n buku\nCHANGE\n buku_isbn buku_id char(15);\n
Menghapus kolom
ALTER TABLE\n buku\nDROP\n buku_sinopsis;\n
Menambah primary key
ALTER TABLE\n buku\nADD\n primary key(buku_judul);\n
Menambah foreign key
ALTER TABLE\n link_buku_kategori\nADD\n foreign key(buku_isbn)\n references buku(buku_isbn);\n
Menghapus primary key
ALTER TABLE\n buku\nDROP primary key;\n
Menghapus foreign key
ALTER TABLE\n fk_link_buku_kategori;\n
Menambah indeks
ALTER TABLE\n buku\nADD INDEX\n idx_judul(buku_judul);\n
Menghapus indeks
ALTER TABLE\n buku\nDROP INDEX\n idx_judul;\n
Menghapus Tabel
DROP TABLE IF EXIST\n link_buku_kategori;\nDROP TABLE\n link_buku_kategori,\n link_buku_pengarang;\n
"},{"location":"bab10/","title":"Prosedur dan Fungsi","text":"
Prosedur dan fungsi merupakan objek database yang berisi runtutan perintah untuk melaksanakan satu tugas khusus tertentu.
Prosedur dan fungsi disimpan di dalam database, sehingga jika database dihapus, keduanya kan hilang.
Prosedur dan fungsi sering juga disebut sebagai stored procedure dan stored function.
Sekali dibuat, prosedur dan fungsi dapat digunakan secara berulang.
"},{"location":"bab10/#manfaat-prosedur-dan-fungsi","title":"Manfaat Prosedur dan Fungsi","text":"
Pembuatan prosedur dan fungsi memiliki beberapa manfaat, di antaranya:
Sintaks SQL lebih fleksibel
Mengizinkan kita untuk menulis kode logis di dalam prosedur atau fungsi (bisa mengandung kontruksi pengulangan maupun percabangan).
Memiliki kemampuan untuk menanganni kesalahan (error)
Kesalahan yang terjadi pada saat eksekusi prosedur atau fungsi dapat ditangani dengan benar.
Pembungkusan kode (code packaging and encapsulation)
Prosedur dan fungsi di simpan di dalam server database. Dengan demikian, kode hanya ditulis sekali, tapi prosedur atau fungsi tersebut dapat digunakan oleh banyak aplikasi klien. Tentu hal ini akan meringankan tugas dari aplikasi klien.
Mudah dipelihara
Kita hanya perlu merubah kode prosedur atau fungsi di sisi server dan perubahan otomatis akan diterpakna ke semua aplikasi klien.
"},{"location":"bab10/#perbedaan-prosedur-dan-fungsi","title":"Perbedaan Prosedur dan Fungsi","text":"
Perbedaan antara prosedur dan fungsi terletak pada peruntukan, cara pembuatan dan cara eksekusinya. Berikut hal-hal yang perlu diperhatikan.
Prosedur tidak mengembalikan nilai
Prosedur hanya melakukan suatu proses atau operasi tertentu, contohnya mengubah struktur tabel dan data dalam suatu tabel. Prosedur dieksekusi menggunakan perintah CALL.
Fungsi mengembalikan nilai
Cara eksekusinya adalah dengan meletakkan nama fungsi (beserta parameternya, jika ada) sebagai ekspresi, misalnya dalam perintah SELECT, dalam rumus perhitungan maupun ayng lain. Ini berarti bahwa pemanggilan fungsi sama seperti penggunaan variabel atau konstanta.
Cara Eksekusi
Fungsi tidak bisa dieksekusi menggunakan perintah CALL. Demikian juga, prosedur tidak dapat dieksekusi di dalam ekspresi.
Parameter
Parameter yang didefinisikan di dalam prosedur dapat bersifat sebagai parameter masukan (input only), parameter keluaran (output only), mapupun gabungan dari keduanya (dikenal dengan parameter masukan/keluaran). Karena alasan tersebut,s ebenarnya prosedur juga dapat digunakan untuk mengembalikan nilai, asalkan nilai tersebut ditampung ke dalam parameter keluaran. Fungsi hanya memiliki parameter masukan.
Klausa RETURNS
Karena fungsi merupakan sub-program yagn mengembalikan nilai, maka saat pembuatannya kita harus menggunakan klausa RETURNS di bagian kepala atau judul fungsi dan diikuti dengan tipe data dari nilai yang akan dikembalikan.
Selain itu, di bagian akhir badan fungsi kita juga perlu menggunakan klausa RETURN untuk mengembalikan nilai yang diperoleh dari proses yang telah dilakukan oleh fungsi. Klausa RETURNS dan RETURN tidak ditemukans saat kita mendeklarasikan prosedur.
"},{"location":"bab10/#membuat-dan-mengeksekusi-prosedur","title":"Membuat dan Mengeksekusi Prosedur","text":"
Prosedur dapat memiliki satu atau lebih perintah yang dikumpulkan menjadi satu kelompok. Oleh karena itu, kita perlu menggunakan blok BEGIN-END.
Setiap perintah di dalma prosedur harus dipisahkan menggunakan tanda titik koma/ semicolon (;).
Format pembuatan prosedur pada umumnya sebagaimana berikut.
DELIMITER //\nCREATE PROCEDURE select_penerbit()\nBEGIN\n SELECT penerbit_nama\n FROM penerbit\n WHERE penerbit_id='PB06';\nEND;\n//\n
Sekarang coba kita jalankan prosedurnya.
CALL select_penerbit();\n
Setelah dijalankan, kita tahu bahwa prosedur select_penerbit() tersebut berfungsi untuk menampilkan nama penerbit yang memiliki id penerbit PB06.
Selanjutnya, kita coba membuat prosedur yang memiliki parameter.
DELIMITER //\nCREATE PROCEDURE\n insert_penerbit(id char(4), nama varchar(50))\nBEGIN\n INSERT INTO penerbit\n (penerbit_id, penerbit_nama)\n VALUES (id, nama);\nEND;\n//\n
Selanjutnya kita coba eksekusi.
CALL insert_penerbit('PB10','Sinar Terang');\n
Kita tahu bahwa prosedur yang baru saja kita buat dan kita jalankan berfungsi untuk menambahkan data penerbit. Untuk membuktikannya coba kita cek data penerbit dengan perintah
SELECT * FROM penerbit;\n
Tentu saja ada penerbit Sinar Terang dengan penerbit_id PB10 bertengger di baris terakhir."},{"location":"bab10/#membuat-dan-mengeksekusi-fungsi","title":"Membuat dan Mengeksekusi Fungsi","text":"
Untuk membuat fungsi kita perlu menggunakan CREATE FUNCTION disusul dengan RETURNS dan diakhiri dengan RETURN. Berikut formatnya.
RETUNRS [tipe data] berfungsi untuk menentukan tipe data keluaran dari fungsi tersebut. Semisal kita ingin emngembalikan nilai berupa bilangan bulat, berarti kita perlu menulis RETURNS INT.
Mari kita buat contohnya.
CREATE FUNCTION harga_buku(isbn CHAR(13))\n RETURNS DECIMAL(10, 0) DETERMINISTIC\nBEGIN\n-- Mendeklarasikan veriabel\nDECLARE harga DECIMAL(10,0);\n\n-- Seleksi data dan menampung hasilnya ke dalam variabel\nSELECT buku_harga INTO harga\nFROM buku\nWHERE buku_isbn = isbn;\n\n-- Mengembalikan nilai hasil proses\nRETURN harga;\n\nEND;\n//\n
Kita juga bisa memanggil fungsi di dalam ekspresi secara langsung. Contoh:
SET total = harga_buku('222-34222-1-0') * 2;\n
Dalam contoh tersebut, pemanggilan fungsi secara langsung digunakan untuk proses perkalian dengan bilangan lain. Dengan demikian, eksekusi fungsi perlakuannya sama dengan penggunaan variabel normal."},{"location":"bab10/#menghapus-prosedur-dan-fungsi","title":"Menghapus Prosedur dan Fungsi","text":"
Kita gunakan DROP PROCEDURE untuk menghapus prosedur, dan DROP FUNCTION untuk menghapus fungsi, diikuti nama prosedur ataupun fungsi. Contoh:
-- Menghapus prosedur\nDROP PROCEDURE select_penerbit;\n\n-- Menghapus fungsi\nDROP FUNCTION harga_buku;\n
"},{"location":"bab10/#menampilkan-daftar-prosedur-dan-fungsi","title":"Menampilkan Daftar Prosedur dan Fungsi","text":"
Ada beberapa variasi perintah di dalam MySQL untuk menampilkan prosedur maupun fungsi.
Query-1
Menampilkan seluruhprosedur yang tersimpan di dalam database beserta properti dan informasi metadata lainnya.
SHOW PROCEDURE STATUS;\n
Query-2
Menampilkan prosedur berdasarkan filter yang dilakukan menggunakan klausa LIKE.
SHOW PROCEDURE STATUS\nWHERE name LIKE 'insert';\n
Query-3
Menampilkan seluruh fungsi yang tersimpan dalam database, beserta properti dan informasi metadata dari fungsi-fungsi tersebut.
SHOW FUNCTION STATUS;\n
"},{"location":"bab10/#hak-akses-untuk-bekerja-dengan-prosedur-dan-fungsi","title":"Hak Akses untuk Bekerja dengan Prosedur dan Fungsi","text":"
Untuk bekerja menggunakan prosedur dan fungsi kita perlu memiliki beberapa hak akses berikut.
CREATE ROUTINE
Untuk membuat prosedur maupun fungsi.
EXECUTE
Untuk mengeksekusi prosedur maupun fungsi.
ALTER ROUTINE
Untuk mengubah atau menghapus prosedur maupun fungsi.
"},{"location":"bab10/#variabel-di-dalam-prosedur-dan-fungsi","title":"Variabel di dalam Prosedur dan Fungsi","text":"
Pada saat membuat prosedur maupun fungsi, terkadang kita memerlukan satu atau lebih variabel untuk menampung nilai sementara dari proses yang dilakukan di dalam prosedur atau fungsi bersangkutan.
Untuk mendeklarasikan variabel, kita gunakan perintah DECLARE, formatnya adalah
DECLARE [nama_variabel] [tipe data];\n
Perintah DECLARE harus berada di dalam blok BEGIN-END sebagai mana pada contoh sebelumnya di sini. Pada contoh tersebut kita mendeklarasikan variabel harga dengan tipe DECIMAL dengan lebar 10.
Untuk melakukan inisialisasi nilai terhadap variabel yang telah dideklarasikan, kita perlu menggunakan perintah SET dengan format
SET [nama_variabel] = [nilai]\n
Contoh:
BEGIN\n DECLARE harga DECIMAL(10, 0);\n SET harga = 0;\n ...\nEND;\n
Jika suatu variabel diugnakan untuk menampung nilai yang diperoleh dari suatu tabel dalam database, kita bisa mengisikannya ke dalam variabel dengan perintah SELECT ... INTO. Contoh:
BEGIN\n ...\n SELECT buku_harga INTO harga\n FROM buku\n WHERE buku_isbn = isbn;\n ...\nEND;\n
"},{"location":"bab10/#pemilihan-dalam-prosedur-dan-fungsi","title":"Pemilihan dalam Prosedur dan Fungsi","text":"
IF dan CASE bisa kita gunakan untuk melakukan pemilihan perintah atau aksi. Pemilihan ini didasarkan pada kondisi tertentu.
Dalam blok pemilihan, aksi hanya dieksekusi jika kondisi yang didefinisikan bernilai benar.
Ini adalah bentuk yang paling sederhana, karena hanya memiliki satu kondisi untuk diperiksa. Jika ekspresi bernilai benar, maka daftar aksi akan dieksekusi, namun jika salah, maka aksi tidak akan dijalankan.
Ini adalah bentuk yang sedikit lebih kompleks. Jika kondisi1 bernilai benar, maka daftar aksi1 akan dijalankan. Jika tidak, maka akan dilanjutkan pengecekan kondisi2, jika benar, maka daftar aksi2 akan dijalankan. Jika tidak maka daftar aksi3 yang akan dijalankan.
Kita coba contoh berikut.
DELIMITER //\nCREATE FUNCTION get_penerbit9isbn CHAR(13)\n RETURNS VARCHAR(50) DETERMINISTIC\nBEGIN\n DECLARE namapenerbit VARCHAR(50);\n SELECT b.penerbit_nama INTO namapenerbit\n FROM\n buku a,\n penerbit b\n WHERE\n a.penerbit_id = b.penerbit_id\n AND\n a.buku_isbn = isbn;\n\n IF namapenerbit IS NULL THEN\n SET namapenerbit = '';\n END IF;\n\n RETURN namapenerbit;\nEND;\n//\n
Penjelasan Kode
Inti penggunaan IF pada kode di atas adalah, jika namapenerbit bernilai NULL maka variabel namapenerbit akan diisi dengan nilai string kosong.
CASE [ekspresi]\n WHEN [nilai1]\n THEN [daftar aksi1];\n WHEN [nilai2]\n THEN [daftar aksi2];\n ...[dst]\n\n ELSE [daftar aksi]\nEND CASE\n
Penjelasan Kode
Jika ekspresi yang diperiksa memiliki nilai yang sama dengan nilai1, maka yang akan dieksekusi adalah daftar aksi1. Jika ekspresi sama dengan nilai2, maka yang akan dieksekusi adalah daftar aksi2, dan seterusnya.
Jika semua nilai konstan yang didefinisikan tidak ada yang sama dengan ekspresi, maka yang akan dieksekusi adalah daftar aksi yang terdapat pada bagian ELSE.
Sekarang kita coba menerapkan CASE dengan fungsi berikut.
DELIMITER //\nCREATE FUNCTION ubah_format_tanggal(tanggal DATE)\n RETURNS VARCHAR(30) DETERMINISTIC\nBEGIN\n DECLARE dd INT(2);\n DECLARE mm INT(2);\n DECLARE yy INT(4);\n DECLARE bulan VARCHAR(9);\n\n SET dd = EXTRACT(DAY FROM tanggal);\n SET mm = EXTRACT(MONTH FROM tanggal);\n SET yy = EXTRACT(YEAR FROM tanggal);\n\n CASE mm\n WHEN 1 THEN SET bulan = 'Januari';\n WHEN 2 THEN SET bulan = 'Februari';\n WHEN 3 THEN SET bulan = 'Maret';\n WHEN 4 THEN SET bulan = 'April';\n WHEN 5 THEN SET bulan = 'Mei';\n WHEN 6 THEN SET bulan = 'Juni';\n WHEN 7 THEN SET bulan = 'Juli';\n WHEN 8 THEN SET bulan = 'Agustus';\n WHEN 9 THEN SET bulan = 'September';\n WHEN 10 THEN SET bulan = 'Oktober';\n WHEN 11 THEN SET bulan = 'November';\n WHEN 12 THEN SET bulan = 'Desember';\n END CASE;\n\n RETURN CONCAT(\n CONVERT(dd, CHAR),\n ' ',\n bulan,\n ' ' ,\n CONVERT(yy, CHAR)\n );\nEND\n//\n
Penjelasan Kode
Fungsi di atas berguna untuk mengubah format tanggal yang dilewatkan sebagai parameter, dari bentuk standar (dalam format angka) ke bentuk tanggal yang menggunakan nama bulan.
LOOP merupakan bentuk perulangan yang tidak memiliki kondisi, maka normalnya perulangan akan dilakukan secara terus-menerus.
Untuk menghentikan perulangan tersebut, kita perlu menggunakan perintah LEAVE.
Berikut format sintaksnya
LOOP\n [daftar aksi];\nEND LOOP\n
Mari langsung kita buat contohnya dengan memasukkan LOOP ke dalam sebuah fungsi.
DELIMITER //\nCREATE FUNCTION jumlahkan(n INT)\n RETURNS int(11) DETERMINISTIC\nBEGIN\n DECLARE i INT DEFAULT 0;\n DECLARE total INT DEFAULT 0;\n myloop: LOOP\n SET i = i + 1;\n IF i > n THEN\n -- keluar dari perulangan\n LEAVE myloop;\n END IF;\n SET total = total + i;\n END LOOP myoop;\n\n RETURN total;\nEND;\n//\n
Penjelasan Kode
Kita memberi label pada badan perulangan dengan nama myloop. Fungsi di atas berguna untuk menjumlahkan n buah bilangan positif pertama.
Sebagai contoh, jika n bernilai 5, maka hasilnya adalah 15, berasal dari 1 + 2 + 3 + 4 + 5.
Sekarang, kita coba eksekusi fungsi LOOP tersebut.
WHILE merupakan bentuk preintah untuk melakukan perulangan dengan cara memeriksa kondisi tertentu.
Kondisi yang akan diperiksa ditempatkan di bagian awal blok.
Aksi yang berada di dalam badan perulangan hanya akan dieksekusi jika kondisi terpenuhi (bernilai benar).
Jika kondisi bernilai salah, maka aksi di dalam badan perulangan akan diabaikan dan proses eksekusi dilanjutkan ke aksi setelah blok perulangan (jika ada).
Bentuk umum sintaksnya adalah
WHILE [kondisi] DO\n [daftar aksi];\nENd WHILE\n
Mari kita buat fungsi yang mengandung WHILE
DELIMITER //\nCREATE FUNCTION jumlahkan_while(n INT)\n RETURNS int(11) DETERMINISTIC\nBEGIN\n DECLARE i INT DEFAULT 1;\n DECLARE total INT DEFAULT 0;\n WHILE (i <= n) DO\n SET total = total + i;\n SET i = i + 1;\n END WHILE;\n\n RETURN total;\nEND;\n//\n
Penjelasan Kode
Fungsi di atas merupakan modifikasi dari kode program sebelumnya. Perbedaannya, kali ini kita menggunakan perintah WHILE dalam proses pengulangan aksinya. Hasil yang diperoleh sama seperti pada fungsi sebelumnya.
Sekarang, mari kita coba implementasikan ke dalam sebuah fungsi.
DELIMITER //\nCREATE FUNCTION jumlahkan_repeat(n INT)\n RETURNS int(11) DETERMINISTIC\nBEGIN\n DECLARE i INT DEFAULT 1;\n DECLARE total INT DEFAULT 0;\n\n REPEAT\n SET total = total + i;\n SET i = i + 1;\n UNTIL (i > n)\n END REPEAT;\n\n RETURN total;\nEND;\n//\n
Penjelasan Kode
Ketika dieksekusi, cara kerja fungsi di atas akan sama seperti dua fungsi sebelumnya \ud83d\ude02
"},{"location":"bab10/#perintah-leave-dan-iterate","title":"Perintah LEAVE dan ITERATE","text":"
Proses pengulangan dapat dipaksa untuk berhenti atau untuk diteruskan menggunakan pernyataan loncat (jump statement).
Untuk menghentikan, kita bisa menggunakan LEAVE, sedangkan untuk melanjutkan perulangan kita bisa menggunakan ITERATE.
Mari kita coba terapkan keduanya pada fungsi berikut.
DELIMITER //\nCREATE PROCEDURE tampilkan_bil_genap(n INT)\nBEGIN\n DECLARE i INT DEFAULT 0;\n DECLARE str VARCHAR(200) DEFAULT '';\n next: LOOP\n SET i = i + 1;\n IF (i mod 2 = 1) THEN\n ITERATE next;\n END IF;\n IF (i > n) THEN\n LEAVE next;\n END IF;\n SET str = CONCAT(str, CONVERT(i, CHAR), ' ');\n ENd LOOP next;\n SELECT str AS \"Bilangan Genap\";\nEND;\n//\n
Penjelasan Kode
Pada kode di atas, kita membuat sebuah prosedur yang dapat menampilkan bilangan genap yang terdapat antara bilangan 1 dan n. Nilai n ditentukan pada saat pemanggilan prosedur.
Sekarang kita coba panggil prosedur di atas.
CALL tampilkan_bil_genap(50);\n
Tentu saja
Perintah tersebut akan menampilkan bilangan genap aygn berada dalam rentang 1 dan 20.
"},{"location":"bab11/#alasan-menggunakan-trigger","title":"Alasan Menggunakan Trigger","text":"
Beberapa alasan kita menggunakan trigger adalah:
Trigger dapat memvalidasi data yang akan dimasukkan maupun yang akan digunakan untuk melakukan perubahan data.
Trigger dapat memperoleh nilai lama dari baris data yang dihapus atau dirubah (misalnya untuk pencatatan histori data suatu tabel).
Trigger dapat mengolah nilai kolom pada tabel lain.
Selain ketiga manfaat di atas, Trigger juga dapat meringankan kode di bagian aplikasi atau stored procedure yang dikembangkan. Kita tidak perlu menulis kode program di dalam aplikasi untuk melakukan validasi data.
Beberapa konsep yang perlu diketahui dan dipahami tentang trigger yaitu:
Trigger adalah objek database yang berisi kumpulan perintah SQL yang akan dieksekusi atau diaktivasi ketika suatu event terjadi.
Dalam satu database, kita dapat mendefinisikan lebih dari satu trigger. Setiap trigger harus memiliki nama yang unik.
Trigger harus berasosiasi dengan tabel tertentu sebagai pemicu trigger untuk menentukan kapan trigger yang bersangkutan akan dieksekusi.
Trigger memiliki event:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
Trigger memiliki referensi NEW dan OLD.
"},{"location":"bab11/#daftar-event-untuk-aktivasi-trigger","title":"Daftar Event untuk Aktivasi Trigger","text":"Event Keterangan BEFORE INSERT Trigger diaktivasi sebelum data ditambahkan ke dalam suatu tabel. AFTER INSERT Trigger diaktivasi setelah data ditambahkan ke dalam suatu tabel. BEFORE UPDATE Trigger diaktivasi sebelum data dalam suatu tabel diubah. AFTER UPDATE Trigger diaktivasi setelah data daalam suatu tabel diubah. BEFORE DELETE Trigger diaktivasi sebelum data dihapus daru suatu tabel. AFTER DELETE Trigger diaktivasi setelah data dihapus dari suatu tabel."},{"location":"bab11/#membuat-trigger","title":"Membuat Trigger","text":"
Perintah di atas akan membuat trigger tr_ai_buku yang akan diaktivasi setiap kali user memasukkan baris data baru ke dalam tabel buku.
Trigger tersebut akan memasukkan data baru ke dalam tabel histori_buku, nilainya diambil dari data yang baru saja dimasukkan ke dalam tabel buku.
Untuk mengambil nilai dari data yang baru dimasukkan menggunakan referensi new seperti pada new.buku_isbn.
'INSERT' digunakan untuk mengisi jenis aksi yang dilakukan oleh user.
CURRENT_DATE() berfungsi untuk mengisi nilai kolom berisi tanggal saat proses memasukkan data.
Perintah DELIMITER $$ berfungsi untuk menentukan bahwa tanda $$ akan digunakan sebagai pembatas berakhirnya pembuatan kode trigger.
"},{"location":"bab11/#memeriksa-pengaruh-trigger","title":"Memeriksa Pengaruh Trigger","text":"
Untuk memeriksa pengaruh daripada trigger, sekarang kita coba memasukkan sampel data ke dalam tabel buku.
INSERT INTO buku VALUES(\n '999-11555-2-2',\n 'Microsoft Excell',\n 'PB04',\n '2009/02/07',\n 200,\n NULL,\n 60000\n);\n
Ketika perintah tersebut dijalankan dan tidak terjadi error maka harusnya datanya masuk ke dalam tabel buku dan ada data baru di tabel histori_buku. Mari kita cek.
Jika perintah di atas dieksekusi maka MySQL akan menyimpan nilai-nilai tersebut ke dalam referensi NEW. Dengan demikian new.penerbit_id akan bernilai PB06 dan new.penerbit_nama akan bernilai INFORMATIKA.
Contoh lagi
UPDATE penerbit\n SET penerbit_nama = 'Informatika Bandung'\nWHERE\n penerbit_id = 'PB06';\n
Pada perintah UPDATE, referensi NEW berfungsi untuk menyimpan nilai-nilai yang akan digunakan untuk melakukan perubahan.
Nilai lama yang akan ditimpa dapat diakses menggunakan referensi OLD.
new.penerbit_nama bernilai Informatika Bandung, sedangkan old.penerbit_nama bernilai INFORMATIKA.
Contoh lagi
DELETE FROM penerbit\nWHERE penerbit_id = 'PB06';\n
Ketika perintah tersebut dieksekusi, maka referensi OLD akan menyimpan nilai-nilai dari baris data yang dihapus.
Maka old.penerbit_id bernilai PB06.
Kesimpulan
Referensi NEW akan menyimpan data baru pada proses INSERT dan UPDATE
Referensi OLD akan menyimpan data lama pada proses UPDATE dan DELETE
Baik referensi NEW maupun OLD bisa diakses dengan format new.[nama_kolom] atau old.[nama_kolom] contoh new.penerbit_nama atau old.penerbit_nama
Kita sudah tahu bahwasanya menggunakan trigger dapat membantu pekerjaan kita, namun kita perlu tahu juga bahwasanya trigger juga memiliki beberapa batasan berikut.
Kita tidak dapat menggunakan perintah CALL (perintah untuk mengeksekusi stored procedure),
Kita tidak dapat melakukan transaksi, semisal COMMIT dan ROLLBACK,
Kita tidak dapat membuat trigger untuk tabel temporari.
Untuk memberikan kasus yang lebih nyata, kita akan mencoba membuat beberapa trigger sesuai dengan database yang sedang kita kelola yaitu buku_db.
Kita akan membuat trigger AFTER UPDATE dan AFTER DELETE yang bertujuan untuk mencatat setiap perubahan data dan penghapusan data pada tabel buku, nantinya catatan tersebut disimpan di tabel histori_buku
Trigger AFTER UPDATE
Membuat trigger tr_au_buku yang akan diaktivasi setiap kali user mengubah data pada tabel buku.
DELIMITER $$\nCREATE TRIGGER tr_au_buku\nAFTER UPDATE\nON buku\nFOR EACH ROW\nBEGIN\n DECLARE isbn CHAR(13);\n DECLARE judul VARCHAR(75);\n DECLARE penerbit_id CHAR(4);\n DECLARE tgl_terbit DATE;\n DECLARE jml_halaman INT;\n DECLARE deskripsi TEXT;\n DECLARE harga DECIMAL(10,0);\n\n -- Mengisi nilai isbn\n IF new.buku_isbn IS NULL THEN\n SET isbn = old.buku_isbn;\n ELSE\n SET isbn = new.buku_isbn;\n END IF;\n\n -- mengisi nilai judul\n IF new.buku_judul IS NULL THEN\n SET judul = old.buku_judul;\n ELSE\n SET judul = new.buku_judul;\n END IF;\n\n -- mengisi nilai penerbit_id\n IF new.penerbit_id IS NULL THEN\n SET penerbit_id = old.penerbit_id;\n ELSE\n SET penerbit_id = new.penerbit_id;\n END IF;\n\n -- mengisi nilai tgl_terbit\n IF new.buku_tglterbit IS NULL THEN\n SET tgl_terbit = old.buku_tglterbit;\n ELSE\n SET tgl_terbit = new.buku_tglterbit;\n END IF;\n\n -- mengisi nilai jml_halaman\n IF new.buku_jmlhalaman IS NULL THEN\n SET jml_halaman = old.buku_jmlhalaman;\n ELSE\n SET jml_halaman = new.buku_jmlhalaman;\n END IF;\n\n -- mengisi nilai deskripsi\n IF new.buku_deskripsi IS NULL THEN\n SET deskripsi = old.buku_deskripsi;\n ELSE\n SET deskripsi = new.buku_deskripsi;\n END IF;\n\n -- mengisi nilai harga\n IF new.buku_harga IS NULL THEN\n SET harga = old.buku_harga;\n ELSE\n SET harga = new.buku_harga;\n END IF;\n\n -- memasukkan data ke dalam tabel histori_buku\n INSERT INTO histori_buku\n VALUES (\n isbn,\n judul,\n penerbit_id,\n tgl_terbit,\n jml_halaman,\n deskripsi,\n harga,\n 'UPDATE',\n CURRENT_DATE()\n ); \n\nEND $$\n
Trigger AFTER DELETE
Membuat trigger tr_ad_buku yang akan diaktivasi setiap kali user mengubah data pada tabel buku.
Selanjutnya, kita coba menghapus data dari tabel buku.
DELETE FROM buku\nWHERE buku_isbn = '999-11555-2-2';\n
Harusnya ada tambahan 2 baris data pada tabel histori_buku. Sekarang mari kita cek.
SELECT * FROM histori_buku;\n
Trigger BEFORE INSERT
Kali ini kita juga akan membuat trigger yang berfungsi melakukan validasi sebelum data dimasukkan ke dalam tabel buku.
Sebagai contoh, kita ingin memastikan bahwa kolom buku_jmlhalaman harus lebih besar dari 149, dan jika nilainya sama atau lebih kecil, maka MySQL server akan menolak untuk memasukkan baris data tersebut.
DELIMITER $$\nCREATE TRIGGER tr_bi_buku\nBEFORE INSERT\nON buku\nFOR EACH ROW\nBEGIN\n IF new.buku_jmlhalaman <= 149 THEN\n SIGNAL SQLSTATE '45000'\n SET MESSAGE_TEXT = 'Tidak bisa menambah buku, jumlah halaman terlalu sedikit.';\n END IF;\nEND $$\n
Untuk membuktikan pengaruh trigger tersebut, sekarang kita coba tambahkan data buku baru.
INSERT INTO buku VALUES(\n '999-11555-2-3',\n 'Microsoft Publisher',\n 'PB04',\n '2021/02/07',\n 100,\n NULL,\n 6000\n);\n
Hasilnya? \ud83d\ude0e
"},{"location":"bab12/","title":"Ekspor dan Impor","text":"
Terkadang kita dihadapkan pada kondisi di mana kita perlu memindahkan database kita dari satu server ke server yang lain, semisal:
Ingin mengganti komputer server,
Komputer server saat ini mengalami kendala (serangan virus, kendala hardware),
Ingin memindahkan data dari lingkungan development ke lingkungan production, ataupun
Alasan yang lain.
Maka kita perlu melakukan proses backup (pencadangan) dan restore (pengembalian) data.
Ekspor adalah proses pembuatan salinan data dari database.
Kita dapat mengekspor data yang terdapat di dalam satu tabel tertentu, seluruh tabel, bahkan keseluruhan objek yang ada di dalam database (tabel, prosedur, fungsi, view, dll).
Ekspor data diperlukan untuk mengantisipasi terjadinya kerusakan pada database yang sedang diolah.
Ada beberapa teknik yang bisa dilakukan untuk melakukan backup dan restore, yaitu:
Dengan menjalankan perintah di atas, maka MySQL akan menciptakan file buku_db.sql yang ditempatkan pada direktori backup.
File tersebut berisi perintah-perintah untuk membuat ulang database beserta objek-objek di dalamnya.
mysqldump memiliki beberapa opsi yang bisa disertakan saat kita menjalankannya, yaitu:
--quick
Digunakan untuk mentransformasikan data yang terdapat di dalam database ke dalam dump file secara langsung, tanpa harus menyimpannya ke dalam memori komputer terlebih dahulu. Ini adalah opsi default untuk mempercepat proses pembuatan dump file.
--add-drop-table
Ini akan membuat perintah DROP TABLE sebelum CREATE TABLE di dalam dump file.
--add-lock
Ini akan menambahkan perintah LOCK TABLES dan UNLOCK TABLES di dalam dump file yang dihasilkan.
--extended-insert
Ini digunakan untuk menginstruksikan kepada MySQL agar menambahkan baris-baris data ke dalam tabel yang terbuat hanya dengan menggunakan satu perintah INSERT.
--databases
Digunakan jika kita ingin membuat salinan data dari beberapa (lebih dari satu) database dengan satu perintah.
--all-databases
Digunakan jika kita ingin membuat salinan data dari semua database yang terdapat pada server MySQL dalam satu perintah.
-d atau --no-data
Digunakan jika kita hanya ingin membuat salinan struktur datanya saja, tidak termasuk data yang terdapat di dalamnya.
Sebagai contoh, kita bisa menjalankan perintah berikut via command prompt.
mysqldump -u root -p --databases buku_db mysql > D:\\backup\\dump.sql\n
Sebenarnya kita bisa saja membackup database dengan cara manual, yaitu menyalin file databasenya secara langsung. Ini merupakan versi manual daripada mysqlhotcopy.
Salin data (*.frm dan *.myd) yang ada di dalam direktori C:\\Program Files\\[MySQL Dir]\\Data secara manual menggunakan copy-paste ke direktori tujuan.
BACKUP TABLE bisa menjadi alternatif dalam membackup database, dengan syarat tabel-tabelnya menggunakan mesin MyISAM.
Perintah ini sebenarnya sudah dianggap deprecated (sudah tidak direkomendasikan)
Berikut format perintahnya.
BACKUP TABLE [nama_tabel1], [nama_tabel2], ...dst TO [direktori_tujuan];\n
Contoh:
BACKUP TABLE myisam1, myisam2 TO 'C:/tmp';\n
Penjelasan kode
Setelah dijalankan, maka MySQL akan membuat salinan dari tabel myisam1 (myisam1.frm, myisam1.myd) dan myisam2 (myisam2.frm, myisam2.myd) ke dalam direktori C:\\tmp.
Perlu diperhatikan, kita menggunakan forward slash (/), bukan back slash (\\) saat menuliskan direktori tujuan.
Salinan file yang dihasilkan oleh proses backup selanjutnya bisa disimpan dan digunakan sewaktu-waktu jika terjadi kesalahan atau kerusakan data pada server MySQL maupun pada komputer server.
Proses pengembalian data ke keadaan sebelumnya disebut sebagai restore/ impor data.
Berikut langkah-langkah restore data yang dihasilkan dari program mysqldump.
Menggunakan MySQL Client, buatlah database baru dengan nama tertetntu. Contoh:
CREATE DATABASE db_baru;\n
2. Melalui terminal atau command prompt jalankan perintah dengan format berikut.
mysql -u [nama_user] -p [nama_database] [file_backup]\n
Contoh:
mysql -u root -p db_baru D:\\backup\\buku_db.sql\n
Sekarang kita bisa mengecek hasilnya dengan menjalankan query pada MySQL Monitor.
Berikut cara melakukan restore menggunakan file backup yang dihasilkan dari program mysqlhotcopy ataupun yang disalin secara manual.
Hentikan service MySQL, (bisa melalui Task Manager),
Salin daftar file hasil backup (*.frm dan *.myd) ke dalam direktori C:\\Program Files\\[MySQL Dir]\\Data. Proses penyalinan ini akan menimpa file lama.
Untuk melakukan restore databsae dari file yang dihasilkan oleh perintah BACKUP TABLE, kita bisa menggunakan perintah RESTORE TABLE, formatnya:
"},{"location":"bab2/","title":"Manipulasi Data Dengan DML","text":"
INSERT | UPDATE | DELETE\n
"},{"location":"bab2/#memasukkan-data-tabel","title":"Memasukkan Data Tabel","text":""},{"location":"bab2/#tabel-kategori","title":"Tabel Kategori","text":"
INSERT INTO kategori (kategori_nama) VALUES\n('Database'),\n('Desain Grafis'),\n('Jaringan Komputer'),\n('Pemrograman'),\n('Web dan Internet'),\n('Office Application');\n
INSERT INTO penerbit VALUES\n('PB01','Angkasa Raya'),\n('PB02','Cahaya Ilmu Persada'),\n('PB03','Sinar Ilmu Perkasa'),\n('PB04','Intan'),\n('PB05','Sinar Raya'),\n('PB06','Informatika'),\n('PB07','Tiga Sekawan'),\n('PB08','Cipta Ilmu');\n
INSERT INTO buku VALUES\n('222-34222-1-0','Belajar Photoshop','PB01','2019/07/02',300,NULL,42000),\n('222-34222-1-1','Panduan CorelDRAW','PB02','2020/03/15',400,NULL,55000),\n('979-96446-9-0','Belajar SQL','PB06','2019/10/12',346,NULL,45000),\n('979-96446-9-1','Panduan Basis Data','PB01','2017/03/02',257,NULL,37000),\n('979-96446-9-2','Perancangan Sistem','PB03','2013/09/20',403,NULL,37000),\n('979-96446-9-3','Microsoft Access','PB06','2015/07/13',400,NULL,48500),\n('888-96771-3-0','Pemrograman Pascal','PB08','2014/11/01',350,NULL,50000),\n('888-96771-3-1','Pemrograman Java','PB06','2017/01/23',450,NULL,72000),\n('888-96771-3-2','Pemrograman C untuk Hardware','PB05','2016/12/25',398,NULL,47000),\n('888-96771-3-3','Panduan C++','PB06','2015/07/15',490,NULL,65000),\n('888-96771-3-4','Belajar Delphi','PB05','2018/08/11',328,NULL,50000),\n('888-96771-3-5','Visual Basic','PB02','2017/10/14',250,NULL,50000),\n('666-96771-2-0','Panduan Membangun Jaringan TCP/IP','PB08','2016/08/02',200,NULL,60000),\n('666-96771-2-1','Implementasi TCP/IP di Linux','PB08','2018/11/21',230,NULL,350000),\n('777-76723-5-0','Belajar PHP 8','PB07','2020/05/02',600,NULL,95000),\n('777-76723-5-1','Aplikasi Web dengan Python','PB07','2014/08/01',180,NULL,30000),\n('777-76723-5-2','Internet Marketing','PB07','2017/01/24',150,NULL,38500),\n('777-76723-5-3','Panduan Menjadi Youtuber','PB07','2017/01/24','243',NULL,38500),\n('999-11555-2-0','Microsoft Power Point','PB06','2018/11/23',300,NULL,57500),\n('999-11555-2-1','Microsoft Word','PB04','2017/12/01',270,NULL,60000);\n
"},{"location":"bab2/#tabel-link-buku-pengarang","title":"Tabel Link Buku Pengarang","text":"
INSERT INTO link_buku_pengarang VALUES\n('222-34222-1-0','P01'),\n('222-34222-1-1','P04'),\n('666-96771-2-0','P04'),\n('666-96771-2-0','P07'),\n('666-96771-2-0','P06'),\n('666-96771-2-1','P04'),\n('666-96771-2-1','P01'),\n('777-76723-5-0','P02'),\n('777-76723-5-0','P04'),\n('777-76723-5-1','P03'),\n('777-76723-5-1','P12'),\n('777-76723-5-1','P10'),\n('777-76723-5-2','P13'),\n('777-76723-5-3','P08'),\n('777-76723-5-3','P09'),\n('888-96771-3-0','P04'),\n('888-96771-3-1','P02'),\n('888-96771-3-1','P11'),\n('888-96771-3-2','P01'),\n('888-96771-3-2','P06'),\n('888-96771-3-3','P02'),\n('888-96771-3-4','P10'),\n('888-96771-3-4','P09'),\n('888-96771-3-5','P02'),\n('979-96446-9-0','P11'),\n('979-96446-9-0','P02'),\n('979-96446-9-1','P07'),\n('979-96446-9-2','P13'),\n('979-96446-9-2','P10'),\n('979-96446-9-2','P12'),\n('979-96446-9-2','P03'),\n('979-96446-9-3','P11'),\n('999-11555-2-0','P11'),\n('999-11555-2-0','P13'),\n('999-11555-2-1','P08'),\n('999-11555-2-1','P09'),\n('999-11555-2-1','P10'),\n('999-11555-2-1','P06');\n
"},{"location":"bab2/#tabel-link-buku-kategori","title":"Tabel Link Buku Kategori","text":"
INSERT INTO link_buku_kategori VALUES\n('222-34222-1-0',2),\n('222-34222-1-1',2),\n('979-96446-9-0',1),\n('979-96446-9-1',1),\n('979-96446-9-2',1),\n('979-96446-9-2',4),\n('979-96446-9-3',1),\n('888-96771-3-0',4),\n('888-96771-3-1',4),\n('888-96771-3-2',4),\n('888-96771-3-3',4),\n('888-96771-3-4',4),\n('888-96771-3-5',4),\n('666-96771-2-0',3),\n('666-96771-2-1',3),\n('777-76723-5-0',4),\n('777-76723-5-0',5),\n('777-76723-5-1',4),\n('777-76723-5-1',5),\n('777-76723-5-2',5),\n('777-76723-5-3',5),\n('999-11555-2-0',6),\n('999-11555-2-1',6);\n
Data yang ditampilkan dapat disaring (filter) berdasarkan kebutuhan informasi yang akan disajikan. Untuk menyaring data, perlu didefinisikan kondisi yang akan dijadikans ebagai kriteria penyaringan. Dalam perintah SELECT ditambah klausa WHERE setelahnya.
Contoh 1 Menampilkan data buku yang harganya kurang dari Rp. 45.000
SELECT\n buku_isbn as 'ISBN',\n buku_judul as 'JUDUL BUKU',\n buku_harga as 'HARGA'\nFROM\n buku\nWHERE\n buku_harga < 45000;\n
Menampilkan data buku yang harganya kurang dari Rp. 45.000 dan ISBN diawali oleh angka 777
SELECT\n buku_isbn as 'ISBN',\n buku_judul as 'JUDUL BUKU',\n buku_harga as 'HARGA'\nFROM\n buku\nWHERE\n (buku_harga < 45000) AND\n (buku_isbn LIKE '777%');\n
Menampilkan data dengan rentang tertentu Menggunakan klausa BETWEEN
Contoh BETWEEN 1
SELECT\n buku_isbn,\n buku_judul,\n buku_harga\nFROM\n buku\nWHERE\n buku_harga\n BETWEEN 50000 AND 60000;\n
Secara default data yang disajikan menggunakan printah SELECT akan ditmpilkan sesuai urutan data dimasukkan, kecuali pada kolom yang diatur sebagai primary key, maka dia akan urut sesui bilangan. Untuk mengurutkan data sesuai kolom tertentu kita bisa menggunakan klausa ORDER BY.
Contoh Penggunaan ORDER BY Mengurutkan datan sesuai kolom 'buku_judul'
"},{"location":"bab5/","title":"Seleksi Data - Bagian 2","text":""},{"location":"bab5/#pengelompokan-data-menggunakan-group-by","title":"Pengelompokan Data menggunakan GROUP BY","text":"
Penggunaan kalusa GROUP BY disertakan dalam perintah SELECT - Contoh 1
"},{"location":"bab5/#join-seleksi-data-dari-2-tabel-atau-lebih","title":"Join : Seleksi Data dari 2 Tabel atau Lebih","text":"
Seleksi data dari 2 tabel atau lebih, lebih rumit dibandingkan seleksi data dari 1 tabel. Syarat utamanya adalah adanya kolom relasi. Kolom relasi adalah kolom yang digunakan sebagai kunci untuk menghubungkan antara tabel yang satu dengan tabel yang lain.
Tampilkan data dari kolom buku_isbn dan buku_judul pada tabel buku dengan nama alias a, serta kolom penerbit nama pada tabel penerbit dengan nama alias b yang nilai penerbit_id nya sama.
Subquery adalah perintah SELECT yang terdapat dalam perintah SELECT lain. Hal ini memudahkan kita untuk membuat berbagai format laporan semisal crosstab query.
Contoh 1 Membuat query yang dapat menampilkan jumlah buku yang diterbitkan oleh masing-masing penerbit. kita akan menggunakan tabel buku dan tabel penerbit.
Pada contoh tersebut perintah SELECT bagian luar digunakan untuk menyeleksi data dari tabel penerbit, sedangkan bagian dalam digunakan untuk menyeleksi data dari tabel buku.
Subquery juga biasa digunakan sebagai kolom penentu kondisi query (di bagian WHERE).
Perintah di atas digunakan untuk menampilkan data pada tabel 'penerbit' (kolom 'penerbit_id' dan 'penerbit_nama') yang datanya tidak terdapat pada tabel buku.
View adalah objek di dalam database yang berisi kumpulan kolom yang dihasilkan dari perintah SELECT. Sederhananya view adalah objek yang menyimpan hasil query, baik dari satu tabel atau lebih. View juga sering disebut sebagai tabel virtual, karena view sebenranya tidak memiliki data. Data yang ditampilkan oleh view diambil dari tabel-tabel aktual yang disertakan dalam perintah SELECT.
"},{"location":"bab6/#mengapa-perlu-menggunakan-tabel-virtual","title":"Mengapa Perlu Menggunakan Tabel Virtual?","text":"
Dalam pengelolaan database, view memiliki manfaat bagi kita, di antaranya:
Akses data menjadi lebih mudah.
Dapat digunakan untuk menampilkan rangkuman dari suatu perhitungan tertentu.
Dapat menampilkan beberapa kolom atau beberapa baris saja dari suatu tabel, tergantung dari kondisi yang didefinisikan.
Dapat digunakan untuk menampilkan data yang berasal dari dua tabel atau lebih.
View dapat digunakan untuk menampilkan data yang berbeda untuk masing-masing user, sehingga setiap user hanya dapat melihat data yang sesuai dengan hak aksesnya.
Pada kasus-kasus tertentu, data yang terdapat dalam satu view juga harus dapat dimodifikasi menggunakan perintah INSERT, UPDATE maupun DELETE. Jika data dalam suatu view diubah, sebenarnya yang berubah adalah data pada base table.
Perintah di atas akan mendefinisikan view di dalam database dengan nama v_buku. View tersebut berisi perintah SELECT yang melibatkan dua tabel, yaitu buku dan penerbit. Kolom relasi antara dua tabel tersebut adalah kolom penerbit_id.
Sekarang kita bisa menampilkan data buku dengan SELECT view tersebut, berikut query-nya.
SELECT * FROM v_buku;\n
"},{"location":"bab6/#melihat-daftar-kolom-di-dalam-view","title":"Melihat Daftar Kolom di dalam view","text":"
Sama halnya seperti pada objek tabel, kita juga dapat melihat daftar kolom yang terdapat di dalam suatu view. Untuk melakukan hal ini kita bisa menjalankan query. Contoh:
Untuk mengubah definisi dari suatu view yang sebelumnya sudah dibuat, kita perlu menggunakan perintah ALTER VIEW. Perintah ini akan membuang atau menghapus definisi view yang lama dan menimpanya dengan definisi view yang baru. Format query-nya sebagai berikut.
ALTER VIEW [nama_view] AS [perintah SELECT yang baru]\n
Sekarang perhatikan dan jalankan query berikut.
ALTER VIEW v_buku AS\nSELECT\n a.buku_isbn,\n a.buku_judul,\n b.penerbit_nama,\n a.buku_harga\nFROM\n buku a,\n penerbit b\nWHERE\n a.penerbit_id = b.penerbit_id\nORDER BY\n a.buku_judul;\n
Kita dapat menghapus satua tau lebih view yang terdapat di dalam database dengan menggunakan perintah DROP VIEW. Format umum query-nya adalah sebagai berikut.
DROP VIEW [IF EXISTS] [nama_view];\n
IF EXISTS bersifat opsional dan berfungsi untuk mencegah terjadinya kesalahan pada saat perintah tersebut dieksekusi, yaitu dengan cara melakukan pemeriksaan terlebih dahulu, apakah view yang akan dihapus tersebut ada di dalam database atau tidak.
Jika nama view yang disertakan dalam perintah DROP VIEW ternyata tidak ada, maka server MySQL akan mengeluarkan pesan peringatan/ warning. Kitadapat menampilkan isi peringatan tersebut dengan perintah SHOW WARNINGS.
Perhatikan query berikut.
DROP VIEW v1, v2;\n
Query di atas akan menghapus dua view sekaligus. Sekarang jalankan query berikut untuk menghapus view v_buku.
DROP VIEW v_buku;\n
"},{"location":"bab6/#membuat-view-yang-dapat-dimodifikasi","title":"Membuat View yang Dapat Dimodifikasi","text":"
Suatu view dapat dimodifikasi jika kolom-kolom dalam view tersebut mengacu langsung ke kolom yang terdapat pada base tabel, bukan hasil proses perhitungan. Sebagai contoh, coba perhatikan dan jalankan query berikut.
Setelah berhasil mengupdate view v_jmlHalaman, kita coba ulangi perintah berikut dan perhatikan hasilnya.
SELECT * FROM v_jmlHalaman\nWHERE\n buku_isbn = \"999-1555-2-1\";\n
Perhatikan nilai dari kolom buku_jmlhalaman. Nilai yang ditampilkan sekarang adalah 280, yang awalnya bernilai 270. Ini terjadi karena kita telah melakukan modifikasi terhadap view v_jmlHalaman menggunakan perintah UPDATE.
Data yang sebenarnya diubah adalah data pada kolom tabel yang diakses, bukan data di dalam view yang bersangkutan. karena secara fisik view tidak pernah memiliki data. Karena inilah view sering disebut sebagai tabel virtual. Untuk membuktikan hal ini sekarang mari kita lihat datanya langsung dari tabel asli.
Hasil yang diperoleh akan sama seperti pada asat kita mengaksesnya melalui view v_jmlHalaman."},{"location":"bab6/#batasan-batasan-dalam-penggunaan-view","title":"Batasan-batasan dalam Penggunaan View","text":"
Pendefinisian view dapat menggunakan klausa-klausa yang terdapat pada perintah SELECT, seperti WHERE, GROUP BY, ORDER BY dan lain-lain. Namun demikian ada batasan-batasan yang perlu diperhatikan, yaitu:
Kita tidak dapat membuat view temporari
Kita tidak dapat mengasosiasikan trigger dengan view
Tabel-tabel yang diakses oleh view harus ada di dalam database. Jika nama tabel diubah, maka view tidak dapat digunakan lagi, karena terjadi kesalahan pada saat dieksekusi
Perintah SELECT yang didefinisikan di dalam view tidak boleh berisi kontruksi-kontruksi berikut:
User adalah orang yang dapat menggunakan database. Sejauh mana user tersebut dapat bekerja di dalam database ditentukan dari hak akses yang dimilikinya: apakah sebagai Database Administrator yang memiliki hak akses penuh terhadap database yang diolah ataupun sekedar Operator yang memiliki hak akses terbatas sesuai jenis pekerjaannya.
Format query untuk membuat user adalah sebagai berikut.
CREATE USER [nama_user] IDENTIFIED BY [password];\n
Jalankan query berikut untuk membuat user baru.
CREATE USER 'admin' IDENTIFIED BY 's3cr3t';\n
Query tersebut akan membuat user baru dengan nama admin dan password s3cr3t. Ingat, bahwa user tersebut baru kita buat dan belum memiliki hak akses apapun terhadap database, namun kita sudah bisa login ke server MySQL menggunakan user tersebut.
Keluar dari user saat ini dengan perintah \\q lalu ENTER. Selanjutnya mari kita login
mysql -u admin -p\n
Tekan ENTER lalu masukkan password s3cr3t dan tekan ENTER. Setelah berhasil coba jalankan query berikut.
Menampilkan database
SHOW DATABASES;\n
Mengaktifkan/ menggunakan database buku_db
USE buku_db;\n
Apa hasilnya? \ud83d\ude02"},{"location":"bab7/#mengenal-hak-akses","title":"Mengenal Hak Akses","text":"
Hak akses adalah suatu izin yang dapat diberikan kepada seorang user. Dengan izin tersebut, seorang user dapat melakukan aksi-aksi tertentu terhadap database.
Hak akses tersebut dikelompokkan menjadi 2, yaitu:
Tingkat User
Tingkat Administrator
Hak Akses Tingkat User
Hak Akses Keterangan CREATE Membuat database, tabel atau indeks CREATE TEMPORARY TABLE Membuat tabel temporari CREATE VIEW Membuat view DELETE Menghapus baris data EXECUTE Mengeksekusi prosedur INDEX Membuat indeks INSERT Memasukkan baris-baris data ke dalam tabel LOCK TABLES Mengunci suatu tabel SELECT Mengambil/ memilih data dari tabel SHOW DATABASES Menampilkan semua database SHOW VIEW Melihat daftar view yang dimiliki database UPDATE Mengubah data di dalam tabel USAGE Melakukan login, tapi tidak bisa melakukan apapun
Hak Akses Tingkat Administrator
Hak Akses Keterangan ALL Memiliki semua hak akses, kecuali WITH GRANT OPTION ALTER Mengubah struktur tabel CREATE USER Membuat user lain DROP Menghapus database, tabel atau view FILE Memuat data dari suatu file PROCESS Melihat daftar proses yang dieksekusi MySQL RELOAD Menggunakan perintah FLUSH SHUTDOWN Menghentikan server MySQL"},{"location":"bab7/#memberi-hak-akses","title":"Memberi Hak Akses","text":"
Perintah yagn digunakan untuk memberikan hak akses adalah GRANT, format umumnya sebgaimana berikut.
GRANT [hak akses]\nON [nama_tabel]|*|*.*|[nama_database]\nTO [nama_user]\nIDENTIFIED BY [password];\n
Jalankan query berikut untuk memberikan semua hak akses pada semua tabel yang terdapat dalam database bukudb kepada user admin.
GRANT ALL\nON bukudb.*\nTO 'admin'@'%'\nIDENTIFIED BY 's3cr3t';\n
Terkadang kita tidak perlu memberikan semua hak akses kepada user tertentu, untuk itu kita bisa menjalankan query berikut sebagai contohnya.
GRANT USAGE, INSERT, UPDATE, DELETE, SELECT\nON pengarang\nTO 'admin'@'%'\nIDENTIFIED BY 's3cr3t';\n
Dengan query tersebut, maka user admin hanya bisa memasukkan, mengubah, menghapus dan mengambil/ menampilkan data yang terdapat pada tabel pengarang saja.
"},{"location":"bab7/#mencabut-hak-akses","title":"Mencabut Hak Akses","text":"
Untuk mencabut/ menarik kembali hak akses dari user tertentu bisa menggunakan perintah REVOKE dengan format
Query tersebut akan mencabut hak akses USAGE, INSERT, UPDATE, DELETE, SELECT dari user admin terhadap tabel pengarang."},{"location":"bab7/#menghapus-user","title":"Menghapus User","text":"
Untuk menghapus user format query-nya adalah
DROP USER [nama_user_1], [nama_user_2], ...dst;\n
Mari kita coba
DROP USER 'admin'@'%';\n
"},{"location":"bab7/#mengetahui-tabel-hak-akses","title":"Mengetahui Tabel Hak Akses","text":"
Ketika kita menjalankan query GRANT dan REVOKE, sebenarnya MySQL menyimpan data hak akses tersebut di dalam database mysql. Sehingga sebenarnya kita bisa saja melihat bahkan memberi ataupun menghapus hak akses user dengan memanipulasi database mysql tanpa melakukan query GRANT dan REVOKE.
Jika kita ingin memodifikasi data secara langsung, kita harus menjalankan query
FLUSH PRIVILEGES\n
Perintah tersebut berfungsi me-refresh perubahan yang telah dilakukan ke dalam database mysql.
Berikut beberapa tabel dalam database mysql yang berkaitan dengan proses pemberian dan pencabutan hak akses user.
user
Menyimpan informasi global tentang user dan hak akses yang dimilikinya.
db
Menyimpan informasi hak akases yang berkaitan dengan database untuk user tertentu.
tables_priv
Menyimpan informasi hak akses yang berkaitan dengan tabel untuk user tertentu.
columns_priv
Menyimpan informasi hak akses yang berkaitan dengan kolom untuk user tertentu.
Coba kita jalankan query berikut.
Mengaktifkan database mysql dan menampilkan seluruh tabel di dalamnya.
Fungsi Agregasi adalah fungsi di dalam MySQL yang digunakan untuk melakukan perhitungan pada query. Pada umumnya penggunaannya dikombinasikan dengan klausa GROUP BY untuk menghasilkan rangkuman nilai yang dikelompokkan berdasarkan nilai tertentu.
Berikut ini beberapa fungsi yang termasuk dalam fungsi agregasi:
MIN() berfungsi untuk mengembalikan nilai terkecil dari suatu kolom.
Jika fungsi MIN() digunakan pada kolom bertipe numerik, maka akan mengembalikan angka terkecil, jika diterapkan pada kolom bertipe karakter, maka akan mengembalikan karakter dengan urutan alfabet paling awal. Berikut contohnya.
Menampilkan jumlah halaman paling sedikit
SELECT MIN(buku) FROM buku;\n
Menampilkan urutan abjad paling awal dari judul buku
SUM() berguna untuk menjumlahkan nilai dari suatu kolom dalam tabel tertentu. Contoh:
SELECT SUM(buku_jmlhalaman) FROM buku;\n
Nilai yang tampil merupakan total dari semua jumlah halaman buku pada kolom buku_jmlhalaman."},{"location":"bab8/#fungsi-count","title":"Fungsi COUNT()","text":"
Berbeda dengan SUM(), fungsi COUNT() akan mengembalikan jumlah baris data pada kolom dari tabel tertentu.
Contoh, menampilkan jumlah buku dari penerbit dengan penerbit_id = PB06.
Berfungsi untuk mendapatkan nilai rata-rata dari suatu kolom. Sebagai contoh, kita ibsa menghitung nilai rata-rata dari jumlah halaman buku dengan kode penerbit PB06 dengan perintah berikut.
Fungsi GROUP_CONCAT() memiliki beberapa bentuk penggunaan, yaitu:
Dalam keadaan standar (default), pemisah yang digunakan adalah tanda koma (,). Kita dapat mengubah pemisah tersebut menggunakan karakter lain dengan menambahkan klausa SEPARATOR, contoh:
Kita dapat menggunakan ORDER BY untuk mengurutkan nilai yang akan digabung dalam teks tunggal, contoh:
SELECT\n GROUP_CONCAT(penerbit_nama ORDER BY penerbit_nama)\nFROM\n penerbit;\n
Jika terdapat duplikasi nilai yang akan digabung ke dalam teks tunggal, maka nilai duplikat tersebut dapat dihilangkan menggunakan klausa DISTINCT, contoh:
Hasilnya adalah 1 karena nilai NULL tidak dihitung sebagai 1 baris data, dengan kata lain NULL diabaikan.
Perintah SELECT mungkin saja menghasilkan baris kosong atau nilai NULL di setiap barisnya. Jika kita menggunakan fungsi agregasi pada kolom yang berisi baris kosong atau nilai NULL di setiap baris yang ada, maka:
Untuk fungsi COUNT(), nilai yang dihasilkan adalah 0 (nol)
Untuk fungsi MIN(), MAX(), SUM(), AVG() dan GROUP_CONCAT() akan menghasilkan nilai NULL
Sebagai bukti, coba kita hapus 1 baris data yang berisi nilai non-NULL.
DELETE FROM tnull\nWHERE a=1;\n
Lalu kita cek data yang tersisa
SELECT * FROM tnull;\n
Selanjutnya kita coba eksekusi satu-persatu fungsi agregasi untuk mengetahui nilai yang dikembalikan.
SELECT COUNT(a) FROM tnull;\n
Perintah di atas akan menghasilkan nilai 0 (nol), namun jika kita mencoba fungsi agregasi yang lain,
SELECT MIN(a) FROM tnull;\nSELECT MAX(a) FROM tnull;\nSELECT SUM(a) FROM tnull;\nSELECT AVG(a) FROM tnull;\nSELECT GROUP_CONCAT(a) FROM tnull;\n
Semua perintah di atas akan menghasilkan nilai NULL."},{"location":"bab9/","title":"Operator dan Fungsi","text":"
MySQL menyediakan banyak operator dan fungsi built-in yang dapat bermanfaat dalam pembuatan query.
Fungsi built-in adalah fungsi siap pakai yang sudah didefinisikan oleh MySQL untuk menunjang kemudahan bagi para penggunanya.
Pada umumnya operator dan fungsi digunakan pada perintah SELECT dan klausa WHERE.
Beberapa fungsi yang sering dipakai dapat dikelompokkan menjadi:
Operator merupakan simbol-simbol khusus yang digunakan untuk melakukan operasi-operasi tertentu, misalnya perhitungan, perbandingan dua nilai dan lain-lain.
Ketika menulis sebuah query kita akan sering menggunakan operator.
Operator aritmatika digunakan untuk melakukan perhitungan di dalam query maupun prosedur/ fungsi. Berikut daftarnya
Operator Keterangan + Untuk melakukan operasi penjumlahan - Untuk melakukan operasi pengurangan * Untuk melakukan operasi perkalian / Untuk melakukan operasi pembagian
Contoh kasus, kita akan menghitung harga buku tertentu yang sudah didiskon sebanyak 25%.
Operator relasional digunakan untuk membandingkan dua nilai atau ekspresi. Berikut tabel operator-operator yang termasuk.
Operator Keterangan = Sama dengan != atau <> Tidak sama dengan < Lebih kecil <= Lebih kecil atau sama dengan > Lebih besar >= Lebih besar atau sama dengan n BETWEEN min AND max Memeriksa n apakah berada di dalam rentang min dan max atau tidak n IN (set) Memeriksa keanggotaan himpunan (set), apakah n anggota dari himpunan yang didefinisikan atau tidak n IS NULL Memeriksa nilai n dengan nilai NULLISNULL(n) Memeriksa nilai n, NULL atau tidak
Sebagai contoh, kita akan menampilkan daftar buku yang harganya di bawah Rp. 50.000.
Query di atas akan mencari teks base di dalam teks Pemrograman Database MySQL dimulai dari posisi karakter ke-1. Jika karakter yang dimaksud tidak ditemukan, maka MySQL akan mengembalikan nilai 0.
Fungsi lower() dan upper()
lower() berfungsi untuk mengubah teks menjadi huruf kecil, sedangkan upper() berfungsi mengubah teks menjadi huruf kapital. Contoh:
quote() digunakan untuk mengapit teks menggunakan tanda petik tunggal. Sebagai contoh, jika kita igin membuat teks untuk proses INSERT dalam suatu prosedur/ fungsi yang didefinisikan sendiri. Contoh:
SET @STR = 'MySQL';\nSELECT @STR;\n
Perintah di atas akan memberikan hasil berupa string 'MySQL'. Sekarang coba yang ini.
SET @STR = quote('MySQL');\nSELECT @STR;\n
Perintah tersebut akan menampilkan string 'MySQL' yang mengandung tanda kutip.
Fungsi replace()
Kita bisa mengganti bagian teks tertentu dengan fungsi ini. Contoh:
Perintah di atas akan mengganti teks Database yang berada pada string Pemrograman Database dengan teks MySQL.
Fungsi substring()
Digunakan untuk mengambil karakter atau bagian teks (dengan jumlah tertentu) dari suatu teks. Contoh:
SELECT SUBSTRING('MySQL', 1, 2);\n
Perintah di atas akan mengambil 2 karakter dari teks MySQL dimulai dari karakter ke-1, sehingga menghasilkan teks QL.
Fungsi trim()
Pada kasus-kasus tertentu, sering kali terjadi data yang tersimpan di dalam dataabse memiliki format yang belum sempurna. Sebagai contoh, data yang seharusnya berupa 'MySQL', tapi pada kenyataannya di dalamd database tertulis 'My SQL' atau ' MySQL' (mengandung whitespace atau karakter kosong baik di depan atau di belakang teks).
Kesalahan data seperti ini biasanya (tanpa sengaja) dilakukan oleh pneggna aplikasi atau operator entri data. Sebagai contoh, secara tidak sadar pengguna aplikasi telah menekan tombol spasi pada saat sedang melakukan entri data. Dengan demikian, data yang tersimpan di dalam database juga akan ikut mengandung spasi.
Kasus semacam ini terkadang sering membuat pusing para programmer database dan DBA (Database Administrator) pada saat mereka menulis query. Pasalnya, emreka merasa bahwa query sudah tertulis dengan benar, tapi data atau hasil yagn ditampilkan tidak sesuai dengan keinginan.
Untuk mengatasi masalah tersebut, kita bisa menggunakan fungsi trim() pada saat membandingkan data berupa teks. Jika kita ingin menghilangkan whitespace di awal string kita gunakan ltrim(), sedangkan jika di akhir string menggunakan rtrim(). Contoh:
Untuk mengolah data bilangan, MySQL sudah menyediakan beberapa fungsi. Berikut tabelnya.
Fungsi Keterangan abs() Mengembalikan nilai mutlak dari n. Misal abs(-10) akan mengembalikan nilai 10. round() Membulatkan bilangan desimal n menjadi bilangan bulat. Misal round(3.45) hasilnya 3. ceiling(n) Pembulatan ke atas terdekat. Misal ceiling(3.25) menghasilkan 4. floor(n) Pembulatan ke bawah terdekat. Misal floor(3.97) menghasilkan nilai 3. mod(n,m) Operasi sisa hasil bagi/ modulus. Misal mod(11,4) menghasilkan nilai 3. power(n,m) Mengembalikan nilai n pangkat m. Misal power(10,2) hasilnya 100. sqrt(n) Mengembalikan akar pangkat 2 dari n. Misal sqrt(4) hasilnya 2. rand(n) Mengembalikan nilai acak (random) antara 0 dan 1. Parameter n bersifat opsional."},{"location":"bab9/#fungsi-tanggal-dan-waktu","title":"Fungsi Tanggal dan Waktu","text":"
Kolom bertipe tanggal dan waktu umumnya digunakan untuk mencatat kapan suatu transaksi atau kejadian terjadi dalam database.
Fungsi Keterangan Contoh now() Mengembalikan tanggal dan waktu saat ini (tanggal penuh dengan jam, menit, detik). SELECT now(); hasil: 2024-11-29 10:15:30curdate() Mengembalikan tanggal hari ini (hanya tanggal, tanpa waktu). SELECT curdate(); hasil: 2024-11-29curtime() Mengembalikan waktu saat ini (hanya jam, menit, dan detik). SELECT curtime(); hasil: 10:15:30extract(day from [tanggal]) Mengambil nilai hari dari kolom tanggal. SELECT extract(day from '2024-11-29'); hasil: 29extract(month from [tanggal]) Mengambil nilai bulan dari kolom tanggal. SELECT extract(month from '2024-11-29'); hasil: 11extract(year from [tanggal]) Mengambil nilai tahun dari kolom tanggal. SELECT extract(year from '2024-11-29'); hasil: 2024dayname([tanggal]) Mengembalikan nama hari dari tanggal tertentu (dalam bahasa Inggris). SELECT dayname('2024-11-29'); hasil: Fridaydate_format([tanggal], format) Memformat tanggal sesuai pola tertentu. SELECT date_format('2024-11-29', '%d-%m-%Y'); hasil: 29-11-2024time_format([waktu], format) Memformat waktu sesuai pola tertentu. SELECT time_format('10:15:30', '%h:%i %p'); hasil: 10:15 AM
Penjelasan Format untuk date_format dan time_format:
%d = Hari (01-31)
%m = Bulan (01-12)
%Y = Tahun (4 digit)
%h = Jam (01-12, format 12 jam)
%i = Menit (00-59)
%p = AM atau PM
Catatan:
Format dapat disesuaikan dengan kebutuhan untuk menampilkan data yang lebih user-friendly. Contoh-contoh di atas juga dapat digunakan dalam perintah SQL untuk pengolahan data.
Selamat datang di panduan belajar MySQL edisi best practice. Panduan ini kami susun dengan harapan dapat menjadi sarana belajar yang efektif bagi siapa saja, terutama siswa-siswi di bidang Rekayasa Perangkat Lunak atau mereka yang baru mengenal MySQL.
Panduan ini dirancang ringkas namun tetap komprehensif, berisi teori dasar, format sintaks, dan penerapan dalam kasus nyata. Dengan membaginya ke dalam 12 bab, kami berusaha menyajikan setiap topik secara bertahap agar mudah dipahami, mulai dari dasar hingga fitur lanjutan seperti prosedur, trigger, hingga manajemen user.
Sebagai pengajar, panduan ini juga merupakan bagian dari ikhtiar saya untuk menyampaikan ilmu dengan cara yang lebih terstruktur dan mudah diakses, terutama dalam bentuk website. Saya percaya, kemudahan akses ini akan membuka peluang belajar lebih luas bagi siapa saja.
Semoga panduan ini bermanfaat, menjadi amal jariyah, dan membawa kebaikan bagi kita semua. Jika Anda merasa panduan ini berguna, jangan ragu untuk membagikannya kepada yang lain.
Madiun, 4 Desember 2024 Salam hangat, Ipnu Masyaid
Terima kasih telah menggunakan panduan belajar MySQL ini. Saya berharap panduan ini dapat memberikan manfaat nyata dalam memahami dan menguasai MySQL, baik untuk kebutuhan belajar, mengajar, maupun pengembangan profesional.
Jika ada kekurangan dalam penyusunan panduan ini, saya dengan rendah hati menerima saran dan kritik membangun agar panduan ini bisa terus diperbaiki dan dikembangkan.
Mari bersama-sama menjadikan ilmu yang kita pelajari sebagai bekal untuk kebaikan dan kemajuan. Saya percaya, dengan berbagi ilmu, kita tidak hanya membantu sesama, tetapi juga mendekatkan diri pada keberkahan ilmu itu sendiri.
Selamat belajar, dan semoga sukses selalu menyertai langkah Anda!