DML Lanjutan Pertemuan Minggu Ke-10
Kompetensi Khusus Mahasiswa mampu menggunakan perintah dan fungsi manipulasi data lanjutan pada database menggunakan MySQL (C3)
Operator Join Menggabungkan baris dari 2 tabel & mengembalikan baris dengan salah satu dari kondisi berikut: Memiliki nilai yang sama dalam kolom dari 2 tabel (natural join). Memenuhi kondisi join yang diberikan (sama atau tidak sama). Memiliki nilai yang sama dalam kolom atau tidak memiliki nilai yang sama (outer join). Operasi join dapat diklasifikasikan menjadi: Inner join : join dimana hanya baris yang memenuhi kriteria yang dipilih. Outer join : mengembalikan tidak hanya baris yang sesuai melainkan baris dengan nilai atribut yang tidak sesuai untuk 1 tabel atau 2 tabel yang dijoin.
Cross Join Melakukan produk relasional (dikenal juga sebagai produk Kartesian) dari 2 tabel. Sintaknya sbb: SELECT column-list FROM table1 CROSS JOIN table2; Cth: SELECT * FROM INVOICE CROSS JOIN LINE; User juga dapat melakukan cross join yang hanya menampilkan atribut yang disebutkan: SELECT INVOICE.INV_NUMBER, CUS_CODE, INV_DATE, P_CODE FROM INVOICE CROSS JOIN LINE;
SELECT column-list FROM table1 NATURAL JOIN table2; Mengembalikan semua baris dengan nilai yang sesuai dalam kolom yang sesuai & membuang kolom duplikat. Berikut sintaksnya: SELECT column-list FROM table1 NATURAL JOIN table2; Natural join melakukan tugas berikut: Menentukan atribut umum dengan mencari atribut dengan nama identik & tipe data yang sesuai. Hanya memilih baris dengan nilai umum dalam atribut umum. Jika tidak terdapat atribut umum, tampilkan produk relasional dari 2 tabel.
Contoh berikut menampilkan natural join dari tabel CUSTOMER & INVOICE & mengembalikan hanya atribut terpilih: SELECT CUS_CODE, CUS_LNAME, INV_NUMBER, INV_DATE FROM CUSTOMER NATURAL JOIN INVOICE; Natural join tidak terbatas pada 2 tabel. User dapat menggabungkan tabel INVOICE, LINE, & PRODUCT & hanya menampilkan atribut terpilih: SELECT INV_NUMBER, P_CODE, P_DESCRIPT, LINE_UNITS, LINE_PRICE FROM INVOICE NATURAL JOIN LINE NATURAL JOIN PRODUCT;
JOIN dengan USING Query join yang menggunakan USING akan mengembalikan hanya baris dengan nilai yang sesuai dalam kolom yang disebutkan dalam USING - & kolom tsb harus ada dalam kedua tabel. Sintaknya sbb: SELECT column-list FROM table1 JOIN table2 USING (common-column); Cth: SELECT INV_NUMBER, P_CODE, P_DESCRIPT, LINE_UNITS, LINE_PRICE FROM INVOICE JOIN LINE USING (INV_NUMBER) JOIN PRODUCT USING (P_CODE);
JOIN dengan ON Cara lain menggunakan join ketika tabel tidak memiliki nama atribut yang sama adalah dengan JOIN ON. Query akan mengembalikan hanya baris yang sesuai dengan kondisi join yang diberikan. Kondisi JOIN akan memasukkan ekspresi perbandingan sama dengan dari 2 kolom. Sintaknya sbb: SELECT column-list FROM table1 JOIN table2 ON join-condition; Cth JOIN dengan ON: SELECT INVOICE.INV_NUMBER, PRODUCT.P_CODE, P_DESCRIPT, LINE_UNITS, LINE_PRICE FROM INVOICE JOIN LINE ON INVOICE.INV_NUMBER = LINE.INV_NUMBER JOIN PRODUCT ON LINE.P_CODE = PRODUCT.P_CODE;
Outer Join Mengembalikan tidak hanya baris yang sesuai dengan kondisi join, melainkan juga baris dengan nilai yang tidak sesuai. Standar ANSI mendefinisikan 3 jenis outer join: left, right, & full. Left & right merefleksikan urutan tabel yang diproses oleh DBMS. Tabel pertama setelah FROM akan menjadi sisi kiri & tabel kedua akan menjadi sisi kanan. Jika 3 atau lebih tabel yang dijoin, hasil dari penggabungan 2 tabel pertama menjadi sisi kiri & tabel ketiga menjadi sisi kanan. Left outer join tidak hanya mengembalikan baris yang sesuai dengan kondisi join melainkan juga baris dalam tabel kiri dengan nilai yang tidak sesuai dalam tabel kanan.
Berikut sintaksnya: Cth: SELECT column-list FROM table1 LEFT [OUTER] JOIN table2 ON join-condition; Cth: SELECT P_CODE, VENDOR.V_CODE, V_NAME FROM VENDOR LEFT JOIN PRODUCT ON VENDOR.V_CODE = PRODUCT.V_CODE; Right outer join mengembalikan tidak hanya baris yang sesuai dengan kondisi join, melainkan juga baris dalam tabel kanan dengan nilai yang tidak sesuai dalam tabel kiri. SELECT column-list FROM table1 RIGHT [OUTER] JOIN table2 ON join-condition; FROM VENDOR RIGHT JOIN PRODUCT ON VENDOR.V_CODE = PRODUCT.V_CODE;
Full outer join mengembalikan tidak hanya baris yang sesuai dengan kondisi join, melainkan juga semua baris dengan nilai yang tidak sesuai dalam tabel pada kedua sisi. Berikut sintaksnya: SELECT column-list FROM table1 FULL [OUTER] JOIN table2 ON join-condition; Cth: SELECT P_CODE, VENDOR.V_CODE, V_NAME FROM VENDOR FULL JOIN PRODUCT ON VENDOR.V_CODE = PRODUCT.V_CODE;
Subquery Terkadang data yang diproses membutuhkan data yang diproses lainnya. Cth query untuk menghasilkan daftar vendor yang tidak memasok produk: SELECT V_CODE, V_NAME FROM VENDOR WHERE V_CODE NOT IN (SELECT V_CODE FROM PRODUCT); Cth query untuk menghasilkan semua produk dengan harga lebih besar sama dengan harga rata-rata produk: SELECT P_CODE, P_PRICE FROM PRODUCT WHERE P_PRICE >= (SELECT AVG(P_PRICE) FROM PRODUCT);
Berikut karakteristik subquery: Subquery adalah query (pernyataan SELECT) dalam query. Subquery biasanya diekspresikan dalam tanda kurung. Query pertama dalam pernyataan SQL dikenal sebagai query luar. Query di dalam pernyataan SQL dikenal sebagai query dalam. Query dalam dieksekusi terlebih dulu. Output dari query dalam digunakan sebagai input untuk query luar. Keseluruhan pernyataan SQL kadang disebut sebagai query bersarang.
Subquery dapat mengembalikan: Satu nilai tunggal (1 kolom & 1 baris). Subquery ini digunakan di sisi kanan dari ekspresi perbandingan. Daftar nilai (1 kolom & beberapa baris). Subquery ini digunakan dengan IN dalam ekspresi WHERE. Tabel virtual (beberapa kolom & beberapa baris nilai). Subquery ini digunakan dengan FROM.
Subquery WHERE Jenis subquery yang paling umum menggunakan subquery SELECT pada sisi kanan dari ekspresi perbandingan WHERE. Cth query untuk menemukan semua produk dengan harga lebih besar sama dengan harga rata-rata produk: SELECT P_CODE, P_PRICE FROM PRODUCT WHERE P_PRICE >= (SELECT AVG(P_PRICE) FROM PRODUCT); Ketika menggunakan ekspresi kondisi >, <, =, >=, atau <=, membutuhkan subquery yang mengembalikan hanya 1 nilai (1 kolom & 1 baris). Nilai yang dihasilkan oleh subquery harus berupa tipe data yang sama; jika atribut di sebelah kiri dari simbol perbandingan adalah tipe karakter, subquery harus mengembalikan string karakter.
Subquery IN Operator IN digunakan untuk membandingkan atribut tunggal dengan daftar nilai. Cth: SELECT DISTINCT CUS_CODE, CUS_LNAME, CUS_FNAME FROM CUSTOMER JOIN INVOICE USING (CUS_CODE) JOIN LINE USING (INV_NUMBER) JOIN PRODUCT USING (P_CODE) WHERE P_CODE IN (SELECT P_CODE FROM PRODUCT WHERE P_DESCRIPT LIKE ‘%hammer%’ OR P_DESCRIPT LIKE ‘%saw%’);
Subquery HAVING Seperti menggunakan WHERE, user juga dapat menggunakan subquery dengan HAVING. HAVING digunakan untuk membatasi output dari query GROUP BY dengan mengaplikasikan kriteria kondisional untuk kelompok baris. Cth query untuk menampilkan semua produk dengan jumlah yang terjual lebih besar dari jumlah rata-rata yang terjual: SELECT P_CODE, SUM(LINE_UNITS) FROM LINE GROUP BY P_CODE HAVING SUM(LINE_UNITS) > (SELECT AVG(LINE_UNITS) FROM LINE);
Operator Subquery Multibaris : ANY & ALL Jika user ingin membuat perbandingan selain sama dengan dari 1 nilai dengan daftar nilai maka dapat menggunakan ALL. Cth query berikut untuk menampilkan biaya produk yang lebih mahal dari semua produk yang dipasok oleh vendor dari Florida: SELECT P_CODE, P_QOH * P_PRICE FROM PRODUCT WHERE P_QOH * P_PRICE > ALL (SELECT P_QOH * P_PRICE FROM PRODUCT WHERE V_CODE IN (SELECT V_CODE FROM VENDOR WHERE V_STATE=‘FL’)); Operator ANY digunakan membandingan nilai tunggal dengan daftar nilai & memilih hanya baris dimana biaya inventori lebih besar atau lebih kecil dari nilai dalam daftar. User dapat menggunakan sama dengan pada operator ANY, yang berfungsi sama dengan operator IN.
Subquery FROM Karena hasil dari subquery (pernyataan SELECT) adalah tabel lain (tabel virtual), maka user dapat menggunakan subquery SELECT dalam FROM. Cth query untuk menampilkan semua pelanggan yang membeli produk 13-Q2/P2 & 23109-HB: SELECT DISTINCT CUSTOMER.CUS_CODE, CUSTOMER.CUS_LNAME FROM CUSTOMER, (SELECT INVOICE.CUS_CODE FROM INVOICE NATURAL JOIN LINE WHERE P_CODE=‘13-Q2/P2’) CP1, (SELECT INVOICE.CUS_CODE FROM INVOICE NATURAL JOIN LINE WHERE P_CODE=‘23109-HB’) CP2 WHERE CUSTOMER.CUS_CODE=CP1.CUS_CODE AND CP1.CUS_CODE=CP2.CUS_CODE;
Subquery Daftar Atribut Pernyataan SELECT menggunakan daftar atribut untuk menandakan kolom apa yang ditampilkan. Kolom dapat berupa atribut dari tabel, atribut yang dikomputasi, atau hasil dari fungsi agregasi. Daftar atribut juga dapat menggunakan ekspresi subquery, yg disebut dengan inline subquery. Subquery dalam daftar atribut harus mengembalikan nilai tunggal. Cth query untuk menampilkan harga rata-rata produk & selisih harga produk dengan harga rata-rata: SELECT P_CODE, P_PRICE, (SELECT AVG(P_PRICE) FROM PRODUCT) AS AVGPRICE, P_PRICE – (SELECT AVG(P_PRICE) FROM PRODUCT) AS DIFF FROM PRODUCT;
Fungsi SQL Fungsi tanggal & waktu: YEAR, MONTH, DAY, dsb. Fungsi numerik: ABS, ROUND, CEIL/ FLOOR, dsb. Fungsi string: UPPER, LOWER, SUBSTRING, LENGTH, dsb. Fungsi konversi: CAST, CONVERT, dsb.
Operator Relasional UNION untuk menggabungkan baris dari 2 atau lebih query tanpa memasukkan baris duplikat. UNION ALL sama seperti UNION tetapi baris duplikat tetap ditampilkan. INTERSECT untuk menggabungkan baris dari 2 query & hanya mengembalikan baris yang muncul di kedua query. MINUS untuk menggabungkan baris dari 2 query & hanya mengembalikan baris yang muncul di query pertama tetapi tidak yang di query kedua. Sintaks alternatif: jika DBMS tidak mendukung INTERSECT atau MINUS, maka user dapat menggunakan subquery IN & NOT IN untuk mendapatkan hasil yang sama.
Tabel Virtual: Membuat View View adalah tabel virtual berdasarkan query SELECT. Query dapat berisi kolom, kolom yang dikomputasi, alias, & fungsi agregasi dari 1 atau lebih tabel. Tabel yang menjadi acuan dari view adalah base table. View dapat dibuat dengan perintah CREATE VIEW: CREATE VIEW viewname AS SELECT query;
View relasional memiliki beberapa karakteristik khusus: Nama view dapat digunakan dimanapun nama tabel diharapkan dalam pernyataan SQL. View diupdate secara dinamis. View menyediakan tingkat keamanan dalam database karena membatasi user untuk melihat hanya kolom & baris yang disebutkan dalam tabel. View juga dapat digunakan sebagai dasar untuk laporan.
Procedural SQL (PL/SQL) PL/SQL adalah bahasa yang memungkinkan penggunaan & penyimpanan kode prosedural & pernyataan SQL dalam database & untuk menggabungkan SQL & pemrograman tradisional seperti variabel, pemrosesan kondisi (IF-THEN-ELSE), loop dasar (FOR & WHILE), & pengecekan kesalahan. Kode prosedural dieksekusi sebagai sebuah unit oleh DBMS ketika dipanggil (langsung atau tidak langsung) oleh end user. End user dapat menggunakan PL/SQL untuk membuat: Anonymous PL/SQL blocks Triggers Stored procedures PL/SQL functions
Trigger Trigger adalah kode SQL prosedural yang secara otomatis dijalankan oleh RDBMS saat kemunculan kejadian manipulasi data yang diberikan. Penting untuk diingat bahwa: Trigger dijalankan sebelum atau sesudah baris data dimasukkan, diperbaharui, atau dihapus. Trigger berhubungan dengan tabel database. Tiap tabel database mungkin memiliki 1 atau lebih trigger. Trigger dieksekusi sebagai bagian dari transaksi yang memicunya. Trigger dapat digunakan untuk menerapkan batasan yang tidak dapat diterapkan pada tingkat desain & implementasi DBMS. Trigger menambah fungsionalitas dengan mengotomatiskan aksi kritis & menyediakan peringatan & saran untuk aksi perbaikan. Trigger dapat digunakan untuk memperbaharui nilai tabel, memasukkan record dalam tabel, & memanggil stored procedure lain.
Berikut sintaks untuk membuat trigger: CREATE OR REPLACE TRIGGER trigger_name [BEFORE / AFTER][DELETE / INSERT / UPDATE OF column_name] ON table_name [FOR EACH ROW] [DECLARE] [variable_namedata type[:=initial_value]] BEGIN PL/SQL instructions; ... END;
Stored Procedure Stored procedure adalah kumpulan dari pernyataan prosedural & SQL. Keuntungan utama dari stored procedure adalah dapat digunakan untuk mengenkapsulasi & mewakilkan transaksi bisnis. Keuntungan lainnya: Mengurangi lalu lintas jaringan & meningkatkan kinerja. Membantu mengurangi duplikasi kode dengan isolasi kode & sharing kode, sehingga meminimalisasi kesempatan kesalahan & biaya pengembangan & pemeliharaan aplikasi.
Berikut sintaks untuk membuat stored procedure: CREATE OR REPLACE PROCEDURE procedure_name [(argument [IN/OUT] data-type, ...)] [IS/AS] [variable_namedata type[:=initial_value]] BEGIN PL/SQL or SQL statements; ... END;
Stored Function Stored function pada dasarnya adalah kelompok dari pernyataan prosedural & SQL yang mengembalikan nilai, ditandai dengan pernyataan RETURN dalam kode programnya. Stored function hanya dapat dipanggil dari dalam stored procedure atau trigger, & tidak dapat dipanggil dari pernyataan SQL kecuali fungsi mengikuti beberapa aturan khusus.
Berikut sintaks untuk membuat fungsi: CREATE FUNCTION function_name (argument IN data-type, ...) RETURN data-type [IS] BEGIN PL/SQL statements; ... RETURN (value or expression); END;
Review Materi Mahasiswa mempraktikkan DML Lanjutan di MySQL.