Capaian:
Mahasiswa mampu menerapkan konsep-konsep pemrograman basis data.
Materi:
SQL: select, join, subquery Procedural Language/SQL:
variabel, tipe-data, control-flow
statement, cursor, prosedur dan
fungsi, trigger
Integrated Development
Environment (IDE): koneksi dan
recordset, dataset
MK. PRAKTIKUM
Tegar Heru Susilo 2014 Laboratorium Komputer STIMIK STIKOM Surabaya
Daftar Isi
SQL (sekuel) ... 1
Perkenalan ... 3
SQL Server ... 4
Struktur Basis Data ... 5
SELECT ... 7
Sintak ... 7
Select_list ... 8
Mengambil data dari tabel (data retrieval) ... 8
Menyaring data ... 9
Pengurutan data ... 12
Operator Aritmatika ... 13
Agregasi dan Pengelompokan Data ... 14
Multiple-table Query ... 16 Join ... 16 Subquery ... 20 SQL Function ... 21 Transaction ... 23 Penambahan data ... 23 Modifikasi data... 24 Penghapusan data ... 25 Latihan ... 26
Tipe Data dan Variabel ... 27
Script ... 29
Script Block ... 30
Tipe Data ... 30
Numeric ... 31 Temporal ... 32 Binary ... 32 Boolean ... 33 Other ... 33 Variabel ... 34 Deklarasi Variabel ... 34
Memberi Nilai pada Variabel ... 35
System Variable ... 36
Operasi pada Variabel ... 38
Latihan ... 39
Control-flow Statement ... 41
Percabangan... 43
Macam-macam Bentuk Percabangan... 45
Perulangan ... 47
Latihan ... 53
Cursor ... 55
Membuat dan Menggunakan Cursor ... 57
Contoh Penggunaan Cursor ... 60
Implicit Cursor ... 61
Nested Cursor ... 61
Latihan ... 65
Prosedur dan Fungsi ... 67
Prosedur ... 69
Membuat Prosedur ... 70
Parameter dalam Prosedur ... 71
Pemeliharaan Data ... 74 Fungsi ... 75 User-Defined Function ... 76 Deterministic Function ... 79 Latihan ... 81 Trigger ... 83 DML Trigger ... 86 Membuat DML Trigger ... 90 Latihan ... 93
Connection dan Recordset ... 95
ADO.NET ... 97
Memahami Arsitektur ADO.NET ... 98
Connections ... 100
Bagaimana cara kerjanya ... 102
Membuat session ... 103
Security and Password dalam SqlConnection ... 104
Connection String Parameters untuk SqlConnection ... 104
Recordset ... 105 Pengambilan Data... 106 Manipulasi Data ... 108 Latihan ... 110 Dataset ... 113 Dataset ... 115 Membuat Dataset ... 116
Bagaimana cara kerjanya ... 118
Manipulasi Data ... 121
Read ...122
Update ...123
Delete...124
Kontrol pada Transaksi ...124
Pencarian dan Penyortiran Data ...125
DataView...128
Dataset dan Data Source ...130
DataGridView ...131
Update ...132
BAB I
SQL (sekuel)
Sub-Materi:
Select
Join
Subquery
DML
Bab I
SQL (sekuel)
Sub-Materi: Select Join Subquery DMLPerkenalan
Matakuliah Praktikum Pemrograman Basis Data (PBD) merupakan MK praktek dari matakuliah PBD. Matakuliah ini mengintegrasikan pemrograman di sisi server (basis data) dan pemrograman di sisi client. Karena itulah matakuliah ini mempunyai 2 matakuliah prasyarat, yaitu (1) matakuliah Sistem Basis Data (SBD) dan (2) matakuliah Bahasa Pemrograman (BPro).
Dalam matakuliah SBD, materi yang dibahas meliputi desain dan pembuatan basis data mengikuti normalisasi, penyimpanan data, dan data retrieval (temu kembali data). Penyimpanan data dalam basis data menggunakan sintak-sintak data manipulation language (DML), sedangkan untuk data retrieval menggunakan perintah SELECT. Keduanya dalam dunia programming disebut sebagai CRUD (Create-Read-Update-Delete). Semua materi tersebut merupakan bagian dari pembelajaran dasar structured
query language (SQL – baca sekuel), yaitu bahasa native bagi
basis data. Native ibarat bahasa inggris bagi orang Amerika, dan bahasa indonesia bagi orang Indonesia.
Pemrograman disisi basis data lebih umum disebut dengan SQL Programming, yaitu bahasa
pemrograman yang memakai SQL sebagai dasar pemrogramannya. Karena menggunakan SQL, maka dari itu, pembahasan pada pertemuan 1 ini difokuskan pada penyegaran kembali (refresh) materi-materi SQL.
Sedangkan dalam matakuliah BPro, materi yang dibahas meliputi
variable, control-flow statement, serta procedure and function.
SQL Programming, sesuai dengan namanya, juga menggunakan semua materi dalam matakuliah BPro. Jadi pembelajaran pada matakuliah Praktikum PBD seutuhnya merupakan pemakaian kembali dan kelanjutan dari matakuliah SBD dan BPro.
Selain SQL Programming, juga ada pemrograman di sisi client. Fokus utamanya adalah bagaimana melakukan komunikasi dengan basis data serta menerapkan SQL dan SQL Programming dalam aplikasi client.
SQL Server
Database Management System (DBMS) yang dipakai dalam matakuliah Praktikum PBD adalah SQL Server 2005 Express Edition. Selain ringan dan bebas dipakai, versi ini juga memiliki beberapa fitur penting seperti keamanan. Namun SQL Server Management Studio, sebuah kakas bantu untuk mengelola lingkungan SQL Server, tidak ada dalam paket instalasi SQL Server 2005 Express Edition. Tool ini harus didownload sendiri di situs resminya. Di laboratorium komputer, telah di-install SQL Server 2005 Express Edition beserta Management Studio-nya.
Langkah pertama yang dilakukan adalah membuat basis data yang akan dipakai selama 8x minggu praktikum. Untuk script
pembuatan basis data dapat diunduh di
http://192.168.100.3/latihan/132/BDS/create table.sql. Setelah diunduh, ikuti langkah-langkah berikut:
1. Buka SQL Server Management Studio Express Edition (SSMSEE) melalui Start Menu
2. Login:
Isi “Server name:” dengan “.\SQLEXPRESS” – pilih mode “Windows Authentication” – klik tombol Connect.
3. Menu File – Open – File atau Ctrl+O. Buka script yang telah diunduh. Lalu jalankan script melalui tombol
4. Setelah dieksekusi, ada 3 proses yang terjadi: - Pembuatan basis data beserta file-nya
- Pembuatan tabel-tabel beserta constraint-nya - Pengisian data-data kedalam tabel
Struktur Basis Data
Basis data dibangun oleh database schema. Dalam database
schema inilah obyek-obyek basis data dibangun. Setiap schema
diberikan ke satu atau lebih user (atau login). Dalam matakuliah Praktikum PDB, hanya dibahas obyek-obyek antara lain Table, Function, Stored Procedure dan Trigger. Pertemuan pertama difokuskan pada Table serta bagaimana DML dan SELECT pada Table.
Database schema yang dipakai untuk TUGAS PRAKTIKUM selama
8x pertemuan dapat dilihat pada Gambar 1.1, yaitu Putra Jaya. Sedangkan untuk LATIHAN PRAKTIKUM dapat dilihat pada Gambar 1.2, yaitu PBD . Setiap tabel saling berelasi, karena itulah dinamakan basis data relasional. Tabel yang dihubungkan dengan tanda kunci merupakan tabel yang ber-primary key, atau
parent table (tabel induk). Sedangkan tabel yang tidak memiliki
tanda kunci merupakan tabel yang ber-foreign key, atau child
table (tabel anak).
Gambar 1.1 Database schema Putra Jaya
Tabel terdiri dari row (baris) dan column (kolom). Setiap baris merepresentasikan data, sedangkan kolom merepresentasikan struktur data yang disimpan. Struktur ini dibagi menjadi 2 bagian yaitu tipenya dan panjangnya. Sebagai contoh, kolom NAMAKONSUMEN pada tabel KONSUMEN mempunyai tipe VARCHAR untuk menyimpan karakter dengan panjang semaksimalnya 100 karakter. Dengan perbedaan tipe dan panjang, otomatis akan berpengaruh pada cara kita dalam melakukan DML dan SELECT.
Gambar 1.2 Database schema PBD
SELECT
SELECT merupakan salah satu pondasi dalam SQL Programming. SELECT digunakan untuk menampilkan data, terlebih untuk mencari informasi dalam kumpulan data.
Sintak
SELECT dibagi kedalam 6 komponen, antara lain:
1. SELECT. Diikuti oleh <select_list>, dapat berupa literal_value atau column_list atau asterisk (*).
2. FROM. Diikuti oleh <table_name> sesuai dengan column_list. Jadi jika ada data yang diambil dari kolom tertentu, harus diketahui kolom tersebut diambil dari tabel mana. Tabel pada FROM dapat diikuti dengan alias untuk mempermudah penulisan khususnya ketika join dan subquery.
3. WHERE. Diikuti oleh kondisi secara umum.
4. GROUP BY. Diikuti oleh <select_list>. Bagian ini muncul ketika ada fungsi-fungsi agregasi.
5. HAVING. Diikuti oleh kondisi hanya untuk fungsi-fungsi agregasi.
6. ORDER BY. Diikuti oleh <select_list>.
Kode 1.1
SELECT <select_list> [FROM <table_name>]
[WHERE <kondisi1> [AND/OR <kondisi2>]] [GROUP BY <select_list>]
[HAVING <kondisi1> [AND/OR <kondisi2>]] [ORDER BY <select_list>]
Select_list
Merupakan daftar select. Dapat berupa literal value atau
column_list. Perhatikan contoh berikut: Kode 1.2
SELECT 1, 'STIKOM Surabaya';
Contoh pada Kode 1.2 mengembalikan satu baris data dengan dua kolom. <select_list> dalam contoh tersebut tidak menggunakan data yang tersimpan dalam tabel, dan inilah yang disebut sebagai literal_value. Penggunaan konkrit literal_value umumnya digunakan bersama dengan column_list untuk menghasilkan sebuah expression.
Mengambil data dari tabel (data retrieval)
Fungsi utama dari SELECT adalah untuk pengambilan data (data
retrieval) yang tersimpan dalam (beberapa) tabel. Perhatikan
contoh berikut:
Kode 1.3
SELECT 1 '1', 'STIKOM Surabaya' STIKOM, nim, nim + '@stikom.edu' EMAIL
FROM mahasiswa;
Hasil:
1 STIKOM Nim EMAIL
1 STIKOM Surabaya 05390102208 [email protected] 1 STIKOM Surabaya 05410104001 [email protected]
.. … … …
Contoh pada Kode 1.3 menampilkan seluruh data di tabel Mahasiswa. Tanpa kata kunci FROM, query tersebut menghasilkan error.
Muncul pertanyaan, bagaimana jika ada data yang sama, tetapi ingin ditampilkan satu kali? Misal, kebutuhan untuk mengetahui siapa saja konsumen yang telah melakukan pembelian. Perhatikan contoh berikut:
Kode 1.4
SELECT nim
FROM nilai;
Hasil dari query pada Kode 1.4 tersebut adalah banyak NIM yang sama. Untuk mengeliminasi data-data yang sama, dibutuhkan DISTINCT. Dengan mengimplementasikan DISTINCT, query pada Kode 1.4 diubah menjadi seperti ini:
Kode 1.5
SELECT DISTINCT nim
FROM nilai; Menyaring data
Tidak semua data yang ada pada tabel, ingin ditampilkan. Terlebih ketika tabel terbagi kedalam banyak kolom dengan jumlah data yang sangat besar. Padahal data yang diambil hanyalah sebuah data, contohnya data mahasiswa milik Tegar Heru Susilo. Untuk efektifitas query, perlu ditambahkan kata kunci WHERE. Perhatikan contoh berikut:
Kode 1.6
SELECT *
FROM mahasiswa
WHERE nama = 'Alif';
Hasil:
nim nama alamat kota jns_kel.. sts_nikah
Penyaringan data membutuhkan kondisi. Ada 3 bagian dalam penulisan kondisi, antara lain (1) expression, (2) operator pembanding, dan (3) value.
Sedangkan nilai yang dihasilkan dari kondisi ini ada 3 macam, yaitu TRUE, FALSE, dan UNKNOWN. TRUE berarti kondisi menghasilkan nilai benar, FALSE berarti kondisi menghasilkan nilai salah, sedangkan UNKNOWN berkaitan dengan nilai NULL (secara default bernilai FALSE, kecuali menggunakan operator IS).
Dari 3 bagian kondisi, yang perlu diperhatikan adalah operator pembanding. Operator pembanding menentukan nilai akhir kondisi (TRUE, FALSE, atau UNKNOWN). Dalam kode 1.6, operator pembanding yang digunakan adalah ‘sama dengan’ (=). Selain ‘sama dengan’, beberapa operator pembanding lainnya dapat dilihat pada Tabel 1.1.
Tabel 1.1 Operator Pembanding
Operator Keterangan
= Sama dengan > Lebih besar dari
>= Lebih besar sama dengan < Kurang dari
<= Kurang dari sama dengan <> atau != Tidak sama dengan BETWEEN .. AND .. Diantara 2 nilai
IN (set) Cocok dengan salah satu diantara daftar nilai LIKE Cocok dengan pola karakter
IS NULL Sama dengan NULL
Beberapa contoh penggunaan operator pembanding dapat dilihat pada query berikut:
Kode 1.7
SELECT *
FROM mahasiswa
WHERE nim BETWEEN '05390102208' AND '05410104190';
WHERE nim IN ('05390102208','05410104190');
SELECT * FROM mahasiswa
WHERE naam LIKE '%amb%';
SELECT * FROM mahasiswa
WHERE alamat IS NULL;
Penggunaan operator BETWEEN dan IN pada Kode 1.7 menghasilkan data yang sama. Sedangkan untuk LIKE akan menghasilkan seluruh mahasiswa yang namanya mempunyai kata amb di tengah-tengahnya. Sedikit berbeda dengan penggunaan operator lain yang membutuhkan data yang presisi, LIKE menggunakan wildcards untuk mencari data yang mirip dengan data yang dicari. Wildcards ini dibagi menjadi 2 yaitu (1) % untuk merepresentasikan banyak karakter, dan (2) _ untuk merepresentasikan satu karakter. Contoh penggunaan _ bisa dilihat pada contoh berikut:
Kode 1.8
SELECT *
FROM mahasiswa
WHERE nama LIKE '_e%';
Pada Kode 1.8, query akan menghasilkan seluruh data mahasiswa yang karakter kedua namanya memiliki huruf e. Bagaimana jika kondisi yang dibutuhkan berjumlah lebih dari satu? Jawabannya adalah dengan menggunakan operator logika untuk memisahkan kondisi-kondisi tersebut. Operator logika memakai tabel kebenaran sebagai acuan dalam pembentukan nilai akhir seluruh kondisi. Perhatikan contoh berikut:
Kode 1.9
SELECT nim, nama, kota
FROM mahasiswa
WHERE kota='Surabaya' and nim='05390102208';
Hasil:
nim nama kota
Ada 3 macam operator logika yaitu AND, OR dan NOT. Untuk AND, nilai TRUE muncul jika semua kondisi TRUE. Sedangkan untuk OR, nilai FALSE muncul jika semua kondisi FALSE. Sedangkan untuk NOT, merupakan kebalikan dari nilai akhir kondisi.
Ada prioritas dalam penggunaan kondisi seperti yang terlihat pada Tabel 1. 2, namun prioritas ini dapat diabaikan dengan menggunakan parentheses (tanda kurung).
Tabel 1. 2 Prioritas Penggunaan Operator Pembanding
Prioritas Keterangan
1 NOT
2 AND
3 OR
Pengurutan data
Dalam visualisasi informasi, hasil pemrosesan data dapat lebih mudah dibaca ketika data tersebut dapat diurutkan berdasarkan nilai tertentu. Sebagai contoh ketika seorang dosen ingin melihat 10 nilai UAS terbesar. Perhatikan contoh berikut:
Kode 1.10
SELECT nim, uas
FROM nilai
WHERE nid='010103';
Cara seperti ini akan menampilkan data nilai dengan urutan yang sama seperti urutan data ketika dimasukkan. Untuk dapat melihat urutan ranking nilai UAS, cukup dengan menambahkan kata kunci ORDER BY. Pengurutan ini bisa dibentuk dari kecil ke besar (ASCending) atau sebaliknya (DESCending). Sehingga query pada Kode 1.10 berubah menjadi:
Kode 1.11
SELECT nim, kode_mk, uas
FROM nilai
WHERE nid='010103'
ORDER BY uas DESC;
nim kode_mk uas 05390102208 MK-001 80 06390102666 MK-001 40 07390102802 MK-001 20
Operator Aritmatika
Dalam menampilkan data, ada kalanya data yang ditampilkan merupakan hasil perhitungan missal mencari nilai total penjualan setelah PPn 10%. Untuk mendukung perhitungan ini, diperlukan operator aritmatika. Ada 4 macam operator aritmatika, yang dapat dilihat pada Tabel 1.3.
Tabel 1.3 Operator Aritmatika
Operator Aritmatika Keterangan
+ Untuk operasi penambahan. Jika + ini dipakai untuk tipe data karakter, menjadi operasi penggabungan karakter.
- Untuk operasi pengurangan. * Untuk operasi perkalian. / Untuk operasi pembagian.
Contoh penggunaan operator aritmatika dapat dilihat pada query berikut:
Kode 1.12
SELECT 1 + 1;
SELECT 'Tegar' + ' ' + 'Heru';
SELECT 5 – 1;
SELECT uas * 0.3
FROM nilai;
SELECT tugas / 4
Agregasi dan Pengelompokan Data
Dalam pemrosesan data mentah menjadi data statistik, diperlukan fungsi-fungsi yang dapat meng-agregasi data-data tersebut. Fungsi-fungsi ini meliputi SUM, MIN, MAX, COUNT, dan AVG. SUM untuk menghitung jumlah nilai data, MIN untuk menentukan data paling kecil, MAX untuk menentukan data paling besar, COUNT untuk menghitung jumlah data, dan AVG untuk menghitung rata-rata nilai data.
Dengan melihat pola data yang ada untuk kemudian dilakukan agregasi dan pengelompokan, visualisasi informasi dapat dilakukan dengan mudah. Sebagai contoh, untuk menampilkan rata-rata nilai UAS, nilai UAS terrendah, dan nilai UAS tertinggi dapat dilihat pada query berikut:
Kode 1.13
SELECT AVG(uas) rata_nilai,
MAX(uas) nilai_tertinggi,
MIN(uas) nilai_terendah
FROM nilai;
Hasil:
rata_nilai nilai_tertinggi nilai terendah 49.41 90 0
Penggunaan GROUP BY mampu memilah data yang demikian besar kedalam kelompok-kelompok data untuk mendapatkan informasi-informasi yang lebih spesifik. Sebagai contoh, untuk menampilkan rata-rata nilai UAS, nilai UAS terrendah, dan nilai UAS tertinggi dari seluruh mata kuliah dapat dilihat pada query berikut:
Kode 1.14
SELECT kode_mk, AVG(uas) rata_nilai,
MAX(uas) nilai_tertinggi,
MIN(uas) nilai_terendah
FROM nilai
Hasil:
kode_mk rata_nilai nilai_tertinggi nilai terendah MK-001 46.66 80 20
MK-002 43.33 70 0 MK-003 54.00 90 0 MK-102 65.00 80 50 MK-103 42.00 80 20
Untuk dapat menggunakan kata kunci GROUP BY dengan baik, ada beberapa aturan dalam pemakaian GROUP BY yang harus diperhatikan. Aturan-aturan tersebut antara lain:
1. Jika ada agregasi (SUM, MIN, MAX, COUNT, AVG) dalam <select_list>, kolom tanpa agregasi harus terdaftar dalam GROUP BY.
2. Dengan menggunakan WHERE, kita bisa mengabaikan baris-baris tertentu sebelum dilakukan agregasi dan pengelompokan.
3. Isi dari GROUP BY adalah kolom, bukan alias.
Dari data hasil Kode 1.14, kita bisa melakukan penyaringan data misal hanya untuk mata kuliah yang rata-rata nilai UAS-nya dibawah 50. Hasil perubahan query pada Kode 1.14 untuk proses penyaringan, dapat dilihat pada query berikut:
Kode 1.15
SELECT kode_mk, AVG(uas) rata_nilai,
MAX(uas) nilai_tertinggi,
MIN(uas) nilai_terendah
FROM nilai
GROUP BY kode_mk
HAVING AVG(uas)>50;
Hasil:
kode_mk rata_nilai nilai_tertinggi nilai terendah
MK-003 54 90 0
Penyaringan merupakan kondisi. Untuk memberikan kondisi pada fungsi agregasi, dibutuhkan kata kunci HAVING. HAVING mempunyai cara kerja yang sama dengan WHERE. Namun memiliki fungsi yang berbeda. Sehingga jika pada Kode 1.15 diberi kondisi hanya untuk MK-003, maka query menjadi seperti berikut ini:
Kode 1.16
SELECT kode_mk, AVG(uas) rata_nilai,
MAX(uas) nilai_tertinggi,
MIN(uas) nilai_terendah
FROM nilai
WHERE kode_mk = 'MK-003'
GROUP BY kode_mk
HAVING AVG(uas)>50;
Hasil:
kode_mk rata_nilai nilai_tertinggi nilai terendah
MK-003 54 90 0
Multiple-table Query
Data-data yang tersimpan dalam basis data, tersebar kedalam beberapa tabel. Tabel-tabel ini dihubungkan dengan yang namanya referential constraint, yaitu hubungan antara foreign
key dan primary key.
Karena itulah, untuk mendapatkan informasi yang tersebar, dibutuhkan metode untuk menggabungkan property tabel-tabel tersebut. Metode yang digunakan ada 2 macam, yaitu join dan
subquery.
Perbedaannya sederhana, join menggunakan satu SELECT, sedangkan subquery menggunakan dua atau lebih SELECT (umumnya dikatakan sebagai SELECT within a SELECT).
Join
Bentuk join pertama kali adalah menggunakan kata kunci WHERE untuk melakukan penggabungan tabel. Jadi tabel-tabel yang
ingin digabungkan ditulis dalam kata kunci FROM, sedangkan penggabungannya ditulis dalam WHERE. Sintak untuk join menggunakan WHERE adalah sebagai berikut:
Kode 1.17
SELECT <select_list>
FROM <table1>, <table2> [, ...] WHERE <table1.PK = table2.FK> [AND ...] Contoh:
Kode 1.18
SELECT m.nama, n.kode_mk, n.uas
FROM mahasiswa m, nilai n
WHERE m.nim=n.nim;
Hasil:
nama kode_mk uas
Cinta MK-001 80 Cinta MK-002 0 Alif MK-002 70
… … …
Gala MK-103 40
Query pada Kode 1.18 menghasilkan sejumlah baris yang
merupakan kombinasi jumlah data antara mahasiswa dan nilai. Dari operator pembanding yang digunakan, sudah jelas bahwa
query ini menghasilkan baris yang mempunyai data yang sama
diantara dua table (produk dan kategori). Join jenis ini dapat juga disebut dengan equijoin.
Perkembangan SQL ANSI sejak tahun 1990-an, menambahkan model baru dalam join, yaitu menggunakan hanya kata kunci FROM sebagai referensi utama baik untuk tabel maupun untuk penggabungannya. Sintaknya adalah sebagai berikut:
Kode 1.19
SELECT <select_list>
FROM <table1> JOIN <table2>
ON < table1.PK = table2.FK> [[AND ...] JOIN ...];
Contoh:
Kode 1.20
SELECT m.nama, n.kode_mk, n.uas
FROM mahasiswa m JOIN nilai n
ON m.nim = n.nim;
Antara model lama dengan model baru, tidak ada perbedaan signifikan pada performa dan execution plan untuk data-data sederhana, namun berbeda halnya dengan data-data komplek dengan ruang lingkup yang besar.
Ada 2 tipe join, yaitu inner join yang lebih menekankan pada keberadaan data yang sama, dan outer join.
Inner Join
Tujuan utama dari inner join adalah menyamakan nilai baris pada sebuah tabel dengan tabel lain menggunakan kolom yang sama (tipe dan panjang [jika ada]). Jika salah satu kolom tidak memiliki kesamaan nilai atau tidak mempunyai nilai sama sekali, maka baris ini tidak akan ditampilkan dalam hasil query. Jadi, masih sama dengan equijoin.
Outer Join
Dalam contoh equijoin, data dengan nama mahasiswa Indah, tidak ada. Hal ini dikarenakan Indah memang tidak mempunyai nilai. Cara yang dapat dipakai untuk menampilkan data Indah tersebut tanpa nilainya adalah dengan menggunakan outer join. Pengubahan sintak join menjadi outer join dapat dilihat pada Kode 1.21:
Kode 1.21
SELECT <select_list>
FROM <tabel1 sebagai kiri> <LEFT/RIGHT> [OUTER] JOIN <tabel2 sebagai kanan>
ON <table1.PK = table2.FK> [AND ...]; Dalam sintak tersebut, ada LEFT/RIGHT. Penggunaan LEFT akan memproses seluruh data yang ada pada tabel sebelah kiri kemudian dilanjutkan dengan data yang sama pada tabel sebelah
kanan. Artinya, seluruh data pada tabel kiri ditampilkan semua, baru setelah itu data yang sama di tabel sebelah kanan, ditampilkan. Untuk data yang tidak ada di tabel sebelah kanan, ditampilkan kata NULL. Sedangkan RIGHT bekerja sebaliknya. Dengan demikian, outer join fokus pada nilai yang tidak sama antara kolom-kolom yang sama (tipe dan panjang [jika ada]) pada tabel yang di-join-kan. Nilai yang tidak sama, direpresentasikan oleh NULL. Sehingga dari contoh inner join, solusinya adalah mengubah query menjadi seperti berikut:
Kode 1.22
SELECT m.nama, n.kode_mk, n.uas
FROM mahasiswa m LEFT JOIN nilai n
ON m.nim = n.nim; Hasil:
nama kode_mk Uas
Cinta MK-001 80 Cinta MK-002 0
… … …
Indah NULL NULL
Gala MK-003 0 Gala MK-103 40 Non-Equijoin
Berbeda dengan equijoin yang selalu memakai operator ‘sama dengan’, non-equijoin memakai operator selain ‘sama dengan’. Contoh permasalahan misalnya kita ingin mencari mahasiswa dengan angkatan lebih muda dari Entin. Perhatikan query berikut:
Kode 1.23
SELECT entin.nim, m.nim, m.nama
FROM mahasiswa m, mahasiswa entin
WHERE LEFT(m.nim,2) > LEFT(entin.nim,2) AND entin.nama='Entin';
Hasil:
Namaproduk hargapersatuan
Kemeja Lengan Panjang 25000.00 Jepit Rambut 10000.00
Subquery
Subquery merupakan query didalam query. Umumnya, subquery
ini dipakai untuk mencari data yang belum diketahui. Penggunaan query didalam query ini umumnya menjadi bagian dari kondisi. Sintak subquery adalah sebagai berikut:
Kode 1.24 SELECT <select_list> FROM <tabel> WHERE <column> = (SELECT <single_column> FROM <tabel> WHERE <kondisi>);
Namun, tidak menutup kemungkinan penggunaan subquery sebagai bagian dari data. Dalam artian query didalam kata kunci SELECT ataupun didalam kata kunci FROM. Query jenis ini biasa disebut sebagai inline view. Sebagai contoh penggunaan
subquery, perhatikan contoh berikut: Kode 1.25
SELECT nim, nama
FROM mahasiswa
WHERE LEFT(nim,2) =
(SELECT LEFT(nim,2)
FROM mahasiswa
WHERE nama='Entin');
Kode 1.25 merupakan versi subquery dari Kode 1.23. Menghasilkan data yang sama namun dengan solusi yang berbeda. Solusi subquery pada Kode 1.25 mencari terlebih dahulu angkatan si Entin. Hasil dari pencarian ini digunakan sebagai acuan untuk main query.
SQL Function
Fungsi-fungsi dalam SQL (bukan User Defined Function) lebih dikhususkan pada masing-masing penyedia layanan basis data. Secara umum, fungsi-fungsi dalam SQL Server dapat dibagi menjadi:
1. Aggregation
Mengembalikan nilai tunggal yang merepresentasikan sebuah agregasi dari sejumlah nilai.
Macam: AVG(), MAX(), COUNT(), MIN(), SUM() 2. Conversion
Mengubah nilai dari satu tipe data ke tipe data lain. Selain itu konversi digunakan juga untuk mengaplikasikan karakteristik pada format date, time, dan numeric.
Macam: CAST(), CONVERT() 3. String Manipulation
Digunakan untuk mengubah, mengganti, dan memanipulasi karakter.
Macam: LEN(), SUBSTRING(), UPPER(), LOWER(), LEFT(), RIGHT(), REPLACE()
4. Mathematical
Digunakan untuk operasi matematis, mulai dari algebra, trigonometri, statistik, peramalan, dan bahkan operasi finansial.
Macam: CEILING(), FLOOR(), ROUND(), POWER(), SQRT() 5. Date and Time
Mengubah porsi date dan time, komparasi dan manipulasi nilai-nilai date/time.
Macam: GETDATE(), DATEPART(), DATEADD(), DATEDIFF() Beberapa contoh penggunaan SQL Function dapat dilihat pada Kode 1.26 . CONVERT digunakan untuk mengubah nilai 1000 dari bentuk numeric ke bentuk varchar agar bisa digabungkan dengan kata Rupiah. CEILING, FLOOR, dan ROUND digunakan masing-masing untuk pembulatan keatas, pembulatan kebawah, pembulatan berdasarkan nilai dibelakang koma (sesuai dengan tingkat presisi yg dipakai). GETDATE digunakan untuk mengambil
tanggal sistem. DATEPART digunakan untuk mengambil nilai bagian tertentu dalam tanggal seperti tahun, bulan, hari, jam, menit. DATEADD digunakan untuk menambahkan nilai tertentu pada bagian tertentu dalam tanggal. Sesuai contoh, DATEADD menambahkan nilai 2 pada tahun sekarang, sehingga nilai yang dihasilkan adalah 2016.
Kode 1.26
SELECT CONVERT(VARCHAR, 1000) + ' Rupiah.';
SELECT LEN(nama),
SUBSTRING(nama, 5, 2), UPPER(nama), LOWER(nama), LEFT(nama, 5), RIGHT(nama, 5) FROM mahasiswa;
SELECT CEILING(5.25), FLOOR(5.25),
ROUND(5.25, 0), POWER(5,2), SQRT(25);
SELECT GETDATE(),
DATEPART('yyyy', GETDATE()),
DATEADD('yyyy', 2, GETDATE());
Satu lagi fungsi yang bisa dipakai untuk melakukan conditional
expression (untuk menggantikan peran IF..ELSE dalam programming), yaitu CASE. Sintak CASE dapat dilihat pada kode berikut:
Kode 1.27
CASE
WHEN <kondisi> THEN <statement> [WHEN <kondisi> THEN <statement>] [WHEN <kondisi> THEN <statement>] ...
ELSE <statement> END
Pada Kode 1.27, kondisi dituliskan dalam kata kunci WHEN dan apa yang dilakukan (jika kondisi bernilai TRUE) dituliskan dalam kata kunci THEN. Jika ada kondisi lain, dituliskan dalam kata kunci ELSE.
Masih banyak fungsi-fungsi lain yang diberikan oleh SQL Server untuk membantu dalam pengolahan data.
Transaction
Mungkin lebih umum jika disebut sebagai DML atau Data
Manipulation Language. Lebih umum lagi jika disebut dalam
bentuk insert, update, delete. Bersama dengan SELECT, transaction secara ilmiah dikenal sebagai CRUD (Create – Read –
Update – Delete).
Sederhananya, transaksi adalah sebuah mekanisme untuk memastikan bahwa data masuk sesuai dengan tempatnya. Tentunya dengan beberapa aturan. Aturan-aturan ini didefinisikan secara khusus melalui constraint, relationship, dan tipe data. Dari aturan ini, sistem yang menentukan apakah transaksi sukses atau tidak (dengan mengembalikan nilai kesalahan).
Penambahan data
Sebelum melakukan penambahan data, perlu diperhatikan hal-hal sebagai berikut:
Kolom mana yang membutuhkan nilai. Kolom mana yang mempunyai constraint.
Kolom mana yang diatur oleh basis data melalui fungsi. Kolom mana yang mempunyai nilai default atau yang
memperbolehkan nilai NULL. Apa tipe data kolom tujuan.
Untuk menambahkan data, diperlukan insert. Sintak insert dapat dilihat pada Kode 1.28.
Kode 1.28
INSERT INTO <tabel>[(<column_list>)] VALUES (<value_list>);
Pada Kode 1.29, <column_list> tidak diberikan dengan asumsi bahwa data dimasukkan kedalam seluruh kolom. Untuk menambahkan data dengan mengabaikan beberapa kolom tabel tujuan, bisa mengikuti contoh pada Kode 1.30.
Kode 1.29
INSERT INTO mahasiswa
VALUES ('08410104003', 'Jenny',
'Jl. Krembangan 50', 'Surabaya',
'W', 'B');
Kode 1.30
INSERT INTO mahasiswa
(nim, nama)
VALUES ('08410104003', 'Jenny');
Bagaimana jika data yang dimasukkan adalah data dari tabel lain? Untuk menjawab pertanyaan ini, SQL Server menggunakan perintah INSERT INTO..SELECT.
Modifikasi data
Modifikasi data diperlukan ketika terjadi perubahan pada data orisinilnya. Untuk memodifikasi data, dibutuhkan perintah
update. Perintah ini dapat memodifikasi satu, banyak, atau
semua baris data dalam sebuah tabel. Jumlah data yang dimodifikasi bergantung pada kondisi (kriteria) yang diberikan dalam query update. Sintak update dapat dilihat pada kode berikut:
Kode 1.31
UPDATE <tabel>
SET <kolom1> = <nilai1> [,<kolom2> = <nilai2>] WHERE <kondisi1>;
Perhatikan contoh berikut:
Kode 1.32
UPDATE mahasiswa
SET sts_nikah = 'M'
WHERE nim = '08410104003';
Kode 1.32 mencoba memodifikasi data mahasiswa. Modifikasi dilakukan untuk mengubah status nikah mahasiswa, dengan nim 08410104003, dari yang awalnya B menjadi M. Jadi bisa dilihat bahwa nilai yang diberikan pada kata kunci SET merupakan nilai baru.
Penghapusan data
Ada kalanya data yang sudah ada tidak diperlukan lagi, sehingga data tersebut harus dihapus dari tabel. Untuk menghapus data, digunakan perintah delete. Perintah ini mempunyai perlakuan yang sama seperti update. Yang perlu diperhatikan disini adalah adanya referential constraint. Dalam arti kata lain, data tidak dapat dihapus ketika data tersebut dipakai sebagai data acuan dalam tabel lain (melalui fitur foreign key). Sintak delete dapat dilihat pada kode berikut:
Kode 1.33
DELETE <tabel> WHERE <kondisi1>;
Contoh sederhananya adalah sebagai berikut:
Kode 1.34
DELETE mahasiswa
WHERE nim = '08410104003';
Kode 1.34 mencoba untuk menghapus data mahasiswa dengan nim 08410104003. Penghapusan bisa sukses jika data mahasiswa tersebut tidak dipakai di tabel Nilai.
Latihan
1. Tampilkan seluruh data mahasiswa.
2. Tampilkan data mahasiswa yang tinggal di kota Surabaya. 3. Tampilkan nama mahasiswa yang mempunyai huruf a atau
huruf A.
4. Tampilkan nama mahasiswa yang huruf kedua terakhir dari namanya mempunyai huruf n.
5. Tampilkan nim, nama dan nilai tugas mahasiswa. 6. Tampilkan 3 karakter terakhir dari nama mahasiswa.
7. Buat email berdasarkan nama mahasiswa dan gabungkan dengan @gmail.com.
8. Hitung jumlah mahasiswa masing-masing dosen. Ambil datanya dari tabel nilai.
9. Tampilkan nama mahasiswa dan nama dosen untuk dosen dengan nid 010306.
10. Tampilkan mahasiswa yang mempunyai dosen yang sama dengan Entin.
11. Tampilkan mahasiswa yang tidak memiliki nilai. 12. Masukkan data mahasiswa berikut ini:
NIM: nim Anda
Nama: nama lengkap Anda Alamat: alamat rumah/kos Anda Kota: sesuai alamat
Jns_kelamin: jenis kelamin Anda Sts_nikah: M
13. Ubah status nikah Anda dari M menjadi B. 14. Hapus data Anda.
BAB II
Tipe Data dan Variabel
Sub-Materi:
Script dan Script Block
Tipe Data
Variabel
Bab II
Tipe Data dan Variabel
Sub-Materi: Script dan Script Block Tipe Data Variabel
Jika pada Bab 1 membahas tentang query atau yang disebut sebagai SQL (sekuel), maka mulai Bab 2 sampai dengan Bab 6 materi yang dibahas adalah Procedural Language – Structured Query Language (PL/SQL). PL/SQL merupakan pemutakhiran dari SQL untuk melakukan programming (selayaknya bahasa pemrograman seperti basic, dan java) didalam basis data. Dalam SQL Server, istilah PL/SQL digantikan oleh Transact-SQL atau T-SQL.
Script
Sadar atau tidak, selama pembelajaran pada Pertemuan 1, kita sudah membuat script, yaitu satu statement dalam satu script. Hal yang mengasyikkan disini adalah ketika banyak statement disatukan kedalam sebuah script dengan tujuan tunggal (unified
goal). Dan inilah definisi script yang sebenarnya dan yang akan
kita gunakan selama pembelajaran.
Karena tujuan tunggalnya, script umum dikatakan sebagai sebuah unit proses. Artinya, seluruh perintah dalam script dijalankan atau tidak sama sekali. Script menggunakan fungsi-fungsi (sistem dan defined) serta variabel (sistem dan
user-defined) dan control-flow untuk melengkapi proses yang terjadi.
Contoh script dapat dilihat pada Kode 2.1. Pada Kode 2.1 dapat dijelaskan beberapa hal berikut ini, antara lain:
1. @nilaimax adalah variabel. Variabel akan dibahas di sub-bab selanjutnya.
2. MAX(iddepartemen) adalah salah satu system function (aggregate function). Function secara umum dibahas di Bab 1, secara mendetil akan dibahas lebih pada Bab 5.
3. @@ROWCOUNT adalah salah satu system variable. System variable akan dibahas lebih lanjut pada sub bab berikutnya. Kode 2.1
DECLARE @nilai NUMERIC;
SET @nilai = (SELECT MAX(uas) FROM nilai);
SELECT @@ROWCOUNT;
SELECT @nilai;
Script Block
Sebagai satu kesatuan unit, script membutuhkan wadah yang disebut sebagai script block. Penulisan script block diawali dengan kata kunci BEGIN dan diakhiri dengan kata kunci END. Sehingga dari contoh pada Kode 2.1, diubah menjadi:
Kode 2.2
BEGIN;
DECLARE @nilai NUMERIC;
SET @nilai = (SELECT MAX(uas) FROM nilai);
SELECT @@ROWCOUNT;
SELECT @nilai;
END;
Penggunaan kata kunci BEGIN dan END identik dengan penggunaan kurung kurawal {} pada pemrograman JAVA. Tidak ada aturan dalam cara penulisannya, namun penggunaan block ini akan mempengaruhi bagaimana script dibaca, bagaimana script dijalankan, bagaimana variabel diperlakukan, dan lain sebagainya. Penggunaan block akan lebih intens ketika membahas mengenai control-flow, prosedur, fungsi, dan trigger yang semuanya dibahas pada Prakt. PBD.
Tipe Data
Tipe data merupakan bagian dari variabel yang mempengaruhi perilaku variabel. Dengan tipe data ini, bisa ditentukan nilai apa
yang bisa disimpan didalam variabel tersebut. Dan satu variabel hanya bisa diberi satu tipe data.
Ada lima jenis tipe data sesuai dengan SQL-ANSI 1993 yaitu
character string, numeric, temporal, binary, dan boolean. Tidak
semua provider basis data memiliki seluruh jenis tipe data. SQL Server sendiri mempunyai beberapa tipe data khusus untuk memudahkan dalam administrasi basis datanya.
Character String
Atribut seperti nama dan alamat direpresentasikan oleh
character string. Ada 2 macam tipe data untuk merepresentasikan character string, yaitu:
1. CHARACTER(<panjang>)
Atau CHAR(<panjang>) menspesifikasikan karakter dengan panjang yang tetap. Sisa karakter yang tidak terpakai umumnya digantikan oleh padding characters (spasi). 2. CHARACTER VARYING(<panjang>)
Atau VARCHAR(<panjang>) menspesifikasikan karakter dengan panjang yang fleksibel dan maksimum sesuai dengan <panjang>.
String diapit oleh single-quotes (cont.: ‘Tegar’). Single-quote didalam string dibentuk menggunakan dua single-quote (cont.: ‘Jum’’at’).
SQL Server juga memiliki tipe data khusus untuk menyimpan karakter UNICODE UCS-2. Tipe data ini antara lain nchar dan nvarchar.
Numeric
Data-data seperti usia dan gaji disimpan dalam bentuk angka. Penyimpanan dalam bentuk angka menggunakan tipe data
numeric. Ada empat macam tipe data numeric, yaitu:
1. INT, BIGINT, SMALLINT. SMALLINT mempunyai range ±2^15. INT mempunyai range ±2^31. BIGINT mempunyai range ±2^63.
2. NUMERIC(<panjang>, [<presisi>]), DECIMAL(<panjang>, [<presisi>])
Mempunyai panjang karakter dan presisi (angka belakang koma) dengan range ±10^38.
Sebagai contoh: NUMERIC (5,2) mempunyai panjang karakter 5 dengan tingkat presisi 2. Jadi nilai 100,52 bisa disimpan tetapi tidak untuk 1000,1. Nilai 0,00001 disimpan menjadi 0,00.
3. REAL. Tingkat presisi tinggi dengan range 3,40E+38 s.d -1,18E-38 dan +-1,18E-38 s.d +3,40E+38.
4. FLOAT. Tingkat presisi tinggi dengan range 1,79E+308 s.d -2,23E-308; 0; +2,23E+308 s.d +1,79E+308.
Temporal
Temporal merupakan tipe data yang menyimpan tanggal dan waktu yang disesuikan dengan system-timezone (komputer). Sebagai contoh data temporal adalah data tentang tanggal lahir. Ada dua macam tipe data temporal, yaitu:
1. DATETIME. Tipe data ini menyimpan informasi tanggal, waktu atau bahkan keduanya. Dalam SQL Server, tipe data ini menyimpan dengan tingkat akurasi sampai 3,33 milidetik. Sedangkan untuk SMALLDATETIME hanya sampai 1 menit. Dalam tipe data ini, juga terdapat tipe data TIMESTAMP dengan tingkat akurasi sampai dengan 9 digit. 2. INTERVAL. Umumnya digunakan untuk menyimpan periode
seperti garansi. Ada 2 macam yaitu (1) YEAR-MONTH dan (2) DAY-TIME. SQL Server tidak mempunyai tipe data ini.
Binary
Sebenarnya semua data dalam komputer disimpan dalam bentuk biner, tipe data ini didesain untuk menyimpan dijit biner secara sekuensial. Ada tiga macam tipe data biner, yaitu:
1. BIT(<panjang>)
Dikenal sebagai BINARY dalam SQL Server. Panjang maksimum yang bisa diatasi oleh tipe data ini adalah 8.000 bytes.
2. BIT VARYING(<panjang>)
Dikenal sebagai VARBINARY dalam SQL Server. Panjang maksimum yang bisa diatasi oleh tipe data ini adalah 8.000 bytes.
3. BINARY LARGE OBJECT(<panjang>)
Dikenal sebagai VARBINARY (MAX) dalam SQL Server. Panjang maksimum yang bisa diatas oleh tipe data ini adalah 2^31 bytes, sekitar 2 GB (gigabytes).
Biasanya tipe data ini digunakan untuk menyimpan file, mulai dari file dokumen sampai dengan file multimedia. SQL Server mempunyai satu lagi tipe data khusus untuk menyimpan file multimedia yaitu tipe data IMAGE yang dapat menyimpan hingga 2.147.483.647 bytes.
Boolean
Nilai kebenaran dalam SQL direpresentasikan oleh tipe data
boolean. Ada tiga macam nilai dalam boolean yaitu: true, false,
dan unknown. SQL Server tidak mempunyai tipe data semacam ini. Untuk menggantikan tipe data ini, umumnya para software
developer mengganti nilai true dengan angka 1, dan false/unknown dengan angka 0. Sehingga bisa menggunakan tipe
data numeric.
Other
Beberapa tipe data lainnya adalah cursor, table, dan xml. Cursor merupakan obyek basis data yang dipakai untuk memanipulasi data dalam basis row-by-row (cursor dibahas lebih detil pada bab lain). Table merupakan obyek basis data untuk menyimpan data dalam bentuk tabular yang umumnya dipakai untuk return value dari table-valued function. Xml digunakan untuk menyimpan dokumen berformat xml.
Variabel
Fungsi utamanya adalah sebagai penyimpan data untuk sementara. Dalam dunia programming, variabel digunakan untuk menyimpan nilai dan sebagai referensi dalam proses.
Deklarasi Variabel
Cara membuat variabel adalah dengan melakukan deklarasi variabel. Setiap bahasa pemrograman mempunyai cara yang berbeda. Dalam SQL cara pembuatan variabel adalah dengan menuliskan kata kunci DECLARE diikuti dengan nama variabel (sebagai identitas) lalu tipe data (sebagai bentuk nilai yang dapat disimpan oleh variabel tersebut). Sebagai pemisah antar variabel, haurs menggunakan koma. Sintak pembuatan variabel dapat dilihat pada kode berikut: DECLARE
Kode 2.3
DECLARE @<nama_variabel> <tipe_data>[, @<nama_variabel> <tipe_data>[, @<nama_variabel> <tipe_data>]]; Dengan melakukan deklarasi seperti pada DECLARE
Kode 2.3, nilai variabel adalah NULL, apapun tipe datanya, sampai variabel tersebut diberi nilai. Penggunaan DECLARE dapat juga diulang untuk setiap variabel. Sehingga DECLARE Kode 2.3 bisa diubah menjadi:
Kode 2.4
DECLARE @<nama_variabel> <tipe_data>; DECLARE @<nama_variabel> <tipe_data>; DECLARE @<nama_variabel> <tipe_data>; Contoh:
Kode 2.5
DECLARE @jumlah NUMERIC (18, 0);
DECLARE @nama VARCHAR (50);
DECLARE @tgl DATETIME;
DECLARE @gambar IMAGE;
1. Variabel @jumlah bertipe data NUMERIK dengan panjang 18 dan tingkat presisi 0.
2. Variabel @nama bertipe data VARCHAR dengan panjang 50. 3. Variabel @tgl bertipe data DATETIME. Tanpa panjang
karena memang tidak diperlukan.
4. Variabel @gambar bertipe data IMAGE. Tanpa panjang karena sudah memiliki standar panjang maksimum.
Variabel yang dideklarasikan sendiri merupakan user-defined
variable. Sebaliknya, variabel yang dibuat oleh sistem dinamakan system variable. Yang perlu diperhatikan disini adalah penulisan
nama variabel yang mempunyai aturan yang berbeda dimasing-masing provider basis data. Untuk SQL Server, menggunakan @<nama_variabel>. Sedangkan untuk system variable menggunakan @@ sebelum nama variabelnya. Lebih lengkap mengenai system variables akan dijelaskan pada sub-bab System Variable.
Memberi Nilai pada Variabel
Ada dua cara dalam memberikan nilai pada variabel, yaitu: 1. SET
2. SELECT
Tidak menutup kemungkinan jika pemberian nilai variabel dilakukan ketika deklarasi, namun penggunaan ini hanya bisa dilakukan dalam prosedur. Sehingga untuk pemakaian dalam
script pada umumnya, pemberian nilai ini harus dilakukan
setelah deklarasi variabel.
Dari contoh pada Kode 2.6, beberapa hal bisa dijelaskan sebagai berikut:
1. Penggunaan kata kunci SET hanya untuk pemberian nilai pada variabel, secara sederhana. Dalam artian, nilai yang diberikan telah diketahui sebelumnya.
2. Kata kunci SELECT hanya digunakan ketika pengisian variabel menggunakan nilai hasil dari query. Dengan
demikian, dalam satu query dapat dilakukan pemberian nilai pada beberapa variabel sekaligus.
3. Berbeda dengan SELECT pada baris ke-8. Untuk mengetahui fungsi SELECT disini, lihat kembali pembahasan pada Bab I. Dapat dikatakan bahwa penggunaan kata kunci SELECT pada baris ini adalah untuk menampilkan data (dari
literal_value).
4. PRINT digunakan untuk mencetak tulisan.
5. Beberapa provider basis data memberikan fitur berupa
variable scope. Dalam fitur ini, variabel dapat menjadi
variabel lokal atau global dalam ruang lingkup script block. Dalam contoh tersebut, variabel @HARGATERTINGGI merupakan variabel lokal dalam sub-script block (baris 15 s.d baris 21). Sedangkan @VAR bisa dipakai di lokasi manapun dalam script tersebut.
Kode 2.6
BEGIN
DECLARE @var VARCHAR(50);
SET @var = 'STIKOM SURABAYA';
DECLARE @jumlahbaris NUMERIC;
SET @jumlahbaris = (SELECT COUNT(*) FROM mahasiswa);
SELECT 'Jumlah baris = ' + CONVERT (VARCHAR, @jumlahbaris);
SET @jumlahbaris = @jumlahbaris + 1;
PRINT 'Data selanjutnya = ' + CONVERT
(VARCHAR, @jumlahbaris);
BEGIN
DECLARE @maxuas NUMERIC;
SELECT @maxuas = MAX(uas) FROM nilai; PRINT 'UAS tertinggi = ' + CONVERT
(VARCHAR, @maxuas);
END;
END; System Variable
Variabel ini menyimpan informasi proses yang sedang berjalan dan obyek-obyeknya. Namun, tidak semua provider basis data
menyebutnya demikian. Misalnya SQL Server sekarang lebih menyebutnya sebagai system function daripada predesesornya. Variabel jenis ini bersifat global, artinya dapat dipanggil kapanpun dan oleh siapapun.
Dalam SQL Server, system variable ditandai dengan @@<nama_variabel>, sedangkan untuk Oracle ditandai dengan %<nama_variabel>. Dan pemakaian variabel ini hanya terjadi pada saat-saat spesifik saja.
Beberapa system variables yang sering dipakai, antara lain: 1. @@ROWCOUNT
Digunakan untuk menghitung jumlah baris yang dikembalikan oleh query.
2. @@IDENTITY
Digunakan untuk mengambil nilai identity dari kolom (field) dengan properti isIdentity = TRUE. Umumnya hal ini dipakai untuk auto increment.
3. @@ERROR
Digunakan untuk mengambil nilai error. Jika tidak terdapat
error, nilainya adalah 0.
4. @@VERSION
Digunakan untuk mengambil versi dari SQL Server beserta tanggal, prosesor, dan arsitektur OS-nya.
Dalam contoh Kode 2.6, ada variabel @JUMLAHBARIS yang digunakan untuk menghitung jumlah baris data yang dikembalikan oleh query. Kode panjang dan kompleks tersebut dapat disederhanakan menggunakan bantuan system variables. Sehingga kode program akan tampak sebagai berikut:
Kode 2.7
SELECT *
FROM mahasiswa;
PRINT 'Jumlah baris = ' + CONVERT (VARCHAR, @@ROWCOUNT);
@@ROWCOUNT menampung jumlah data hasil dari perintah SELECT * FROM mahasiswa. Yang perlu diperhatikan disini
adalah @@ROWCOUNT hanya menampung sintak query satu statement sebelum pemakaiannya.
Operasi pada Variabel
Secara umum, operasi-operasi ini bisa dilakukan pada variabel, antara lain:
1. Operasi aritmatika.
Operasi ini berupa penambahan, pengurangan, perkalian, dan pembagian. Operator aritmatika dan contoh penggunaannya dapat dilihat pada Bab 1.
2. Operasi konkatenasi.
Operasi ini berupa penggabungan karakter. Untuk menggabungkan karakter, bisa dibaca kembali Bab 1.
3. Operasi logika.
Operasi ini berupa pemakaian variabel untuk kondisi dalam percabangan. Secara query sederhana, materi ini pernah dibahas di Bab 1. Namun untuk percabangan dalam T-SQL akan dibahas pada Bab 3.
Latihan
1. Buat script untuk melakukan masing-masing aritmatika berikut ini:
a. Penjumlahan b. Pengurangan
2. Buat variabel untuk menampung alamat dan kota. Lalu tampilkan kedua nilai variabel tersebut dalam sebuah kalimat.
Contoh:
Alamat: Jl. A. Yani 56 A Kota: Surabaya
PRINT: Jl. A. Yani 56 A Surabaya
3. Buat variabel untuk menampung seluruh field dari tabel mahasiswa.
4. Isi variabel yang dibentuk di no.3 dengan data mahasiswa dengan nim 06390102666. Lalu tampilkan seluruh datanya. Cara menampilkan:
NIM: 06390102666 Nama: Entin
Alamat: Jl. Yos Sudarso 1 Kota: Sidoarjo
Jns_kelamin: Wanita (W) Sts_nikah: Belum Menikah (B)
5. Buat variabel untuk menampung data-data berikut lalu masukkan datanya kedalam tabel karyawan.
NIM: nim Anda
Nama: nama lengkap Anda Alamat: alamat rumah/kos Anda Kota: sesuai alamat
Jns_kelamin: jenis kelamin Anda Sts_nikah: M
BAB III
Control-flow Statement
Sub-Materi:
Percabangan
Perulangan
Bab III
Control-flow Statement
Sub-Materi: Percabangan
Perulangan
Alur proses, dalam setiap bahasa pemrograman, adalah sebuah keharusan. Setiap perubahan kontrol terhadap alur proses dapat mempengaruhi output. T-SQL menyediakan beberapa macam cara untuk mengontrol alur proses antara lain (1) IF..ELSE, (2) WHILE, (3) GOTO dan WAITFOR, serta (4) TRY..CATCH. Dalam matakuliah Praktikum PBD, hanya dibahas mengenai percabangan menggunakan IF..ELSE, dan perulangan menggunakan WHILE.
Percabangan
Secara analogi dalam kehidupan sehari-hari, percabangan dapat dilihat ketika seseorang berjalan dan bertemu dengan persimpangan. Disini, ada beberapa pilihan yang bisa dibuat, apakah belok ke kanan, ke kiri, atau lurus? Ada juga pertimbangan-pertimbangan seperti, apa-kah lebih jauh, jalannya rusak, atau yang lainnya dalam setiap pilihan jalan.
Pembuatan program tidak hanya membuat terdiri dari statement yang dijalankan secara urut dari baris pertama sampai terakhir. Ada beberapa statement yang mungkin membutuhkan kondisi tertentu. Kondisi ini didalam program disebut sebagai percabangan.
Dalam T-SQL, hanya ada satu kata kunci untuk percabangan, yaitu IF..ELSE. Cara penulisannya hampir sama seperti cara menuliskan IF..ELSE didalam bahasa pemrograman Visual
Basic .NET, walaupun sebenarnya implementasinya lebih banyak mengikuti bahasa pemrograman C. Sintak dasar IF..ELSE dapat dilihat pada Kode 3.1:
Kode 3.1
IF <kondisi boolean> SQL | <script block> [ELSE [IF <kondisi boolean>] SQL | <script block>]
Setiap percabangan membutuhkan kondisi. Dalam arti kata lain, setiap kata kunci IF diikuti oleh kondisi. Kondisi ini adalah kondisi boolean. Penulisan kondisi boolean pada IF sama seperti penulisan kondisi pada WHERE atau HAVING (SQL).
Ada 2 nilai yang dihasilkan oleh kondisi boolean, yaitu terpenuhi dan tidak terpenuhi. Jika kondisi IF terpenuhi atau bernilai TRUE, maka SQL Server akan menjalankan sebuah perintah SQL atau menjalankan script block (jika banyak perintah) didalam blok IF. Dengan terpenuhinya kondisi, maka program tidak akan menjalankan blok ELSE. Namun jika kondisi IF tidak dipenuhi atau bernilai FALSE, maka SQL Server menjalankan script block didalam blok ELSE. Untuk lebih jelasnya, bisa diperhatikan pada Gambar 3.1:
Gambar 3.1 Alur IF … ELSE
Sebagai contoh, dosen ingin melakukan penyesuaian nilai UAS dengan ketentuan jika bulan ganjil, maka penambahan 20 poin.
Namun jika bulan genap, maka penambahan hanya 10 poin. Hasil
query dapat dilihat pada Kode 3.2: Kode 3.2
DECLARE @poin INT;
IF MONTH(GETDATE())%2=1
SET @poin=20;
ELSE
SET @poin=10;
UPDATE mahasiswa
SET uas=uas+@poin;
Dalam query tersebut, kondisi boolean yang dipakai adalah ganjil atau genapnya bulan, yaitu dengan melihat hasil sisa bagi antara nomor urut bulan dan nilai 2. Jika sisa bagi adalah 1, berarti bulan ganjil. Sehingga variabel @poin diisi dengan nilai 20. Begitu pula sebaliknya untuk sisa bagi 0 atau bulan genap.
Macam-macam Bentuk Percabangan
Percabangan dapat berupa percabangan tunggal. Percabangan ini hanya terdiri dari kata kunci IF saja. Perhatikan contoh berikut:
Kode 3.3
IF YEAR(GETDATE())%4 = 0
BEGIN
PRINT 'Tahun Kabisat';
PRINT '-- hanya bisa dibagi 4';
END;
Pada Kode 3.3, program melakukan pengecekan apakah tahun ini tahun kabisat. Jika tahun ini bisa dibagi 4 (sisa bagi 0), maka program menjalankan perintah didalam blok IF, yaitu (1) mencetak kalimat Tahun Kabisat, dan (2) mencetak kalimat --hanya bisa dibagi 4.
Kondisi boolean dalam percabangan, sama seperti kata kunci WHERE, bisa lebih dari satu kondisi. Perhatikan kode program pada contoh berikut:
Kode 3.4
IF YEAR(GETDATE())%4 = 0 AND
YEAR(GETDATE())%200 != 0
BEGIN
PRINT 'Tahun Kabisat';
PRINT '-- hanya bisa dibagi 4';
END;
Pada Kode 3.4, program melakukan pengecekan terhadap dua hal, yaitu (1) apakah tahun bisa dibagi 4, dan (2) apakah tahun tidak bisa dibagi 200. Jika kedua kondisi ini terpenuhi, dalam arti hasil operasi AND diantara keduanya bernilai TRUE, maka program akan menjalankan script block.
Selain operasi AND, dapat juga menggunakan operasi OR atau NOT didalam kondisi. Lebih lengkap mengenai kondisi dan operator kondisi, dapat dibaca kembali pada Bab I.
Selain percabangan tunggal, hanya terdiri dari sebuah IF, percabangan juga dapat dilakukan dalam bentuk majemuk. Percabangan jenis ini dapat dilihat kembali pada Kode 3.2. Jenis lain dari percabangan adalah percabangan bertingkat. Jenis ini mempunyai kompleksitas paling tinggi diantara percabangan lainnya. Ciri percabangan bertingkat adalah adanya percabangan didalam percabangan. Perhatikan contoh berikut:
Kode 3.5
IF YEAR(GETDATE())%4 = 0
BEGIN
PRINT 'PERCABANGAN UTAMA';
IF YEAR(GETDATE())%200 != 0
BEGIN
PRINT 'SUB PERCABANGAN';
PRINT '---';
PRINT 'Tahun Kabisat';
PRINT '-- bisa dibagi 4';
PRINT '-- tidak habis dibagi 200';
END;
END;
Pada Kode 3.5, program melakukan pengecekan apakah bulan habis dibagi 4. Jika hasilnya TRUE, maka program akan:
1. Mencetak PERCABANGAN UTAMA
2. Melakukan pengecekan apakah bulan tidak habis dibagi 200. Jika dari statement ini bernilai TRUE, maka program akan menampilkan kalimat:
SUB PERCABANGAN
--- Tahun Kabisat
-- bisa dibagi 4
-- tidak habis dibagi 200
Sehingga hasil keseluruhan jika semua kondisi bernilai TRUE, adalah:
Kode 3.6 Hasil jika semua TRUE
PERCABANGAN UTAMA SUB PERCABANGAN
--- Tahun Kabisat
-- bisa dibagi 4
-- tidak habis dibagi 200
Jika hanya percabangan utama yang bernilai TRUE, maka hasilnya hanyalah kalimat PERCABANGAN UTAMA.
Perulangan
Ada saatnya kode program mengharuskan programmer untuk menulis kode yang sama berulang-ulang. Misalnya, untuk mencetak angka dari 1 sampai dengan 10. Solusi sederhana untuk masalah ini adalah dengan mengetikkan kode program berikut ini: Kode 3.7 PRINT '1'; PRINT '2'; PRINT '3'; PRINT '4'; ... PRINT '10';
Kode program pada Kode 3.7 mudah dilakukan tetapi kurang efisien. Efisiensi akan terlihat ketika yang diproses lebih banyak, misal mencetak angka dari 1 sampai dengan 1000.
Untuk dapat mencapai efisiensi dalam pengerjaan kode program, ada sebuah konsep yang disebut dengan perulangan (looping). Dengan perulangan ini, kode program bisa ditulis sekali dan menghasilkan (sesuai contoh pada Kode 3.7) angka 1 sampai dengan 10.
Dalam T-SQL, hanya ada sebuah cara untuk melakukan perulangan yaitu menggunakan kata kunci WHILE. Sintak dasar WHILE dapat dilihat pada kode program berikut ini:
Kode 3.8
WHILE <kondisi boolean> BEGIN <script1> [BREAK] <script2> [CONTINUE] <script3> END;
Cara kerja WHILE, sesuai dengan Kode 3.8, adalah melakukan pengecekan terlebih dahulu pada kondisi boolean. Selama kondisi bernilai TRUE, maka blok WHILE akan dijalankan. Dan sebaliknya, ketika kondisi bernilai FALSE, maka blok WHILE tidak akan dijalankan. Secara sederhana, alur kerja perulangan dapat dilihat pada Gambar 3.2.
Dalam menjalankan blok WHILE, program melakukan pengecekan terhadap dua buah kata kunci, yaitu (1) BREAK, dan (2) CONTINUE. Kata kunci BREAK digunakan untuk keluar dari perulangan tanpa harus menunggu seluruh blok dijalankan. Hal ini bisa dilakukan dengan menambahkan kondisi sebelum kata kunci BREAK. Dari Kode 3.8, dengan munculnya BREAK, maka <script2> dan <script3> tidak akan dijalankan.
Sedangkan kata kunci CONTINUE digunakan untuk mengembalikan perulangan ke posisi awal blok <script1>. Kata kunci CONTINUE umumnya digunakan untuk re-evaluasi kondisi. Hal ini bisa dilakukan dengan menambahkan kondisi sebelum kata kunci CONTINUE. Dari Kode 3.8, dengan munculnya CONTINUE, maka <script3> tidak akan dijalankan.
Gambar 3.2 Alur WHILE
Perhatikan contoh kode program berikut ini:
Kode 3.9
DECLARE @counter INT;
SET @counter=1;
WHILE @counter<=10
BEGIN
PRINT 'Data ke-'+CONVERT(VARCHAR,@counter);
SET @counter=@counter+1;
END;
Pada Kode 3.9, terdapat sebuah variabel @counter yang dipakai sebagai acuan posisi perulangan. Karena fungsinya, maka @counter diberi nilai 1 dan akan bertambah (1 demi 1) didalam blok WHILE.
Urutan hasil proses dari Kode 3.9 adalah sebagai berikut:
Tabel 3.1 Cara Kerja Perulangan
Nilai @counter Hasil PRINT (didalam blok WHILE) 1 Data ke-1
Nilai @counter = 2 2 Data ke-2
Nilai @counter Hasil PRINT (didalam blok WHILE) 3 Data ke-3 Nilai @counter = 4 ... ... 10 Data ke-10 Nilai @counter = 11 11 -
Sampai pada nilai @counter 10, kode program didalam blok WHILE mengubah nilai @counter menjadi 11. Ketika dilakukan pengecekan (kondisi boolean) pada kata kunci WHILE, nilai @counter = 11 menghasilkan nilai FALSE. Dari hasil ini, program tidak menjalankan blok WHILE dan mengakhiri perulangan. Sehingga hasil dari Kode 3.9 adalah:
Kode 3.10 Hasil perulangan
Data ke-1 Data ke-2 Data ke-3 Data ke-4 ... Data ke-10
Dari Kode 3.10, dapat dilihat bahwa hasil query antara Kode 3.7 dan Kode 3.9 adalah sama. Dengan demikian, dapat diambil kesimpulan bahwa perulangan mampu mengefisiensikan penggunaan kode program.
Untuk penggunaan BREAK dan CONTINUE, perhatikan contoh pada Kode 3.11. Pada contoh tersebut, terdapat variabel @counter yang dipakai sebagai alat bantu perulangan. Perulangan di kondisikan berhenti pada nilai @counter 10. Selama @counter bernilai kurang dari 10, maka ada penambahan nilai +1 pada @counter. Ketika nilai @counter kurang dari 5, program tidak melakukan apa-apa. Hal ini dikarenakan ada kondisi IF @counter < 5. Kondisi ini berisi kata kunci CONTINUE. Ketika nilai @counter diantara 5 sampai dengan 8, maka program melakukan pencetakan nilai @counter.
Hal ini bisa dilihat pada kata kunci ELSE. Ketika nilai @counter diatas 8, program menghentikan perulangan.
Kode 3.11
DECLARE @counter INT;
SET @counter = 0;
WHILE @counter < 10
BEGIN
SET @counter = @counter + 1;
IF @counter < 5 BEGIN
CONTINUE;
PRINT 'Tidak dicetak';
END;
ELSE IF @counter > 8 BREAK;
ELSE
PRINT 'Nilai @counter = ' + convert(varchar, @counter);
END;
Cara membaca eksekusi Kode 3.11, adalah sebagai berikut:
Tabel 3.2
Nilai @counter Hasil WHILE
0 Nilai @counter = 1
Kondisi @counter < 5 terpenuhi
CONTINUE : Program kembali ke baris 1 blok WHILE 1 Nilai @counter = 2
Kondisi @counter < 5 terpenuhi
CONTINUE : Program kembali ke baris 1 blok WHILE
… …
4 Nilai @counter = 5
Kondisi @counter < 5 tidak terpenuhi Kondisi @counter > 8 tidak terpenuhi Program mencetak nilai @counter = 5 5 Nilai @counter = 6
Kondisi @counter < 5 tidak terpenuhi Kondisi @counter > 8 tidak terpenuhi Program mencetak nilai @counter = 6
… …
8 Nilai @counter = 9
Nilai @counter Hasil WHILE Kondisi @counter > 8 terpenuhi
BREAK : Program menghentikan perulangan Sehingga hasil dari Kode 3.11 adalah sebagai berikut:
Kode 3.12 Hasil perulangan
Nilai @counter = 5 Nilai @counter = 6 Nilai @counter = 7 Nilai @counter = 8
Sebagai tambahan, WHILE juga digunakan untuk melakukan pembacaan data pada cursor. Materi tentang cursor akan dibahas lebih detil pada Bab 4.
Latihan
1. Cetak nim mahasiswa mulai dari no urut 1001 sampai dengan 2000. Ketentuan pembuatan nim adalah sebagai berikut:
a. Panjang karakter: 11 digit angka
b. 2 angka depan = tahun. Contoh: 2014 menjadi 14 c. 5 angka setelahnya = jurusan. Contoh: 41010 d. 4 angka terakhir = no urut.
2. No urut NIM seharusnya dimulai dari angka 1. Oleh karena itu, ubah no urut pada latihan no.1 menjadi 1 sampai dengan 1000. Contoh hasil akhir: 14410100008
3. Dari 1000 data nim yang telah dibentuk, masukkan datanya kedalam tabel mahasiswa. Untuk kolom lain, berikan data
BAB IV
Cursor
Sub-Materi:
Cursor
Bab IV
Cursor
Sub-Materi: Cursor
Sebuah query mengembalikan sekumpulan baris yang biasa disebut sebagai resultset. Dalam beberapa studi kasus, program harus memproses satu baris data dalam satu waktu. Sebagai contoh, bagaimana cara untuk membuat keputusan kelulusan pada data mahasiswa yang diukur dari banyak parameter kelulusan. Untuk permasalahan tersebut, cursor adalah solusi yang tepat.
Cursor merupakan sebuah pointer yang dipakai untuk menunjuk
posisi tertentu (data) dalam sebuah resultset. Karena cursor bergantung pada recordset, maka setiap perubahan data pada tabel aslinya tidak akan berpengaruh terhadap isi data cursor.
Membuat dan Menggunakan Cursor
Gambar 4.1 Alur penggunaan cursor
Seperti yang terlihat pada Gambar 4.1, ada 4 proses dalam menggunakan Cursor, yaitu:
1. Deklarasi cursor (DECLARE)
Pendeklarasian cursor berisi nama cursor dan perintah
merupakan variabel khusus, nama cursor tidak diikuti oleh tanda @ seperti pada variabel-variabel bertipe data scalar (seperti VARCHAR, NUMERIC, DATETIME). Sintak pendeklarasian cursor dapat dilihat pada Kode 4.1.
Kode 4.1
DECLARE <nama cursor> CURSOR FOR <perintah SELECT>;
Contoh sederhana, membuat cursor cMhs untuk menampung seluruh data mahasiswa. Kode program untuk contoh ini dapat dilihat pada Kode 4.2.
Kode 4.2
DECLARE cMhs CURSOR FOR SELECT *
FROM mahasiswa;
2. Membuka cursor (OPEN)
Dengan membuka cursor, kita menjalankan perintah select dalam cursor (mempopulasikan cursor) dan menempatkan
cursor pada posisi baris pertama. Populasi ini disimpan
secara temporer didalam memory. Sintak untuk membuka
cursor dapat dilihat pada Kode 4.3. Kode 4.3
OPEN <nama cursor>;
Mengambil contoh dari cMhs, maka untuk membuka cursor cMhs dapat dilakukan seperti pada Kode 4.4.
Kode 4.4
OPEN cMhs;
3. Membaca data setiap baris dalam cursor (FETCH NEXT) Setelah data dipopulasikan kedalam cursor, langkah selanjutnya adalah mengambil setiap baris data menggunakan FETCH NEXT. Sintak untuk pembacaan data dapat dilihat pada Kode 4.5.
Kode 4.5
FETCH NEXT FROM <nama cursor> INTO <target-list>;