You are on page 1of 39

Tugas Lab TSBD

Lakukan skenario sesuai dengan soal-soal di bawah ini.


Tampilkan query dan output/hasil dari pgAdmin atau
Pentaho Data Integration untuk masing-masing soal!
(kecuali untuk soal konseptual dengan jawaban singkat)
Kirim ke: budiutama@gmail.com
Subject: [LabTSBD] {Kelas} {Nama group}
NamaFile: TugasLab {Kelas} {Nama group}
Sebelum: 7 Juni 2016, Pukul 21.00
Kelompok: {no/nama group}
1. NPM1 NAMA1
2. NPM2 NAMA2
..
1.

Buat tabel DEPARTMENT dengan struktur data berikut:

KOLOM
ID_DEPT
DEPT_NAME
HEAD

TIPE
NUMBER
VARCHAR2
NUMBER

PANJANG
500

CREATE TABLE department(


id_dept serial,
dept_name character varying(500),
head bigint);
ALTER TABLE department
ADD CONSTRAINT id_dept_pk PRIMARY KEY (id_dept);

KETERANGAN
PRIMARY KEY

2.
ID_DEP
T
51
52
53
54
55

Masukkan data DEPARTMENT sesuai dengan data berikut:


DEPT_NAME

HEAD

Management
Operations
Finance
Marketing
Sales

INSERT INTO department VALUES(51,'Management',NULL);


INSERT INTO department VALUES(52,'Operation',NULL);
INSERT INTO department VALUES(53,'Finance',NULL);
INSERT INTO department VALUES(54,'Marketing',NULL);
INSERT INTO department VALUES(55,'Sales',NULL);

3.

Buat sebuah sequence dengan konfigurasi standar!

CREATE SEQUENCE empid START 1;

4.

Buat tabel EMPLOYEE dengan struktur data berikut:

KOLOM
EMP_ID
NAME
SEX
POSITION
SALARY
DEPT_ID

TIPE
NUMBER
VARCHAR2
VARCHAR2
VARCHAR2
NUMBER
NUMBER

PANJANG

KETERANGAN
PRIMARY KEY

500
500
500

CREATE TABLE employee


(
emp_id integer,
emp_name character varying(500),
sex character varying(500),
position character varying(500),
salary integer,
dept_id integer );
ALTER TABLE Employee ADD CONSTRAINT emp_pk PRIMARY KEY (emp_id);

5.

Masukkan enam EMPLOYEE sesuai dengan data berikut:


(EMP_ID diambil dari sequence yang telah dibuat)

EMP_NAME
Andi
Belle
Chintya
Dendi
Elang
Fifi

SEX
Male
Female
Perempuan
Laki-laki
Male
Perempuan

POSITION
Manager
Teller
Accountant

SALARY
10000000
5000000
4000000

Security
Teller

2500000
4500000

DEPT_ID
51
52
53
59
52
52

INSERT INTO employee VALUES (nextval('empid'), 'Andi', 'Male', 'Manager',


'10000000', '51');
INSERT INTO employee VALUES (nextval('empid'), 'Belle', 'Female', 'Teller',
'5000000', '52');
INSERT INTO employee VALUES (nextval('empid'), 'Chintya', 'Perempuan',
'Accountant', '4000000', '53');
INSERT INTO employee VALUES (nextval('empid'), 'Dendi', 'Laki-laki', NULL,
NULL, '59');
INSERT INTO employee VALUES (nextval('empid'), 'Elang', 'Male', 'Security',
'2500000', '52');
INSERT INTO employee VALUES (nextval('empid'), 'Fifi', 'Perempuan', 'teller',
'4500000', '52');

6.

Untuk menjaga konsistensi, coba set kolom SEX hanya bisa


menerima Male or Female! Apakah berhasil? Kenapa
demikian? (Hint: gunakan check constraint)

ALTER TABLE Employee ADD CONSTRAINT ck_gender CHECK (sex IN


('Male', 'Female'));

Tidak Berhasil
Karena di dalam kolom SEX, terdapat data perempuan dan laki-laki yang
mana tidak sesuai dengan constraint yang akan di eksekusi.
Error message yang diperoleh adalah check constraint ck_gender is
violated by some row

7.

Untuk nomor Error: Reference source not found, sebutkan dan


sesuaikan record yang tidak sesuai dengan constraint tersebut,
serta coba buat kembali constraint pada nomor Error: Reference
source not found!

UPDATE employee SET sex = 'Female' WHERE sex = 'Perempuan';


UPDATE employee SET sex = 'Male' WHERE sex = 'Laki-laki';

8.

Coba set kolom POSITION menjadi NOT NULL! Apakah


berhasil? Kenapa demikian? Record mana yang tidak sesuai?

ALTER TABLE employee ALTER COLUMN position SET NOT NULL;

Tidak Berhasil, karena di dalam tabel POSITION terdapat nilai NULL.

