Anda di halaman 1dari 17

Modul 4

SQL Tingkat Lanjut


Modul 4
SQL Tingkat Lanjut

A. SQL Tingkat Lanjut


Beberapa pernyataan (statement) SQL tingkat lanjut yang dibahas di modul ini yaitu:
1. View,
2. Subquery,
3. Prosedur,
4. Fungsi, dan
5. Trigger.

B. VIEW
VIEW merupakan pernyataan (statement) SQL yang digunakan untuk “menyimpan” hasil operasi
SELECT pada suatu database. Tujuan dari VIEW diantaranya adalah untuk mempermudah dan
mempercepat proses menampilkan data, terutama jika operasi tersebut dilakukan secara berulang.

Jika dalam suatu database terdapat beberapa tabel yang berisi data secara fisik, maka VIEW dapat
dianggap sebagai “tabel virtual”. Meskipun VIEW tidak memiliki data secara fisik, VIEW dapat dirujuk
seolah-olah merupakan tabel dalam database.

1. Membuat VIEW.
Format dasar dari query VIEW yaitu:
CREATE VIEW nama_view AS
Query_select_statement;

Jika diperhatikan, format dasar tersebut sangat mudah dilakukan. Untuk membuat suatu VIEW,
cukup menambahkan perintah CREATE VIEW pada Query_select_statement yang diinginkan.
Sebagai contoh, lihat kembali contoh soal yang menggunakan database classicmodels pada
modul sebelumnya, misalnya diambil soal berikut:
14. Buat daftar nama eksekutif dengan jabatan VP atau Manajer! Gunakan fungsi
CONCAT untuk menggabungkan nama depan dan nama belakang karyawan ke dalam satu
kolom.

Query SELECT untuk soal tersebut yaitu:


SELECT CONCAT (firstName," ",lastName) AS nama_lengkap, jobTitle
FROM employees
WHERE jobTitle LIKE "%VP%" OR jobTitle LIKE "%Manager%";

Hasilnya sebagai berikut:

Selanjutnya akan dibuat suatu VIEW untuk statement SELECT tersebut:


CREATE VIEW no14 AS
SELECT CONCAT (firstName," ",lastName) AS nama_lengkap, jobTitle

Page 1 of 17
Modul 4
SQL Tingkat Lanjut
FROM employees
WHERE jobTitle LIKE "%VP%" OR jobTitle LIKE "%Manager%";

VIEW yang dibuat muncul di panel Navigator, pada bagian Views (jika query sudah dieksekusi dan
VIEW belum muncul, klik tombol refresh).

Selain itu, VIEW yang telah dibuat dapat pula dilihat menggunakan query SHOW TABLES
SHOW TABLES;

Atau jika ingin diperoleh informasi lebih detail, gunakan query SHOW FULL TABLES
SHOW FULL TABLES;

Menggunakan query SHOW FULL TABLES akan diperoleh informasi yang lebih jelas apakah suatu tabel
dalam database merupakan BASE TABLE atau merupakan VIEW.
Operasi-operasi pada tabel dapat dilakukan pula pada VIEW, misal jika ingin menampilkan deskripsi
dari suatu VIEW
DESCRIBE no14;

Page 2 of 17
Modul 4
SQL Tingkat Lanjut

Melihat melihat isi dari VIEW, dapat digunakan query SELECT seperti biasanya
SELECT * FROM no14;

Pemanggilan menggunakan tabel virtual atau VIEW akan lebih cepat dalam proses menampilkan
data. Karena setiap VIEW dipanggil MySQL tidak melakukan filtering data, namun hanya memanggil
kembali tabel virtualnya.

2. Manipulasi Data dan Query pada VIEW.


Seperti halnya tabel utama (BASE TABLE), berbagai macam manipulasi data (insert-update-delete)
maupun query dapat dilakukan pada VIEW.
Buka database perpustakaan, lihat tabel anggota:
SELECT * FROM anggota;

Dibuat VIEW yang berisi id_anggota, nama, jk, tgl_lahir, no_telp dari anggota Pria. Query sql
sebagai berikut:
CREATE VIEW angg_pria AS
SELECT id_anggota, nama, jk, tgl_lahir,no_telp
FROM anggota
WHERE jk = 'Pria';

Lihat isi dari VIEW angg_pria:

Page 3 of 17
Modul 4
SQL Tingkat Lanjut
SELECT * FROM angg_pria;

Misal ingin dicari anggota dengan id_anggota = 'A-14-042' dari VIEW angg_pria maka dapat
digunakan query SELECT seperti halnya pada tabel biasa, yaitu:
SELECT * FROM angg_pria WHERE id_anggota = 'A-14-042';

