Anda di halaman 1dari 6

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.* , k.nama


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.* , k.nama, 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, tgl.nama, tgl.tanggal_mulai, tgl.lama_cuti, tgl.keterangan
2 FROM (
3 SELECT ck.* , k.nama, 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.* , k.nama, 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

Anda mungkin juga menyukai