9.

Coba set kolom DEPT_ID sebagai Foreign Key yang mengacu


pada tabel DEPARTMENT! Apakah berhasil? Kenapa demikian?

ALTER TABLE employee


ADD CONSTRAINT dept_id_fk FOREIGN KEY (dept_id)
REFERENCES department (id_dept) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;

Kolom DEPT_ID tidak bisa dijadikan foreign key yang mengacu pada tabel
DEPARTMENT karena pada kolom DEPT_ID terdapat ID no.59 sedangkan pada
kolom ID_DEPT pada tabel DEPARTMENT tidak ada ID no.59 sehingga query
ini tidak bisa dijalankan.

10. Untuk nomor , apabila ada nilai yang tidak sesuai, maka
silahkan set menjadi NULL, kemudian coba buat lagi Foreign
Key-nya!
UPDATE employee SET dept_id = NULL WHERE dept_id = 59;
ALTER TABLE employee
ADD CONSTRAINT dept_id_fk FOREIGN KEY (dept_id)
REFERENCES department (id_dept) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET NULL

11.

Set kolom HEAD pada table DEPARTMENT sebagai Foreign Key


dari EMP_ID pada table EMPLOYEE!

ALTER TABLE department


ADD CONSTRAINT head_fk FOREIGN KEY (head)
REFERENCES employee (emp_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET NULL;

12. Set pegawai dengan nama Andi sebagai ketua departemen


Management dan Operations, berikutnya set pegawai dengan
nama Chintya sebagai ketua departemen Finance!
UPDATE department set head = '1' WHERE id_dept IN ('51', '52');

UPDATE department set head = '3' WHERE id_dept IN ('53');

13. Coba set unique constraint pada kolom HEAD pada tabel
DEPARTMENT! Apakah berhasil? Kenapa demikian?
ALTER TABLE Department
ADD CONSTRAINT headConstraint UNIQUE (head);

Karena ada terjadi duplikasi data pada record di kolom head yaitu head=7

14. Coba ubah ketua departemen Operations dari Andi menjadi


Belle. Kemudian coba buat lagi unique constraint tersebut!
UPDATE department set head = '2' WHERE id_dept IN ('52');

ALTER TABLE Department


ADD CONSTRAINT headConstraint UNIQUE (head);

15. Tampilkan jumlah pegawai yang ada!


SELECT COUNT(*) from Employee;

16. Tampilkan pegawai yang belum ditempatkan pada posisi


tertentu!
SELECT * from employee WHERE position IS NULL;

17. Tampilkan pegawai yang memiliki gaji paling tinggi!


SELECT MAX(salary), emp_name
FROM employee
WHERE salary IS NOT NULL
GROUP BY emp_name, salary
ORDER BY salary DESC
LIMIT 1;

18. Tampilkan pegawai yang memiliki gaji paling rendah!


SELECT MIN(salary), emp_name
FROM employee
GROUP BY emp_name, salary
ORDER BY salary DESC
LIMIT 1;

19. Tampilkan nama departemen beserta nama ketuanya!


SELECT department.dept_name, employee.emp_name
FROM department, employee
WHERE employee.emp_id=department.head;

20. Tampilkan departemen yang tidak memiliki ketua!


SELECT * FROM department
WHERE head IS NULL;

21. Jalankan dua window SQL dan kita namakan window1 dan
window2

22. Tampilkan gaji Andi pada kedua window!


SELECT salary, emp_name FROM employee
WHERE emp_name='Andi';

23. Jalankan perintah begin pada window1


BEGIN;

24. Tambahkan gaji Andi menjadi 125% pada window1


UPDATE employee SET salary=(salary*125/100)
WHERE emp_id= '1';

25. Tampilkan gaji Andi pada kedua window! Kesimpulan apa


yang bisa diambil?
SELECT * FROM employee
ORDER BY emp_name;

Kesimpulan: Karena di window 1 belum di COMMIT. Sehingga belum terjadi


perubahan di window 2.
26. Jalankan perintah commit pada window1!
COMMIT;

27. Tampilkan gaji Andi pada kedua window! Kesimpulan apa


yang bisa diambil?
SELECT * FROM employee
ORDER BY emp_name;

Kesimpulan: Kedua window menampilkan nilai yang sama, karena window 1 sudah
di COMMIT.

28. Jalankan perintah begin pada kedua window!


BEGIN;

29. Tambahkan gaji Elang menjadi 115% pada window1!


UPDATE employee SET salary=(salary*115/100)
WHERE emp_id= '5';

30. Tambahkan gaji Elang menjadi 125% pada window2! Apa yang
terjadi?
UPDATE employee SET salary=(salary*125/100)
WHERE emp_id= '5';

Query ini belum berjalan karena masih menunggu query di window 1 di COMMIT.

31. Jalankan perintah rollback pada window1 Apa yang terjadi


pada window2?
ROLLBACK;

Karena window 1 di ROLLBACK maka Query di window 2 di eksekusi.

32. Jalankan perintah commit pada window2!


COMMIT;

33. Berapa gaji Elang sekarang?


SELECT * FROM employee;
Gaji Elang sekarang 3125000.

34. Jalankan perintah begin pada kedua window!

BEGIN;

35. Tambahkan gaji Chintya menjadi 110% pada window1!


UPDATE employee SET salary=(salary*110/100)
WHERE emp_id= '3';

36. Tambahkan gaji Fifi menjadi 110% pada window2!


UPDATE employee SET salary=(salary*110/100)
WHERE emp_id= '6';

37. Ubah posisi Fifi menjadi Accountant pada window1! Apa yang
terjadi?
UPDATE employee SET position='Accountant'
WHERE emp_name='Fifi';

Karena Query perubahan salary Fifi di window 2 belum di COMMIT, maka belum
terjadi perubahan posisi Fifi di window 1.

38. Ubah posisi Chintya menjadi Teller pada window2! Apa yang
terjadi pada kedua window?
UPDATE employee SET position='Teller'
WHERE emp_name='Chintya';

Query untuk UPDATE posisi Chintya di window 2 mengalami DEADLOCK dan


Query update posisi Fifi sukses dieksekusi di window 1.

39. Jalankan perintah commit pada


perbedaan antara kedua window?

kedua

window!

Apa

COMMIT;
SELECT * FROM employee;

Tidak ada perbedaan di kedua window.


40. Tampilkan posisi dari Chintya dan Fifi! Posisi siapa yang tidak
berubah?

Kesimpulan: Posisi yang tidak berubah adalah posisi Chintya.

Untuk nomor 41 s.d. 44, mengacu pada keterangan berikut:


Dibutuhkan sebuah trigger yang akan mengoverride gaji manajer
baru dengan ketentuan sebagai berikut: Apabila gaji yang
dimasukkan lebih besar dari Rp 15.000.000,- maka akan dioverride
menjadi Rp 15.000.000,-; Apabila gaji yang dimasukkan lebih kecil
dari Rp 5.000.000,- maka akan dioverride menjadi Rp 5.000.000,41. Apakah before-statement atau after-statement waktu eksekusi
yang lebih cocok untuk trigger di atas?
Before Statement, karena record gaji yang ingin diinput harus divalidasi dahulu
sesuai dengan ketentuan yang ada.
42. Apakah ketika insert, UPDATE, atau delete opsi eksekusi yang
paling cocok untuk trigger diatas?
Update, karena akan mengoverride record gaji sebelumnya.
43. Buat trigger tersebut!
CREATE OR REPLACE FUNCTION f_salaryMax() RETURNS TRIGGER AS $
$
BEGIN
IF (NEW.salary > 15000000) THEN
UPDATE Employee SET salary = 15000000
WHERE NEW.emp_id = employee.emp_id;
RETURN NEW;
ELSIF (NEW.salary < 5000000) THEN
UPDATE Employee SET salary = 5000000
WHERE NEW.emp_id = employee.emp_id;
RETURN NEW;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER salaryMax
AFTER INSERT OR UPDATE ON employee
FOR EACH ROW EXECUTE PROCEDURE f_salaryMax();

44. Masukkan satu manajer baru dengan gaji Rp 3.000.000,-!


Tampilkan datanya!
INSERT INTO employee
VALUES (nextval('empid'), 'Sukma', 'Male', 'Manager', '3000000', null);
SELECT * FROM employee;

45. Masukkan satu manajer baru dengan gaji Rp 18.000.000,-!


Tampilkan datanya!
INSERT INTO employee
VALUES (nextval('empid'), 'Harya', 'Male', 'Manager', '18000000', null);
SELECT * FROM employee;

Untuk nomor 46 s.d. 50, gunakan Pentaho Data Integration!

46. Buat transformasi baru dengan koneksi ke database lokal


sesuai konfigurasi masing-masing!

47. Buat Excel Input dari file stock-list.xlsx dan edit sesuai dengan
kriteria berikut:
Kolom
EMS
Max Spread Floor
Max Spread Perc.
First Training Day

Format/Keterangan
Number
Number
Number
Date (DD/MM/YYYY)

48. Buat Select values dengan Hop dari Excel Input dan edit
sesuai dengan kriteria berikut:
Kolom
Mnemonic
Short Name
Long Name
First Training Day

Format/Keterangan
Remove
Remove
Remove
Ubah menjadi YYYY-MMDD

49. Buat Table output dengan Hop dari Select values dan edit
sesuai dengan kriteria berikut:
Kriteria
Tablename
SQL
Truncated

Value
Stock
PDI generated
Yes

50. Jalankan transformasi & tampilkan datanya di database!

You might also like