• Tidak ada hasil yang ditemukan

MK. PRAKTIKUM. Capaian: Mahasiswa mampu menerapkan konsep-konsep pemrograman basis data.

N/A
N/A
Protected

Academic year: 2021

Membagikan "MK. PRAKTIKUM. Capaian: Mahasiswa mampu menerapkan konsep-konsep pemrograman basis data."

Copied!
139
0
0

Teks penuh

(1)

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

(2)
(3)

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

(4)

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

(5)

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

(6)

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

(7)

BAB I

SQL (sekuel)

Sub-Materi:

Select

Join

Subquery

DML

(8)
(9)

Bab I

SQL (sekuel)

Sub-Materi: Select Join Subquery DML

Perkenalan

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

(10)

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

(11)

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

(12)

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.

(13)

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.

(14)

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]

.. … … …

(15)

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

(16)

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';

(17)

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

(18)

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;

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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 ...];

(24)

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

(25)

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';

(26)

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.

(27)

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

(28)

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.

(29)

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.

(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.

(31)

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.

(32)

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.

(33)

BAB II

Tipe Data dan Variabel

Sub-Materi:

Script dan Script Block

Tipe Data

Variabel

(34)
(35)

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.

(36)

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

(37)

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.

(38)

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.

(39)

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.

(40)

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;

(41)

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

(42)

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

(43)

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

(44)

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.

(45)

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

(46)
(47)

BAB III

Control-flow Statement

Sub-Materi:

Percabangan

Perulangan

(48)
(49)

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

(50)

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.

(51)

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:

(52)

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:

(53)

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.

(54)

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.

(55)

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

(56)

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.

(57)

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

(58)

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.

(59)

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

(60)
(61)

BAB IV

Cursor

Sub-Materi:

Cursor

(62)
(63)

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

(64)

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>;

Gambar

Gambar 1.1 Database schema Putra Jaya
Gambar 1.2 Database schema PBD
Tabel 1.1 Operator Pembanding
Tabel 1. 2 Prioritas Penggunaan Operator Pembanding
+7

Referensi

Dokumen terkait

Sehubungan dengan hal tersebut kami mohon ijin dan bantuan bagi mahasiswa yang be1 s&#34;lngkutan agar dapat melakukan penyebaran angket di tempat yang B.1pak

Pak Budi ingin agar peserta didik kelas XI IPA 2 melakukan sebuah penyelidikan yang bertujuan untuk mengetahui apakah terdapat gangguan dan kelainan pada organ ginjal jika

Menjadi realita bahwa di Indonesia akhir- akhir ini semakin sering terjadi kejahatan- kejahatan yang dilatarbelakangi dengan terganggunya jiwa si pelaku, namun

Dalam penelitian ini besaran nilai beban tekan aksial eksentris dengan kombinasi momen lentur yang dapat ditahan oleh baja profil siku pada kolom

1) Agar sistem pendukung keputusan ini dapat membantu SD Negeri Pace Kulon III dalam menentukan siswa yang paling layak menerima beasiswa. 2) Agar sistem

Tabel 4.30 Distribusi Jawaban Responden Terkait Kerjasama Rekan Kerja Yang Dapat Membantu Dalam Menyelesaikan Pekerjaan

Diagnosa pada kehamilan dan perhitungan tanggal yang tepat merupakan hal yang penting untuk menghindari resiko selama minggu pertama kehamilan dan untuk

Hal ini dikarenakan pekerjaan utama sebagai petani akan mempunyai waktu yang lebih banyak untuk menerapkan teknologi padi sehat dengan baik dibandingkan yang