STUDI KASUS SQL
Diketahui terdapat table “karyawan” untuk menyimpan data karyawan dan table
“cuti_karyawan” untuk menyimpan data cuti yang dilakukan karyawan
Table karyawan
Nomor_induk Nama Alamat Tanggal_lahir Tanggal_masuk
[PK] character text data date
character varying(30)
varying(10)
IP06001 Agus Jln. Gajah Mada 1970-08-01 2006-07-07
115A, Jakarta Pusat
IP06002 Amin Jln. Bungur sari v 1977-05-03 2006-07-07
No, 178, bandung
IP06003 Yusuf Jln. Yosodpuro 15, 1973-08-09 2006-07-07
surabaya
IP07004 Alyssa Jln. Cendana 1983-02-14 2007-01-05
No. 6 Bandung
IP07005 Maulana Jln. Ampera Raya No 1 1985-10-10 2007-02-05
IP07006 Afika Jln. Pejaten Barat No 6A 1987-03-09 2007-06-09
IP07007 James Jln. Padjadjaran 1988-05-19 2007-06-09
No. 111, bandung
IP09008 Octavanus Jln. Gajah Mada 1988-10-07 2008-08-08
101. Semarang
IP09009 Nugroho Jln. Duren Tiga 1988-01-20 2008-11-11
196, Jakarta selatan
IP090010 Raisa Jln. Nangka Jakarta 1989-12-29 2009-02-09
selatan
Table cuti_karyawan
No id nomor_induk Tanggal_mulai Lama_cuti keterangan
[PK] character date smallint text
serial varying(10)
1 1 IP06001 2012-02-01 3 Acara keluar
2 2 IP06001 2012-02-13 2 Anak sakit
3 3 IP07007 2012-02-15 1 Nenek sakit
4 4 IP06003 2012-02-17 1 Mendaftar sekolah anak
5 5 IP07006 2012-02-20 5 Menikah
6 6 IP07004 2012-02-27 1 Imunisasi anak
Tuliskan SQL untuk :
1. Menampilkan 3 karyawan yang pertama kali masuk.
2. Menampilkan daftar karyawan yang saat ini sedang cuti. Daftar berisi
nomor_induk, nama, tanggal_mulai, lama_cuti dan keterangan.
gambaran untuk tabel database cuti karyawan sebagai berikut:
Tabel karyawan:
Tabel cuti_karyawan:
Sudah mulai terbayang kan kira-kira seperti apa struktur database-nya? Hehe,
Oke, yang akan dibahas pada part 1 ini adalah pertanyaan nomor 1 dan 2 saja.
Sebelumnya kita siapkan dulu tabel beserta datanya dengan menjalankan query
berikut ini:
Query untuk membuat tabel karyawan beserta datanya:
1
2
3
4 CREATE TABLE `karyawan` (
5 `nomor_induk` varchar(7) NOT NULL,
6 `nama` varchar(30) NOT NULL,
7 `alamat` text NOT NULL,
8 `tanggal_lahir` date NOT NULL,
9 `tanggal_masuk` date NOT NULL,
1 PRIMARY KEY (`nomor_induk`)
0 );
1
1 /* masukkan data */
1 INSERT INTO `karyawan` (`nomor_induk`, `nama`, `alamat`, `tanggal_lahir`, `tanggal_masuk`)
2 VALUES
1 ('IP06001', 'Agus', 'Jln Gajah Mada 115A, Jakarta Pusat', '1970-08-01', '2006-07-07'),
3 ('IP06003', 'Yusuf', 'Jln Yosodipuro 15, Surakarta', '1973-08-09', '2006-07-07'),
1 ('IP07004', 'Alyssa', 'Jln Cendana No. 6, Bandung', '1983-02-14', '2007-01-05'),
4 ('IP07006', 'Afika', 'Jln Pejaten Barat No. 6A', '1987-03-09', '2007-06-09'),
1 ('IP07007', 'James', 'Jln Padjdjaran No. 111, Bandung', '1988-05-19', '2006-06-09');
5
1
6
Query untuk membuat tabel cuti_karyawan beserta datanya:
1
2
3
4
CREATE TABLE `cuti_karyawan` (
5
`id` int(11) NOT NULL AUTO_INCREMENT,
6
`nomor_induk` varchar(7) NOT NULL,
7
`tanggal_mulai` date NOT NULL,
8
`lama_cuti` int(11) NOT NULL,
9
`keterangan` text NOT NULL,
1
PRIMARY KEY (`id`)
0
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1
1
/* masukkan data */
1
INSERT INTO `cuti_karyawan` (`id`, `nomor_induk`, `tanggal_mulai`, `lama_cuti`, `keterangan`)
2
VALUES
1
(1, 'IP06001', '2015-11-18', 3, 'Acara Keluarga'),
3
(2, 'IP06001', '2012-02-13', 2, 'Anak sakit'),
1
(3, 'IP07007', '2012-02-15', 1, 'Nenek sakit'),
4
(4, 'IP06003', '2012-02-17', 1, 'mendaftar sekolah untuk anak'),
1
(5, 'IP07006', '2012-02-20', 5, 'menikah'),
5
(6, 'IP07004', '2012-02-27', 1, 'imunisasi anak');
1
6
1
7
Sekarang mari kita perhatikan pertanyaan pertama: menampilkan 3 karyawan yang
pertama kali masuk. Untuk bisa menampilkan datanya, pertama kita urutkan dulu
karyawan berdasarkan tanggal_masuk secara ascending (dari kecil ke besar) lalu
diambil tiga row teratas. Berikut query-nya:
1 SELECT *
2 FROM `karyawan`
3 ORDER BY tanggal_masuk ASC
4 LIMIT 3
Bisa dilihat dengan jelas bahwa sintaks untuk mengurutkan data tabel adalah
ORDER BY, dan sintaks untuk mengambil tiga row teratas adalah LIMIT. Query yang
sangat sederhana, bukan? Berikut hasil query-nya:
Sekarang kita lanjut ke pertanyaan kedua: menampilkan daftar karyawan yang saat
ini sedang cuti. Daftar berisi nomor_induk, nama, tanggal_mulai, lama_cuti, dan
keterangan. Tahapan perancangan query-nya adalah:
1. Tampilkan data cuti karyawan beserta nama karyawan. Dengan kata lain, men-
join-kan tabel cuti_karyawan dengan karyawan. Query-nya adalah:
1 SELECT ck.* , [Link]
2 FROM `cuti_karyawan` ck
3 JOIN `karyawan` k ON ck.nomor_induk = k.nomor_induk
2. Hitung tanggal selesai cuti berdasarkan tanggal mulai dan lama cuti, lalu
tambahkan ke query SELECT yang sudah dibuat
1 SELECT ck.* , [Link], date_add( tanggal_mulai, INTERVAL lama_cuti
2 DAY ) AS tanggal_selesai
3 FROM `cuti_karyawan` ck
4 JOIN `karyawan` k ON ck.nomor_induk = k.nomor_induk
3. Filter data berdasarkan tanggal_mulai dan tanggal_selesai, lalu SELECT semua
kolom yang dibutuhkan. Sehingga query lengkapnya adalah sebagai berikut:
1 SELECT tgl.nomor_induk, [Link], tgl.tanggal_mulai, tgl.lama_cuti, [Link]
2 FROM (
3 SELECT ck.* , [Link], date_add( tanggal_mulai, INTERVAL lama_cuti
4 DAY ) AS tanggal_selesai
5 FROM `cuti_karyawan` ck
6 JOIN `karyawan` k ON ck.nomor_induk = k.nomor_induk
7 ) AS tgl
8 WHERE now() BETWEEN tgl.tanggal_mulai AND tgl.tanggal_selesai
Bisa dilihat di situ ada pembuatan alias untuk tabel hasil join menjadi “tgl”, gunanya
adalah agar kolom tanggal_selesai terdefinisi sehingga bisa dipakai untuk mem-filter
data pada bagian WHERE.
Jika kolom tanggal_selesai langsung dipakai tanpa membuat tabel alias, maka
kolom tersebut tidak akan dikenali oleh SQL. Dengan kata lain, seperti ini:
1 SELECT ck.* , [Link], date_add( tanggal_mulai, INTERVAL lama_cuti
2 DAY ) AS tanggal_selesai
3 FROM `cuti_karyawan` ck
4 JOIN `karyawan` k ON ck.nomor_induk = k.nomor_induk
5 WHERE now() BETWEEN ck.tanggal_mulai AND tanggal_selesai
Jika query di atas dijalankan, maka akan terjadi error karena kolom tanggal_selesai
tidak terdefinisi. Sekarang mari kita lihat hasil dari query lengkapnya berikut ini:
Nah, bisa dilihat data yang ditampilkan sudah benar. Tanggal hari ini adalah 19
November 2015, sehingga satu-satunya karyawan yang cuti pada saat ini adalah
Agus.
Demikianlah jawaban pertanyaan nomor 1 dan 2