Selanjutnya jika ditambah data baru (insert) pada tabel utama (BASE TABLE), maka data tersebut juga
akan muncul di VIEW, contoh:
INSERT INTO anggota VALUES
('A-21-001', 'Alan ZZ', 'Pria', 'Yogyakarta','2004-05-23','012345678912');
SELECT * FROM angg_pria;

Cara sebaliknya juga bisa dilakukan, yaitu menambahkan data melalui VIEW di mana data yang
ditambahkan tersebut akan muncul juga di tabel utama (dalam menggunakan langkah ini perlu
diperhatikan beberapa hal, misalnya: dilihat apakah terdapat atribut di tabel utama dengan constraint
NOT NULL yang atribut tersebut tidak disertakan dalam VIEW, jika terjadi hal seperti ini insert data
melalui VIEW tidak dapat dilakukan).
Contoh insert data melalui VIEW:
INSERT INTO angg_pria VALUES
('A-21-004', 'Robot', 'Pria', '2004-11-18','098765432198');
SELECT * FROM angg_pria;

Dilihat pula pada tabel anggota


SELECT * FROM anggota;

Page 4 of 17
Modul 4
SQL Tingkat Lanjut

3. Referensi:
 https://www.mysqltutorial.org/mysql-views-tutorial.aspx
 https://www.duniailkom.com/tutorial-belajar-mysql-pengertian-view-dan-cara-penggunaan-
view-dalam-mysql/

C. Subquery
Secara sederhana, subquery di MySQL adalah query di dalam query atau query yang bersarang di
dalam query lain seperti SELECT, INSERT, UPDATE, atau DELETE. Subquery juga dapat disarangkan di
dalam subquery lainnya.
Suatu subquery disebut sebagai inner query (kueri dalam) sedangkan query yang berisi subquery
disebut outer query (kueri luar). Subquery dapat digunakan di mana saja dan harus ditulis dalam
tanda kurung (parentheses).

1. Menggunakan subquery.
Dalam bagian ini digunakan database classicmodels.
Misalnya, query berikut menggunakan subquery untuk menampilkan data karyawan (employees)
yang bekerja di kantor (offices) yang berlokasi di AS.
SELECT lastName, firstName VALUES
FROM employees WHERE officeCode
IN (SELECT officeCode FROM offices WHERE country = 'USA');

Page 5 of 17
Modul 4
SQL Tingkat Lanjut
Saat mengeksekusi query, MySQL mengeksekusi subquery terlebih dahulu dan menggunakan hasil
dari subquery untuk outer query.

2. Menggunakan subquery dalam klausa WHERE


a. Subquery dengan operator perbandingan
Misalnya, query berikut menampilkan data pelanggan yang memiliki pembayaran tertinggi.
SELECT customerNumber, checkNumber, amount
FROM payments
WHERE amount = (SELECT MAX(amount) FROM payments);

Contoh lain, ditampilkan data pelanggan yang pembayarannya lebih besar dari pembayaran rata-
rata:
SELECT customerNumber, checkNumber, amount
FROM payments
WHERE amount > (SELECT AVG(amount) FROM payments);

Langkah-langkah dalam contoh ini:


1. Dapatkan pembayaran rata-rata dengan menggunakan subquery.
2. Pilih pembayaran yang lebih besar dari pembayaran rata-rata yang dihasilkan oleh subquery
sebagai seleksi di kueri luar.

b. Subquery dengan operator IN dan NOT IN


Jika subquery menghasilkan lebih dari satu nilai, dapat digunakan operator lain seperti operator IN
atau NOT IN dalam klausa WHERE.
Digunakan tabel pelanggan (customers) dan pesanan (orders) dalam database classicmodels.
Misalnya, digunakan subquery dengan operator NOT IN untuk menemukan pelanggan yang belum
melakukan pemesanan sebagai berikut:
SELECT customerName
FROM customers WHERE customerNumber
NOT IN (SELECT DISTINCT customerNumber FROM orders);

Page 6 of 17
Modul 4
SQL Tingkat Lanjut

3. Subquery MySQL dalam klausa FROM


Saat menggunakan subquery dalam klausa FROM, kumpulan hasil yang dihasilkan dari subquery
digunakan sebagai tabel sementara (temporary table). Tabel ini disebut sebagai tabel turunan
(derived table) atau subquery terwujud (materialized subquery).
Subquery berikut menemukan jumlah maksimum, minimum, dan rata-rata item dalam pesanan
penjualan:
SELECT MAX(items), MIN(items), FLOOR(AVG(items))
FROM
(SELECT orderNumber, COUNT(orderNumber) AS items
FROM orderdetails GROUP BY orderNumber) AS lineitems;

