Dokumen tersebut berisi jawaban soal ujian Basis Data Lanjut yang meliputi pembuatan database, tabel, prosedur, dan trigger. Terdapat pengisian data ke tabel-tabel yang dibuat menggunakan prosedur serta pembuatan trigger untuk mencatat log penghapusan dan pemulihan data. Juga terdapat query untuk menampilkan data biodata beserta umur, alamat, dan jumlah transaksi per bulan.
1. Nama : Arozisokhi Zebua
Nim : 1042100986
Mata Ujian : Basis Data Lanjut
Jawaban soal:
--Nomor 1—
create database arozisokhi_zebua_uts_bdl;
use arozisokhi_zebua_uts_bdl;
create table provinsi(
id_provinsi int not null auto_increment,
nama_provinsi varchar(200),
primary key(id_provinsi)
);
create table kabupaten(
id_kabupaten int not null auto_increment,
id_provinsi int not null,
nama_kabupaten varchar(200),
foreign key(id_provinsi) references provinsi(id_provinsi),
primary key (id_kabupaten, id_provinsi)
);
create table alamat(
id int not null auto_increment,
id_provinsi int not null,
id_kabupaten int not null,
foreign key(id_provinsi) references provinsi(id_provinsi),
foreign key(id_kabupaten) references kabupaten(id_kabupaten),
primary key (id, id_kabupaten, id_provinsi)
2. );
create table biodata(
id int not null auto_increment,
nama varchar(200),
tgl_lahir date,
primary key(id)
);
create table transaksi(
id int not null auto_increment,
id_biodata int not null,
tanggal_transaksi date,
jumlah_transaksi int,
foreign key (id_biodata) references biodata(id),
primary key(id,id_biodata)
);
3. --Nomor 2--
--Procedure isi_Provinsi--
delimiter $$
create
procedure isi_provinsi()
begin
declare p int;
set p=0;
label : loop
set p=p+1;
insert into provinsi (id_provinsi, nama_provinsi)
values(p, concat("provinsi",p));
if p <12 then iterate label; end if;
leave label;
end loop label;
end$$
delimiter ;
call isi_provinsi();
--Procedure Isi kabupaten--
delimiter $$
create
procedure isi_kabupaten()
begin
declare p int;
set p=0;
label : loop
set p=p+1;
insert into kabupaten (id_provinsi, id_kabupaten, nama_kabupaten)
4. values(p, p, concat("kabupaten",p));
if p <12 then iterate label; end if;
leave label;
end loop label;
end$$
delimiter ;
call isi_kabupaten();
--Procedure isi_alamat--
delimiter $$
create
procedure isi_alamat()
begin
declare p int;
set p=0;
label : loop
set p=p+1;
insert into alamat (id, id_provinsi, id_kabupaten)
values(p,p,p);
if p <12 then iterate label; end if;
leave label;
end loop label;
end$$
delimiter ;
call isi_alamat();
--Procedure isi_biodata--
delimiter $$
create
5. procedure isi_biodata()
begin
declare p int;
set p=0;
label : loop
set p=p+1;
insert into biodata (id, nama, tgl_lahir)
values(p, concat("Biodata",p), concat("1992","-",p,"-",p));
if p <12 then iterate label; end if;
leave label;
end loop label;
end$$
delimiter ;
call isi_biodata();
---Procedure isi_transaksi pertama--
delimiter $$
create
procedure isi_transaksi_pertama()
begin
declare p int;
set p=0;
label : loop
set p=p+1;
insert into transaksi (id, id_biodata,tanggal_transaksi,jumlah_transaksi)
values(p,p,concat("2000","-",p,"-",p),concat(p));
if p <12 then iterate label; end if;
leave label;
end loop label;
6. end$$
delimiter ;
call isi_transaksi_pertama();
---Procedure isi_transaksi kedua--
delimiter $$
create
procedure isi_transaksi_kedua()
begin
declare p int;
declare urut int;
set p=0;
set urut=12;
label : loop
set p=p+1;
set urut = urut+1;
insert into transaksi (id, id_biodata,tanggal_transaksi,jumlah_transaksi)
values(urut, p,concat("2000","-",p,"-",p),concat(urut));
if p <12 then iterate label; end if;
leave label;
end loop label;
end$$
delimiter ;
call isi_transaksi_kedua();
--procedure isi_transaksi_ketiga--
delimiter $$
create
7. procedure isi_transaksi_ketiga()
begin
declare p int;
declare urut int;
declare urut2 int;
set p=0;
set urut=24;
set urut2=15;
label : loop
set p=p+1;
set urut = urut+1;
set urut2 = urut2+1;
insert into transaksi (id, id_biodata,tanggal_transaksi,jumlah_transaksi)
values(urut, p,concat("2000","-",p,"-",p),concat(urut2));
if p <12 then iterate label; end if;
leave label;
end loop label;
end$$
delimiter ;
call isi_transaksi_ketiga();
--procedure isi_transaksi_keempat--
delimiter $$
create
procedure isi_transaksi_keempat()
begin
declare p int;
declare urut int;
declare urut2 int;
set p=0;
8. set urut=36;
set urut2=9;
label : loop
set p=p+1;
set urut = urut+1;
set urut2 = urut2+1;
insert into transaksi (id, id_biodata,tanggal_transaksi,jumlah_transaksi)
values(urut, p,concat("2000","-",p,"-",p),concat(urut2));
if p <12 then iterate label; end if;
leave label;
end loop label;
end$$
delimiter ;
call isi_transaksi_keempat();
--Nomor 3—
catatan yang bisa dihapus
hanya isi tabel transaksi
--Trigger untuk provinsi---
CREATE TABLE transaksi_deleted LIKE transaksi;
ALTER TABLE transaksi_deleted ADD
(
tgl_hapus DATETIME,
nama_user VARCHAR(200)
);
9. DELIMITER $$
CREATE
TRIGGER hapus_transaksi AFTER DELETE ON transaksi FOR EACH ROW
BEGIN
INSERT INTO transaksi_deleted(
id,
id_biodata,
tanggal_transaksi,
jumlah_transaksi,
tgl_hapus,
nama_user
)
VALUES(
OLD.id,
OLD.id_biodata,
OLD.tanggal_transaksi,
OLD.jumlah_transaksi,
SYSDATE(),
CURRENT_USER
);
END;
$$
DELIMITER ;
SHOW TRIGGERS FROM arozisokhi_zebua_uts_bdl;
--Triger untuk restore data yang sudah dihapus--
cara kerja: Jika data yang ada pada transaksi_deleted dihapus maka data tersebut otomatis
dikembalikan ke tabel transaksi
10. DELIMITER $$
CREATE
TRIGGER restore_transaksi AFTER DELETE ON transaksi_deleted FOR EACH ROW
BEGIN
INSERT INTO transaksi(
id,
id_biodata,
tanggal_transaksi,
jumlah_transaksi
)
VALUES(
OLD.id,
OLD.id_biodata,
OLD.tanggal_transaksi,
OLD.jumlah_transaksi
);
END;
$$
DELIMITER ;
11. --Nomor 4--
A. Untuk Menampilkan biodata beserta umur dan alamat
SELECT
a.id,
nama,
tgl_lahir,
(YEAR(CURDATE())-YEAR(tgl_lahir)) AS umur,
(CONCAT(nama_provinsi,",",nama_kabupaten)) AS alamat
FROM
biodata a
LEFT JOIN alamat b ON (b.id=a.id)
LEFT JOIN provinsi c ON (c.id_provinsi=b.id_provinsi)
LEFT JOIN kabupaten d ON (d.id_kabupaten=b.id_kabupaten);
Hasilny :
12. B. Untuk Menampilkan biodata beserta nama dan jumlah transaksi perbulan
SELECT
id,nama,IFNULL (jml_jan,0) AS Januari,IFNULL (jml_feb,0) AS Februari,
IFNULL (jml_mar,0) AS Maret,IFNULL (jml_apr,0) AS April,
IFNULL (jml_mei,0) AS Mei,IFNULL (jml_jun,0) AS Juni,
IFNULL (jml_jul,0) AS Juli,IFNULL (jml_agst,0) AS Agustus,
IFNULL (jml_sep,0) AS September,IFNULL (jml_okt,0) AS Oktober,
IFNULL (jml_nov,0) AS November,IFNULL (jml_des,0) AS Desember
FROM
biodata a
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_jan
FROM transaksi
WHERE MONTH(tanggal_transaksi)=1
GROUP BY id_biodata
) AS Januari ON(Januari.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_feb
FROM transaksi
WHERE MONTH(tanggal_transaksi)=2
GROUP BY id_biodata
) AS Februari ON(Februari.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_mar
FROM transaksi
WHERE MONTH(tanggal_transaksi)=3
13. GROUP BY id_biodata
) AS Maret ON(Maret.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_apr
FROM transaksi
WHERE MONTH(tanggal_transaksi)=4
GROUP BY id_biodata
) AS April ON(April.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_mei
FROM transaksi
WHERE MONTH(tanggal_transaksi)=5
GROUP BY id_biodata
) AS Mei ON(Mei.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_jun
FROM transaksi
WHERE MONTH(tanggal_transaksi)=6
GROUP BY id_biodata
) AS Juni ON(Juni.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_jul
FROM transaksi
WHERE MONTH(tanggal_transaksi)=7
14. GROUP BY id_biodata
) AS Juli ON(Juli.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_agst
FROM transaksi
WHERE MONTH(tanggal_transaksi)=8
GROUP BY id_biodata
) AS Agustus ON(Agustus.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_sep
FROM transaksi
WHERE MONTH(tanggal_transaksi)=9
GROUP BY id_biodata
) AS September ON(September.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_okt
FROM transaksi
WHERE MONTH(tanggal_transaksi)= 10
GROUP BY id_biodata
) AS Oktober ON(Oktober.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_nov
FROM transaksi
15. WHERE MONTH(tanggal_transaksi)=11
GROUP BY id_biodata
) AS November ON(November.id_biodata=a.id)
LEFT JOIN
(
SELECT id_biodata, SUM(jumlah_transaksi) AS jml_des
FROM transaksi
WHERE MONTH(tanggal_transaksi)=12
GROUP BY id_biodata
) AS Desember ON(Desember.id_biodata=a.id)
;
Hasilnya :
---Sekian Terimaksih, Tuhan Memberkati---