======================
Format export :
mysqldump -u namauser namadatabase > lokasi file
Format import :
mysql -u namauser namadatabase < lokasi file
Contoh :
1. Buatlah database dengan nama latihan
2. Buatlah tabel provinsi, dengan struktur :
(nama_prov VARCHAR(50),
kode_iso CHAR(2),
ibukota VARCHAR(50),
populasi INT,
luas DEC(8,2),
apbd DEC(8,2));
5. Lakukan import data dari file txt yang ada di folder lain
LOAD DATA INFILE 'E://nama_provinsi_b.txt' INTO TABLE provinsi;
Jadi kalau kita ingin load data dari folder lain kita harus sebutkan dimana lokasi
file tersebut
DELETE FIELD :
delete from provinsi where ibukota is NULL ;
Latihan :
===================================================================================
=========================================================
15 Maret 2023
===================================================================================
==============================================================
EXPORT DATA
===================================================================================
========================================================
EXPORT DENGAN DATA DENGAN SELECT... INTO OUTFILE
-->Membuat atau menggenerate file teks yang berasal dari tabel MYSQL.
Format dasar :
SELECT nama_kolom1,nama_kolom2,...
INTO OUTFILE 'lokasi_file',[setting...]
FROM nama_tabel;
Keterangan :
- Bisa dipilih kolom mana yang akan diekspor
- Perintah tambahan pada LOAD DATA INFILE juga bisa ditambahkan pada [setting..]
Contoh :
Keterangan :
- Khusus untuk perintah OPTIONALLY ENCLOSED NY '"', artinya hasil teks untuk data
dengan tipe
String akan diapit dengan tanda kutip dua,sedangkan tipe data number tidak.
Perilaku seperti di dapat dengan tambahan perintah OPTIONALLY.
2. Lakukan export data tabel provinsi kedalam file hasil_provinsi_b.txt
yang berlokasi di drive (atau drive lain)
SELECT nama_prov,kode_iso,populasi
INTO OUTFILE 'F:\\hasil_provinsi_b.txt'
FIELDS TERMINATED BY '##'
LINES TERMINATED BY '\t'
FROM provinsi;
INDEX
===================================================================================
=============
--> Berguna untuk mempercepat proses pencarian data. Tidak berpengaruh terhadap
tampilan tabel.
--> Biasanya digunakan pada tabel skala besar (terdiri dari 10.000 - 1.000.0000)
baris data.
Contoh :
Buatlah index pada kolom nama di tabel mahasiswa
--> CREATE INDEX nama ON mahasiswa(nama);
Menampilkan indeks :
SHOW INDEX FROM nama_tabel \G;
B. ALTER TABLE
Format :
ALTER TABLE nama_tabel ADD INDEX nama_index (kolom_index);
--> Penulisan nama_index optional
Contoh :
1. ALTER TABLE mahasiswa ADD INDEX(jurusan);
2. ALTER TABLE mahasiswa ADD INDEX idx_tinggi(tinggi);
Latihan :
Buatlah tabel mahasiswa2(kolom seperti tabel mahasiswa), tambahkan index di kolom
nama (nama index : idx_nama)
===================================================================================
================================================================================
29 Maret 2023
===================================================================================
===================================================================================
==
LATIHAN :
1. Buatlah tabel bintang film seperti dibawah ini :
CREATE TABLE bintang_film(
id_artis varchar(7),
nama_artis varchar(50),
hobi varchar(50),
alamat varchar(50),
no_telepon varchar(15),
agency varchar(50));
@nomor artis;namaartis;agency
@++++++++++++++++++++++++++++
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@"RZ_RH03";"Reza Rahadian";"MNC Television"
@"SH_DR01";"Sheila Dara";"Bintang Artis"
Query Table :
select productname,productline,buyprice
from products
where productline='classic cars'
order by buyprice desc;
Query Export :
INDEX
=====
Keuntungan pemakaian index :
Mempercepat peoses pencarian data. Terutama pada query yang kompleks
Kekurangan Index :
Memperlama proses insert, update dan delete data
Membutuhkan ruang penyimpanan yang lebih besar
Contoh :
Buatlah index namaproduk untuk productname yang ada di tabel
products pada database classicmodels
Contoh :
Ubahlah tabel products dengan menambahkan index untuk productvendor.
Contoh :
CREATE TABLE t_mahasiswa
(No_bp varchar(12) not null primary key,
nama varchar(50),
tgl_lahir date,
index indexnama(nama));
Contoh :
Hapuslah index vendorproduk dari tabel products.
2. UNIQUE INDEX --> index yang membatasi duplikasi data. Ketika menggunakan index
UNIQUE pastikan kolom tidak memiliki nilai yang sama.
3. PRIMARY KEY INDEX --> index yang juga berfungsi sebagai PK dari sebuah tabel.
4. FULLTEXT INDEX
6. HASH INDEX --> index yang menggunakan algoritma HASH khusus untuk tabel dengan
tipe MEMORY.
CONTOH :
CREATE INDEX nama_index ON namatabel (kolom_index);
CREATE UNIQUE INDEX nama_index ON namatabel (kolom_index);
CREATE FULLTEXT INDEX nama_index ON namatabel (kolom_index);
CREATE SPATIAL INDEX nama_index ON namatabel (kolom_index);
===================================================================================
=================
===================================================================================
=================
PREFIX INDEX :
Cocok untuk kolom dengan karakter yang lebih panjang. Misalnya ada
kolom dengan tipe varchar(200). Tidak efisien menjadikan index untuk semua
nilai kolom. Disiasati dengan menjadikan index untuk beberapa karakter di awal saja
tetapi dengan syarat beberapa karakter tersebut sudah terjamin keunikannya.
Contoh : Lihat nilai customername pada tabels customers. Cukup jadikan 3 karakter
di awal customername untuk menjadi index
SELECT*FROM orders
WHERE orderdate = ......... AND status = ...........;
Contoh :
Buatlah kolom orderdate dan status menjadi satu index secara bersamaan.
===================================================================================
========================================================================
05 April 2023
===================================================================================
========================================================================
Gunanya : membuat index yang berasal dari suku kata yang ada pada sebuah kolom
dan suku kata tersebut sangat sering digunakan.
Contoh : Pada tabel orders, terdapat kolom comments yang sering diakses.
Untuk itu kolom tersebut dapat dijadikan index dengan menerapkan FULLTEXT INDEX.
Tetapi kolom comments
memiliki karakter yang terlalu panjang. Maka dipilih satu kata yaitu 'Customer'
untuk dijadikan Index.
Cara menguji :
===================================================================================
=============================================================================
VIEW
====
--> Tabel virtual atau tabel logis yang berasal dari query SELECT,
View bisa digunakan untuk membuat 'table baru' yang isinya diambil dari tabel yang
sudah ada saat ini.
Contoh :
Tampilkan productname yang sudah terjual oleh employee yang bernama Leslie
Thompson,
employeename (gabungan firstname dan lastname), customername, shippeddate untuk
shippeddate yang terjadi di
tahun 2003
Query :
SELECT productname, CONCAT(Firstname, ' ', lastname) as FullName, customername,
shippeddate
FROM employees JOIN customers ON employees.employeenumber =
customers.salesrepemployeenumber
JOIN orders ON customers.customernumber = orders.customernumber
JOIN orderdetails ON orders.ordernumber = orderdetails.ordernumber
JOIN products ON orderdetails.productcode = products.productcode
WHERE CONCAT(firstname, ' ', lastname) = 'Leslie Thompson' AND shippeddate LIKE
'%2003%';
Keunggulan View :
1. Menyederhanakan query yang kompleks
2. Menyembunyikan struktur asli tabel
3. Membuat kolom komputasi
4. Menjaga backward compatibality
LIHAT TABLE :
SHOW TABLES
SHOW FULL TABLES --> Lihat keterangan tabel
menghapus view :
================
DROP view namaview
===================================================================================
==============================================================================
12 April 2023
===================================================================================
==============================================================================
Buatlah view officesbaru2 yang menyimpan informasi officecode, city dan country
untuk office yang berada di USA.
Lakukan insert data baru ke officesbaru2 : officecode = 9, city ='Bukittinggi' dan
country = Indonesia
Contoh :
1. Buatlah view officesbaru3 yang menyimpan informasi officecode, city dan country
untuk office yang berada di USA.
2. Insert data baru ke officebaru3 officecode = 10, city ='Bandung' dan country
='Indonesia'.
Kasus :
1. Buatlah view dengan nama emoffices yang terdiri dari employeenumber, firstname,
lastname,
officecode, city dan country employee ditempatkan
Pertanyaan :
Apakah bisa melakukan insert data terhadap view diatas ? lakukan analisis dan
berikan alasan Anda
Tidak berhasil, karena tidak bisa insert ke dalam view hasil join dari tabel
Update data dari view tidak bisa ketika jika query terbuat dari :
1. Aggregate
2. Distinct
3. Group By
4. Having
5. Union dan Union All
6. Outer Join
7. SubQuery
===================================================================================
==========================================================
26 April 2023
Tugas Manajemen User
===================================================================================
==========================================================
Tugas 1 :
1. CREATE USER 'user1'@'localhost' IDENTIFIED BY 'tugas1';
GRANT ALL PRIVILEGES ON classicmodels.* TO 'user1'@'localhost';
FLUSH PRIVILEGES;
Tugas 2 :
1. CREATE USER 'Mary'@'localhost' IDENTIFIED BY 'Mary123';
CREATE USER 'Dave'@'localhost' IDENTIFIED BY 'Dave123';
FLUSH PRIVILEGES;
03 Mei 2023
===================================================================================
===================================================================================
===============
GRANT Terbagi 3 :
1. GRANT ALL --> Mengizinkan user untuk menjalankan semua Query
GRANT jenis_hak_akses(kolom)
ON [nama_database.nama_tabel]
TO 'namauser@host' [identified by 'password']
[WITH GRANT OPTION]
2. berikan hak akses SELECT pada tabel offices di classicmodels kepada user alfa
3. user alfa naik pangkat, sehingga memperoleh izin untuk mengubah data
yang ada pada tabel offices. Berikan hak akses baru pada user alfa!.
ROLES
==> Object pada MySQL yang berisi kumpulan hak akses dan diberi nama.
Langkah - Langkah :
1. Buat Role baru
2. Berikan hak akses pada role tersebut
3. Berikan role kepada user
Contoh :
Pada database classicmodels dibuat 3 macam role untuk melekukan akses ke database.
1. crm_dev ==> User developer
2. crm_read ==> User yang hanya bisa membaca (read)
3. crm_write ==> User yang dapat menulis (write)
Misalkan diperlukan :
Satu user sebagai developer
CREATE USER user_dev1@localhost identified by '12345';
GRANT crm_dev TO user_dev1;
Memakai Role :
SET ROLE crm_dev; --> User dev1
===================================================================================
==============================================================================
24 Mei 2023
===================================================================================
===============================================================================
TRANSACTION
===========
--> Salah satu fitur penting yang pada MySQL yang dapat mengeksekusi beberapa
perintah (Query)
sebagai satu kesatuan atau secara bersamaan.
Tanpa transaksi :
Dengan transaksi :
BEGIN
Query 1;
Query 2;
........
Query n;
COMMIT / ROLLBACK;
- Fungsi lain mencegah user lain dalam mengubah data yang belum selesai di proses
AUTOCOMMIT MODE --> Mode untuk mengatur apakah perintah query langsung diproses
atau tidak.
Secara default perintah ini aktif sehingga setiap perintah query yang diketik pada
MySQL akan langsung
dieksekusi/diproses saat itu juga.
ROLLBACK/COMMIT;
Kasus :
Buatlah sebuah table tabungan disebuah database db_bank, terdiri dari field :
- Selanjutnya lakukan update terhadap data tersebut. Set jumlah menjadi 150000 pada
nama Rudi Permana
UPDATE tabungan
SET jumlah = 150000
WHERE nama_nasabah = 'Rudi Permana';
Batalkan transaksi
ROLLBACK;
SAVEPOINT
=========
--> Fitur penanda dalam transaction, biasanya digunakan pada saat ROLLBACK untuk
membatalkan perintah (Query) di SAVEPOINT tertentu
query1...;
SAVEPOINT nama_savepoint;
Query2....;
SAVEPOINT nama_savepoint;
Latihan :
Buatlah transaction berikut user Nobita :
- SAVEPOINT 1 : Lakukan insert data yang baru pada tabel tabungan yaitu data
Jessica Mila,
proses kredit sejumlah 150000
- SAVEPOINT 2 :
* Lakukan insert data yang baru pada tabel tabungan yaitu data Enzy Storia, Proses
debit sejumlah
200000
* Lakukan update terhadap data tersebut. Set jumlah menjadi 200000 pada nama
Jessica Mila
- SAVEPOINT3 :
* Lakukan insert data yang baru pada tabel tabungan yaitu data Yuki Kato, proses
debit sejumlah 250000
INSERT INTO tabungan (nama_nasabah,jumlah) VALUES ('Yuki Kato',250000);
SAVEPOINT savepoint3;
ROLLBACK TO savepoint2;
LAKUKAN PENGHAPUSAN SAVEPOINT1
Lakukan commit :
commit;
===================================================================================
===================================================================================
======
31 Mei 2023
===================================================================================
===================================================================================
======
Latihan SavePoint :
a. Lakukan update terhadap data pada tabel tabungan yaitu pada data no 1 ganti nama
menjadi Randi Permata,
lalu save point pertama
UPDATE tabungan
SET nama_nasabah = 'Randi Permata'
WHERE nama_nasabah = 'Rudi Permana';
SAVEPOINT savepoint1;
b. Lakukan insert data baru pada tabel tabungan yaitu Siti Rukmana dengan
proses adalah K sebanyak 150.000 lalu savepoint kedua
c. Lakukan pembatalan query pada save point pertana, lihat apa perubahan yang
terjadi dan
jelaskan dan jelaskan pada laporan anda
ROLLBACK TO savepoint1;
COMMIT;
LOCK TABLE
==========
1) LOCK TABLE READ
--> User lain dan pembuat lock hanya bisa melakukan pembacaan data (SELECT)
b. Lakukan lock table read pada tabel tersebut lalu uji dengan memasukkan sebuah
data.
Tidak bisa melakukan insert data karena tabel di lock. Hanya bisa membaca data
UNLOCK TABLE;
d. Lakukan lock tabel WRITE pada tabel tersebut lalu uji dengan meangakses tabel
tersebut
dengan user lain (jendela cmd yang lain). Lihat perubahan yang terjadi dan jelaskan
pada laporan anda
Setelah INSERT dan SELECT data bisa dilakukan pada user yang memberikan lock tetapi
untuk user lain
TIDAK bisa INSERT maupun SELECT
Setelah di UNLOCK baru user lain bisa akses data pada table tersebut
LATIHAN KASUS :
==============
a. Buatlah seorang user bernama umar, berikan hak akses terhadap tabel tabungan
b. Lakukan lock table read pada table tabungan pada super admin (root)
c. Masuk sebagai user umar pada cmd dan kemudian lakukan insert data oada tabel
tabungan.
Lihat apa yang terjadi dan jelaskan pada laporan anda.
user UMAR hanya bisa baca table tabungan tetapi tidak bisa insert data.
Karena pada user ROOT kita mengunci table read
d. Lakukan UNLCOK TABLE dan perhatikan kembali perubahan pada jendela cmd user
Umar, analisis dan
jelaskan pada laporan
e. Lakukan lock table read pada table tabungan pada user ROOT
f. Pada cmd user UMAR lakukan select pada tabel tabungan, lihat perubahan yang
terjadi. Tuliskan dan anlisis
jelaskan pada laporan Anda
user UMAR bisa melakukan select (baca data) pada tabel tabungan
g. Coba lakukan lock tabel tabungan dari user umar, bisakah dilakukan ? Berikam
penjelasan anda pada laporan
Tidak Bisa. Karena user UMAR bukan super admin, dia hanya bisa insert, update dan
delete. Tetapi
tidak bisa untuk buat user baru, lock table dan juga beri hak akses pada sebuah
user
===================================================================================
==========================================================================
07 Juni 2023
===================================================================================
=============================================================================
--> Memberikan fitur untuk menulis kode program menggunakan bahasa SQL.
Perbedaan procedure dan function :
1. Procedure --> Tidak harus mengembalikan nilai
Function --> harus mengembalikan nilai
Kekurangan :
1. Rumit
2. Terbatas
3. Butuh resource besar
===================================================================================
========================================
@nama = 'Rival';
Tampilkan Variabel :
SELECT @nama;
STORED PROCEDURE
================
Format :
DELIMITER //
CREATE PROCEDURE nama_procedure(parameter1, parameter2,...)
BEGIN
.....
.....
.....
END
DELIMITER
DELIMITER :
==========
--> Perintah untuk mengubah tanda akhir dari Query. ##, //, dll
Contoh :
DELIMITER //
DROP PROCEDURE IF EXIST salam
CREATE PROCEDURE salam()
BEGIN
SELECT 'Selamat Pagi Jurusan TI';
END //
DELIMITER ;
pemanggilannya :
CALL salam();
DELIMITER $$
CREATE OR REPLACE PROCEDURE mini_caravy()
BEGIN
SELECT productname, customername
FROM customers JOIN orders USING (customernumber)
JOIN orderdetails USING(ordernumber)
JOIN products USING(productcode)
WHERE customername = 'Mini Caravy';
END $$
DELIMITER ;
Panggil procedure :
==================
CALL mini_caravy();
Contoh :
DELIMITER $$
CREATE OR REPLACE PROCEDUREjml_emp()
BEGIN
DECLARE jml_emp INT;
SET jml_emp = 3;
END $$
DELIMITER ;
CALL jml_emp();
DELIMITER $$
CREATE OR REPLACE PROCEDURE keterangan_buyprice()
BEGIN
DECLARE keterangan VARCHAR(30);
SELECT
CASE
WHEN buyprice <= 30 THEN 'Product Murah'
WHEN buyprice <= 60 THEN 'Product Biasa'
ELSE 'Product Mahal'
END AS keterangan2
INTO keterangan
FROM products
WHERE productname = 'The Titanic';
SELECT keterangan;
END $$
DELIMITER ;
CALL keterangan_buyprice();
===================================================================================
======================================
14 Juni 2023
===================================================================================
========================================
//Query 2
DELIMITER $$
CREATE OR REPLACE PROCEDURE belititanic()
BEGIN
DECLARE keterangan VARCHAR(30);
DECLARE hargabeli INT;
SELECT buyprice INTO hargabeli FROM products WHERE productname ='The Titanic';
IF hargabeli <=30 THEN SET keterangan = 'Product Murah';
ELSEIF hargabeli <=60 THEN SET keterangan = 'Product Biasa';
ELSE SET keterangan = 'Product Mahal';
END IF;
SELECT keterangan;
END$$
DELIMITER ;
CALL belititanic();
Parameter
=========
--> Sebutan untuk nilai input kedalam sebuah procedure. Sebuah procedure bisa
memiliki beberapa parameter atau tidak sama sekali.
FORMAT :
3 Mode parameter :
IN --> Parameter default. Fungsinya untuk menampung nilai masukan (input)
OUT --> Fungsinya untuk menampung nilai output. Bisa dipanggil di luar procedure
INOUT --> Fungsinya untuk menampung nilai output dan input
http://notepad.pw/sbdprocedure
SOAL
====
Contoh :
1. Dengan parameter IN
DELIMITER //
CREATE OR REPLACE PROCEDURE salam_in (IN nama VARCHAR(30))
BEGIN
DECLARE salam VARCHAR(50);
SET salam = CONCAT('Selamat Pagi ', nama);
SELECT salam;
END //
DELIMITER ;
CALL salam_in('Firman');
delimiter //
CREATE OR REPLACE PROCEDURE salam_inout (IN nama VARCHAR(30), OUT hasil
varchar(50))
BEGIN
SELECT CONCAT('Selamat Pagi ', nama) INTO hasil;
END //
DELIMITER ;
SELECT @hasil_salam;
DELIMITER //
CREATE OR REPLACE PROCEDURE tambuah_ciek(INOUT hasil INT)
BEGIN
SET hasil = hasil + 1;
END //
DELIMITER ;
SET @angka = 2;
CALL tambuah_ciek(@angka);
SELECT @angka;
SOAL:
1. Buatlah procedure yang digunakan untuk menambahkan data offices dengan parameter
kota dan kode_kantor.
DELIMITER //
CREATE OR REPLACE PROCEDURE tambah_data_office (
IN p_kota VARCHAR(50),
IN p_kode_kantor VARCHAR(10))
BEGIN
INSERT INTO classicmodels.offices (city, officeCode)
VALUES (p_kota, p_kode_kantor);
END //
DELIMITER ;
CALL classicmodels.tambah_data_office('Jakarta', '8');
DELIMITER $$
CREATE OR REPLACE PROCEDURE level_customer(
IN customernumber INT,
OUT customer_level VARCHAR(30))
BEGIN
DECLARE max_kreditlimit DECIMAL(10, 2);
SET max_kreditlimit = 50000;
SELECT
CASE
WHEN creditLimit > max_kreditlimit THEN 'Platinum'
ELSE 'Non Platinum'
END AS keterangan
INTO customer_level
FROM customers
WHERE customerNumber = customernumber
LIMIT 1;
END $$
DELIMITER ;
CALL level_customer(103, @customer_level);
SELECT @customer_level AS customer_level;
DELIMITER $$
CREATE OR REPLACE PROCEDURE customers_show()
BEGIN
SELECT CONCAT(contactFirstName, ' ', contactLastName) AS FullName, addressLine1
AS alamat, phone AS nomor_telepon, city, state
FROM classicmodels.customers;
END $$
DELIMITER ;
CALL customers_show();
DELIMITER $$
CREATE OR REPLACE PROCEDURE product_count()
BEGIN
SELECT productLine, COUNT(*) AS product_count
FROM classicmodels.products
GROUP BY productLine
HAVING COUNT(*) > 10;
END $$
DELIMITER ;
CALL product_count();
===================================================================================
===================================================================================
==================
21 Juni 2023
===================================================================================
===================================================================================
====================
Format :
========
Contoh :
DELIMITER $$
CREATE OR REPLACE FUNCTION hello(s char(20)) RETURNS char(50)
BEGIN
RETURN concat('Hello', s);
END $$
DELIMITER ;
Pemanggilannya :
2. Buatlah fungsi sederhana yang menambahkan dua buah angka yang diinputkan ke
dalam
dua buah parameter, lalu mengembalikan hasil dari penambahan tersebut.
DELIMITER $$
CREATE OR REPLACE FUNCTION tambah(angka1 int(10), angka2 int(10)) RETURNS int(11)
BEGIN
RETURN concat(angka1 + angka2);
END $$
DELIMITER ;
SELECT tambah(2,3);
QUERY 2 :
=========
DELIMITER $$
CREATE OR REPLACE FUNCTION tambah(angka1 int, angka2 int) RETURNS int
BEGIN
DECLARE hasil int;
SET hasil = angka1 + angka2;
RETURN hasil;
END $$
DELIMITER ;
SELECT tambah(2,3);
3. Buatlah fungsi yang menghitung total jumlah order berdasarkan status yang
diinputkan user.
Parameter input adalah status, return jumlah order. Lakukan pengecekan untuk order
dengan status Cancelled
DELIMITER $$
CREATE OR REPLACE FUNCTION jml_order(keterangan varchar(50)) RETURNS int
BEGIN
DECLARE total int;
SELECT SUM(quantityordered) INTO total
FROM orderdetails JOIN orders USING(ordernumber)
WHERE status = keterangan;
RETURN total;
END $$
DELIMITER ;
SELECT jml_order('cancelled');
SELECT jml_order('shipped');
4. Waktu tunggu adalah selisih hari dari requireddate dengan shippeddate. Buatlah
fungsi status pengiriman dengan parameter input nomor order dan mengembalikan
status kirim
dengan ketentuan :
Jika waktu tunggu = 0, status kirim tepat waktu(on time)
Jika waktu tunggu 1-5, status kirim terlambat
Jika waktu tunggu > 5, status kirim sangat terlambat
selain itu : produk tidak diketahui keberadaannya
Lakukan pengujian untuk ordernumber 10160, 10388, 10104, 10425
DELIMITER $$
CREATE OR REPLACE FUNCTION status_pengiriman(nomor int) RETURNS varchar(50)
BEGIN
DECLARE tunggu int;
DECLARE status varchar(50);
SELECT datediff(requireddate,Shippeddate) INTO tunggu
FROM orders
WHERE ordernumber = nomor;
SELECT status_pengiriman(10160);
5. Buatlah fungsi lama pengiriman dengan parameter input nomor customer dan
mengembalikan
lama kirim, dengan ketentuan :
Jika negara customers Singapore, lama pengirimannya 3 hari
Jika negara customers USA, lama pengirimannya 5 hari
Jika negara customers UK, lama pengirimannya 10 hari
Selain itu lama pengirimannya 20 hari
Lakukan pengujian untuk customernumber 129,489,409
DELIMITER $$
CREATE OR REPLACE FUNCTION lama_pengiriman(nomor int) RETURNS int
BEGIN
DECLARE lama int;
DECLARE negara varchar(50);
SELECT country INTO negara
FROM customers
WHERE customernumber = nomor;
SELECT lama_pengiriman(129);