Note: Fungsi FLOOR menghasilkan nilai integer terbesar yang lebih kecil dari atau sama dengan dari
suatu bilangan (selengkapnya dapat dilihat di: https://www.mysqltutorial.org/mysql-math-functions).

4. Subquery berkorelasi (correlated subquery)


Dalam contoh sebelumnya, dapat diihat bahwa subquery bersifat independen. Artinya, subquery
dapat dijalankan sebagai query mandiri, misalnya:
SELECT orderNumber, COUNT(orderNumber) AS items
FROM orderdetails GROUP BY orderNumber

Tidak seperti subquery mandiri, correlated subquery adalah subquery yang menggunakan data dari
outer query. Dengan kata lain, correlated subquery bergantung pada outer query. correlated
subquery dievaluasi setiap barisnya dalam outer query.
Digunakan tabel produk (products) dari database classicmodels untuk contoh-contoh berikut.
Contoh berikut menggunakan correlated subquery untuk memilih produk yang harga belinya lebih
besar dari harga beli rata-rata semua produk di setiap lini produk.
SELECT productname, buyprice FROM products p1
WHERE
buyprice > (SELECT AVG(buyprice) FROM products WHERE productline = p1.productline);

Page 7 of 17
Modul 4
SQL Tingkat Lanjut

Dalam contoh ini, baik outer query maupun correlated subquery merujuk pada tabel produk yang
sama. Oleh karena itu, perlu digunakan alias p1 untuk tabel produk di outer query.
Tidak seperti subquery biasa, correlated subquery tidak dapat dijalankan secara independen seperti
di bawah. Jika dilakukan, MySQL tidak mengetahui tabel p1 dan akan mengeluarkan pesan error.
SELECT AVG(buyprice) FROM products WHERE productline = p1.productline;

5. Referensi:
 https://www.mysqltutorial.org/mysql-subquery/

D. Prosedur
Prosedur (atau Stored Procedure) merupakan suatu program berisi perintah/query SQL yang dapat
dipanggil atau dieksekusi kembali saat diperlukan. Program tersebut disimpan di dalam SQL server.
Sebuah Stored Procedure dapat memiliki parameter sehingga dapat dinputkan suatu nilai pada
Stored Procedure dan outputnya berasarkan nilai input tersebut. Misalnya, suatu Stored Procedure
yang menghasilkan data pelanggan menurut negara dan kota. Dalam hal ini, negara dan kota adalah
parameter dari Stored Procedure.
Stored Procedure dapat berisi control flow statements seperti IF, CASE, dan LOOP yang
memungkinkan untuk mengimplementasikan perintah secara prosedural. Stored Procedure dapat
memanggil Stored Procedure atau Stored Function lainnya.

1. Delimiter
a. Mengganti Delimiter
Perintah SQL seperti di MySQL Workbench, misalnya statement/query SELECT, menggunakan
delimiter (akhiran) titik koma (;) sebagai penanda untuk akhiran dari suatu statement atau query.
Namun, Stored Prosedure berisi beberapa statement yang dipisahkan dengan tanda titik koma ( ;).
Jika suatu Stored Procedure yang mengandung tanda titik koma didefinisikan, MySQL akan
memperlakukan Stored Prosedure tersebut sebagai beberapa statement, bukan statement tunggal.
Oleh karena itu, delimiter harus didefinisikan kembali untuk sementara sehingga keseluruhan Stored
Procedure akan dieksekusi sebagai statement tunggal.
Karakter delimiter yang digunakan dapat berupa karakter tunggal atau ganda seperti // atau ??.
Namun harus dihindari penggunaan karakter default dalam MySQL seperti backslash (\).
Sebagai contoh delimiter akan didefinisikan ualng dengan karakter // :
DELIMITER //

Page 8 of 17
Modul 4
SQL Tingkat Lanjut
Ketika delimiter sudah berubah, maka delimiter yang baru dapat digunakan untuk mengakhiri suatu
statement, sebagai contoh:
DELIMITER //
SELECT * FROM customers //
SELECT * FROM products //

Untuk mengembalikan delimiter seperti semula, yakni titik koma ( ;) dapat digunakan statement
berikut:
DELIMITER ;

b. Menggunakan DELIMITER untuk Stored Procedure


Secara umum, sebuah Stored Procedure berisi beberapa statement yang dipisahkan dengan titik
koma (;). Untuk mengeksekusi keseluruhan perintah dalam Stored Procedure sebagai statement
tunggal, perlu untuk mengubah delimiter secara sementara dari tanda titik koma ( ;) ke karakter
delimiter lain seperti // atau ??.
DELIMITER $$

CREATE PROCEDURE sp_name()


BEGIN
-- statements
END $$

DELIMITER ;

Note:
1. Ubah delimiter default ke $$ atau //.
2. Gunakan (;) pada bagian utama Stored Procedure dan $$ (atau //) pada setiap akhir dari kata kunci
untuk mengakhiri Stored Procedure.
3. Kembalikan delimiter ke defaultnya (;).

2. Membuat, Memanggil, Menghapus, dan Mengubah Prosedur


a. Membuat Prosedur
Format untuk membuat Stored Procedure (selanjutnya akan disebut Prosedur) adalah sebagai berikut:
DELIMITER $$

CREATE PROCEDURE nama_prosedur(daftar_parameter)


BEGIN
statements
END $$

DELIMITER ;

Sebagai contoh, akan dilihat seluruh data pegawai dalam database classicmodels, query nya sebagai
berikut:
SELECT * FROM employees ;

Selanjutnya, dibuat Prosedur untuk query di atas, misal Prosedur tersebut diberi nama peg01, query nya
sebagai berikut:

Page 9 of 17
Modul 4
SQL Tingkat Lanjut
DELIMITER //
CREATE PROCEDURE peg01()
BEGIN
SELECT * FROM employees;
END //
DELIMITER ;

b. Memanggil Prosedur
Format untuk memanggil Prosedur dengan menggunakan CALL:
CALL nama_prosedur(daftar_argumen);

Bagian daftar_argumen menyesuaikan dengan daftar_parameter dalam pembuatan Prosedur. Jika


daftar_parameter kosong, maka daftar_argumen tidak perlu diisi.

Akan dipanggil Prosedur peg01 yang sudah dibuat sebelumya:


CALL peg01();

c. Membuat Prosedur menggunakan MySQL Workbench Wizard


Misal akan dibuat prosedur yang menampilkan seluruh data pelanggan dari database classicmodels,
dengan query sebagai berikut:
SELECT * FROM customers ;

Selanjutnya klik kanan pada menu prosedur di panel Navigator, pilih Created Stored Procedure…

Page 10 of 17
Modul 4
SQL Tingkat Lanjut

Muncul jendela berikut:

Isikan nama prosedur dan statements sesuai dengan keperluan, misal diberi nama pelanggan dan
statements diisi dengan query yang menampilkan seluruh data pelanggan:

Kemudian klik tombol Apply di kanan bawah

Periksa kembali query yang ditulis, sudah sesuai atau belum. Jika sudah, klik tombol Apply

Page 11 of 17
Modul 4
SQL Tingkat Lanjut

Klik Finish

Prosedur pelanggan sudah berhasil dibuat

Page 12 of 17
Modul 4
SQL Tingkat Lanjut

Untuk memanggil Prosedur pelanggan bisa menggunakan query


CALL pelanggan();

d. Melihat Daftar Prosedur


Format untuk melihat daftar Prosedur:
SHOW PROCEDURE STATUS [LIKE 'pattern' | WHERE kondisi];

Bagian [LIKE 'pattern' | WHERE kondisi] dapat diisi sesuai keperluan, atau tidak ditulis sama sekali.
Misal ingin dilihat semua Prosedur yang ada:
SHOW PROCEDURE STATUS;

Hasilnya:

Terlihat semua prosedur yang ada di server, baik di database classismodels maupun dari database lainnya.
Jika hanya ingin menampilkan Prosedur yang ada di database classismodels, maka perintahnya adalah:
SHOW PROCEDURE STATUS WHERE db = 'classicmodels';

Page 13 of 17
Modul 4
SQL Tingkat Lanjut
e. Menghapus Prosedur
Format untuk menghapus suatu Prosedur dengan menggunakan DROP:
DROP PROCEDURE [IF EXISTS] nama_prosedur;

Bagian [IF EXISTS] dapat tidak ditulis.


Misal akan dihapus Prosedur pelanggan:
DROP PROCEDURE pelanggan;
Atau
DROP PROCEDURE IF EXISTS pelanggan;

f. Mengubah (Alter) Prosedur


MySQL (client) tidak menyediakan format khusus untuk mengubah suatu Prosedur yang sudah ada. Untuk
mengubah suatu Prosedur, dapat dilakukan dengan menghapus (DROP) prosedur tersebut kemudian
membuatnya (CREATE) kembali.
Mengubah prosedur dapat dilakukan di MySQL Workbench. Misal ingin diubah struktur Prosedur pelanggan,
klik kanan pada Prosedur pelanggan, kemudian pilih Alter Stored Procedure…

Struktur Prosedur pelanggan diubah, dengan hanya menampilkan kolom customerNumber, customerName,
dan salesRepEmployeeNumber. Pada kotak DDL tuliskan query berikut:

CREATE DEFINER=`root`@`localhost` PROCEDURE `pelanggan`()


BEGIN
SELECT customerNumber, customerName, salesRepEmployeeNumber FROM customers;
END

Selanjutnya klik Apply

Page 14 of 17
Modul 4
SQL Tingkat Lanjut

Jika sudah tepat, Klik Apply.

Kemudian klik Finish.


Struktur Prosedur sudah berubah. Untuk memanggil Prosedur pelanggan yang baru gunakan query
CALL pelanggan();

Page 15 of 17
Modul 4
SQL Tingkat Lanjut

3. Prosedur dengan Parameter


Prosedur dapat menggunakan parameter di mana hasil eksekusi menyesuaikan dengan nilai parameternya.
Terdapat 3 jenis parameter yaitu IN, OUT, dan INOUT.
Lebih lanjut: https://www.mysqltutorial.org/stored-procedures-parameters.aspx

4. Variabel dalam Prosedur


Variabel meruapkan suatu obyek yang nilainya dapat berubah selama eksekusi suatu prosedur. Variabel biasa
digunakan dalam suatu prosedur untuk menyimpan hasilnya secara langsung. Variabel-variabel tersebut
bersifat lokal untuk suatu prosedur.
Sebelum menggunakan variabel, variabel harus dideklarasikan terlebih dahulu.
Lebih lanjut: https://www.mysqltutorial.org/variables-in-stored-procedures.aspx

5. Percabangan (Conditional Statements)


a. Statement IF
Lebih lanjut: https://www.mysqltutorial.org/mysql-if-statement/

b. Statement CASE
Lebih lanjut: https://www.mysqltutorial.org/mysql-case-statement/

6. Perulangan (Looping)
a. Loop
Lebih lanjut: https://www.mysqltutorial.org/stored-procedures-loop.aspx

b. WHILE Loop
Lebih lanjut: https://www.mysqltutorial.org/mysql-stored-procedure/mysql-while-loop/

c. REPEAT Loop
Lebih lanjut: https://www.mysqltutorial.org/mysql-stored-procedure/mysql-repeat-loop/

d. LEAVE Statement
Lebih lanjut: https://www.mysqltutorial.org/mysql-stored-procedure/mysql-leave/

E. Fungsi (Function)
Perbedaan Fungsi dengan Prosedur diantaranya:
1. Fungsi bisa menghasilkan suatu nilai (return value)
2. Parameter yang bisa digunakan dalam Fungsi hanya parameter IN
3. Fungsi bisa langsung dipanggil dari query SELECT.

Page 16 of 17
Modul 4
SQL Tingkat Lanjut
1. Membuat Fungsi
Lebih lanjut: https://www.mysqltutorial.org/mysql-stored-function/

2. Menghapus Fungsi
Lebih lanjut: https://www.mysqltutorial.org/mysql-stored-procedure/mysql-drop-function/

3. Melihat Daftar Fungsi


Lebih lanjut: https://www.mysqltutorial.org/mysql-stored-procedure/mysql-show-function/

F. Trigger.
Di MySQL, Trigger adalah program tersimpan yang dipanggil secara otomatis sebagai respons
terhadap peristiwa seperti INSERT, UPDATE, atau DELETE yang terjadi pada tabel terkait. Misalnya,
dientukan Trigger yang dipanggil secara otomatis sebelum baris baru dimasukkan ke dalam tabel.

MySQL mendukung Trigger yang dipanggil sebagai respons terhadap event INSERT, UPDATE,
atau DELETE.

1. Berbagai macam Trigger.


Trigger dapat dibuat pada event INSERT, UPDATE, atau DELETE baik sebelum (BEFORE) atau
setelah (AFTER) event itu terjadi. Sehingga terdapat 6 jenis Trigger dalam MySQL yaitu:
1. BEFORE INSERT Trigger,
2. AFTER INSERT Trigger,
3. BEFORE UPDATE Trigger,
4. AFTER UPDATE Trigger,
5. BEFORE DELETE Trigger, dan
6. AFTER DELETE Trigger.

2. Referensi:
Lebih lengkap tentang trigger dapat dilihat di: https://www.mysqltutorial.org/mysql-triggers/

Page 17 of 17

Anda mungkin juga menyukai