From fcdf3f6023e1fca48395e475f6562be6a70cf261 Mon Sep 17 00:00:00 2001 From: masipnu Date: Wed, 4 Dec 2024 13:27:32 +0700 Subject: [PATCH] Deployed 412348b with MkDocs version: 1.6.1 --- 404.html | 20 ++ bab1/index.html | 22 +- bab10/index.html | 20 ++ bab11/index.html | 20 ++ bab12/index.html | 20 ++ bab2/index.html | 20 ++ bab3/index.html | 20 ++ bab4/index.html | 20 ++ bab5/index.html | 20 ++ bab6/index.html | 20 ++ bab7/index.html | 20 ++ bab8/index.html | 20 ++ bab9/index.html | 20 ++ index.html | 24 +- search/search_index.json | 2 +- sitemap.xml | 4 + sitemap.xml.gz | Bin 240 -> 246 bytes toc/index.html | 707 +++++++++++++++++++++++++++++++++++++++ 18 files changed, 995 insertions(+), 4 deletions(-) create mode 100755 toc/index.html diff --git a/404.html b/404.html index f9dba50..120c39a 100755 --- a/404.html +++ b/404.html @@ -292,6 +292,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab1/index.html b/bab1/index.html index 06f190f..ae023c3 100755 --- a/bab1/index.html +++ b/bab1/index.html @@ -15,7 +15,7 @@ - + @@ -301,6 +301,26 @@ + + +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + diff --git a/bab10/index.html b/bab10/index.html index 0eb12c8..99f0c16 100755 --- a/bab10/index.html +++ b/bab10/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab11/index.html b/bab11/index.html index 92ca121..2744710 100755 --- a/bab11/index.html +++ b/bab11/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab12/index.html b/bab12/index.html index a33ecf9..2f85fd9 100755 --- a/bab12/index.html +++ b/bab12/index.html @@ -301,6 +301,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab2/index.html b/bab2/index.html index a5bfebb..557d9c4 100755 --- a/bab2/index.html +++ b/bab2/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab3/index.html b/bab3/index.html index 71b2b02..22202ac 100755 --- a/bab3/index.html +++ b/bab3/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab4/index.html b/bab4/index.html index c786d7e..1572fdc 100755 --- a/bab4/index.html +++ b/bab4/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab5/index.html b/bab5/index.html index 8a8b462..d8a0044 100755 --- a/bab5/index.html +++ b/bab5/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab6/index.html b/bab6/index.html index b67b6ea..76c244f 100755 --- a/bab6/index.html +++ b/bab6/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab7/index.html b/bab7/index.html index abc0b8a..175f0e4 100755 --- a/bab7/index.html +++ b/bab7/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab8/index.html b/bab8/index.html index 42d82cd..95070d8 100755 --- a/bab8/index.html +++ b/bab8/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/bab9/index.html b/bab9/index.html index 099a75d..4c39f45 100755 --- a/bab9/index.html +++ b/bab9/index.html @@ -303,6 +303,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • diff --git a/index.html b/index.html index 87e478f..05da52e 100755 --- a/index.html +++ b/index.html @@ -16,7 +16,7 @@ - + @@ -365,6 +365,26 @@ +
  • + + + + + Daftar Isi + + + + +
  • + + + + + + + + +
  • @@ -686,7 +706,7 @@

    Selamat Datang

    Tutorial Belajar MySQL

    Edisi Best Practice

    mysql

    -

    Mulai Belajar

    +

    Mulai Belajar

    diff --git a/search/search_index.json b/search/search_index.json index 8a51357..7745723 100755 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Beranda","text":""},{"location":"#selamat-datang","title":"Selamat Datang","text":""},{"location":"#tutorial-belajar-mysql","title":"Tutorial Belajar MySQL","text":""},{"location":"#edisi-best-practice","title":"Edisi Best Practice","text":"

    Mulai Belajar

    "},{"location":"bab1/","title":"Mendefinisikan Data dengan DML","text":"
    Create - Alter - Drop\n
    "},{"location":"bab1/#membuat-database","title":"Membuat Database","text":"

    Langkah pertama yagn harus kita lakukan adalah membuat database. Kali ini kita akan membuat database baru bernama \"buku_db\".

    CREATE DATABASE buku_db;\n
    Setelah database tercipta, kita perlu mengaktifkan/ memilih database yang akan kita manipulasi.
    USE buku_db;\n

    "},{"location":"bab1/#membuat-tabel","title":"Membuat Tabel","text":"

    Tahap selanjutnya kita perlu membuat beberapa tabel, yaitu:

    Berikut query yang perlu kita jalankan.

    Tabel kategori

    CREATE TABLE kategori(\nkategori_id int not null auto_increment,\nkategori_nama varchar(25),\nprimary key(kategori_id)\n);\n
    Tabel pengarang
    CREATE TABLE pengarang(\npengarang_id char(3) not null,\npengarang_nama varchar(30),\nprimary key(pengarang_id)\n);\n

    Tabel penerbit

    CREATE TABLE penerbit(\npenerbit_id char(4) not null,\npenerbit_nama varchar(50),\nprimary key(penerbit_id)\n);\n

    Tabel buku

    CREATE TABLE buku(\nbuku_isbn char(13) not null,\nbuku_judul varchar(75),\npenerbit_id char(4),\nbuku_tglterbit date,\nbuku_jmlhalaman int,\nbuku_deskripsi text,\nbuku_harga decimal,\nprimary key(buku_isbn),\nforeign key(penerbit_id)\n    references penerbit(penerbit_id)\n);\n

    Tabel link_buku_pengarang

    CREATE TABLE link_buku_pengarang(\nbuku_isbn char(13) not null,\npengarang_id char(3) not null,\nprimary key(buku_isbn, pengarang_id),\nforeign key(buku_isbn)\n    references buku(buku_isbn),\nforeign key(pengarang_id)\n    references pengarang(pengarang_id)\n);\n

    Tabel link_buku_kategori

    CREATE TABLE link_buku_kategori(\nbuku_isbn char(13) not null,\nkategori_id int not null,\nprimary key(buku_isbn, kategori_id),\nforeign key(buku_isbn)\n    references buku(buku_isbn),\nforeign key(kategori_id)\n    references kategori(kategori_id)\n);\n

    "},{"location":"bab1/#query-tambahan","title":"Query Tambahan","text":"

    Mengubah nama tabel

    ALTER TABLE\n    kategori\nRENAME TO\n    kategori_buku;\n
    Menambah kolom
    ALTER TABLE\n    buku\nADD COLUMN\n    buku_sinopsis text;\n

    Mengubah Kolom

    ALTER TABLE\n    buku\nCHANGE\n    buku_isbn buku_id char(15);\n

    Menghapus kolom

    ALTER TABLE\n    buku\nDROP\n    buku_sinopsis;\n

    Menambah primary key

    ALTER TABLE\n    buku\nADD\n    primary key(buku_judul);\n

    Menambah foreign key

    ALTER TABLE\n    link_buku_kategori\nADD\n    foreign key(buku_isbn)\n    references buku(buku_isbn);\n

    Menghapus primary key

    ALTER TABLE\n    buku\nDROP primary key;\n

    Menghapus foreign key

    ALTER TABLE\n    fk_link_buku_kategori;\n

    Menambah indeks

    ALTER TABLE\n    buku\nADD INDEX\n    idx_judul(buku_judul);\n

    Menghapus indeks

    ALTER TABLE\n    buku\nDROP INDEX\n    idx_judul;\n

    Menghapus Tabel

    DROP TABLE IF EXIST\n    link_buku_kategori;\nDROP TABLE\n    link_buku_kategori,\n    link_buku_pengarang;\n

    "},{"location":"bab10/","title":"Prosedur dan Fungsi","text":""},{"location":"bab10/#manfaat-prosedur-dan-fungsi","title":"Manfaat Prosedur dan Fungsi","text":"

    Pembuatan prosedur dan fungsi memiliki beberapa manfaat, di antaranya:

    "},{"location":"bab10/#perbedaan-prosedur-dan-fungsi","title":"Perbedaan Prosedur dan Fungsi","text":"

    Perbedaan antara prosedur dan fungsi terletak pada peruntukan, cara pembuatan dan cara eksekusinya. Berikut hal-hal yang perlu diperhatikan.

    "},{"location":"bab10/#membuat-dan-mengeksekusi-prosedur","title":"Membuat dan Mengeksekusi Prosedur","text":"

    Format pembuatan prosedur pada umumnya sebagaimana berikut.

    CREATE PROCEDURE [nama_prosedur] ([daftar parameter])\nBEGIN\n    [daftar deklarasi variabel]\n    [perintah1];\n    [perintah2]\n    ... dst\nEND;\n
    Sekarang kita coba membuat satu prosedur.
    DELIMITER //\nCREATE PROCEDURE select_penerbit()\nBEGIN\n    SELECT penerbit_nama\n    FROM penerbit\n    WHERE penerbit_id='PB06';\nEND;\n//\n
    Sekarang coba kita jalankan prosedurnya.

    CALL select_penerbit();\n
    Setelah dijalankan, kita tahu bahwa prosedur select_penerbit() tersebut berfungsi untuk menampilkan nama penerbit yang memiliki id penerbit PB06.

    Selanjutnya, kita coba membuat prosedur yang memiliki parameter.

    DELIMITER //\nCREATE PROCEDURE\n    insert_penerbit(id char(4), nama varchar(50))\nBEGIN\n    INSERT INTO penerbit\n    (penerbit_id, penerbit_nama)\n    VALUES (id, nama);\nEND;\n//\n
    Selanjutnya kita coba eksekusi.
    CALL insert_penerbit('PB10','Sinar Terang');\n
    Kita tahu bahwa prosedur yang baru saja kita buat dan kita jalankan berfungsi untuk menambahkan data penerbit. Untuk membuktikannya coba kita cek data penerbit dengan perintah
    SELECT * FROM penerbit;\n
    Tentu saja ada penerbit Sinar Terang dengan penerbit_id PB10 bertengger di baris terakhir.

    "},{"location":"bab10/#membuat-dan-mengeksekusi-fungsi","title":"Membuat dan Mengeksekusi Fungsi","text":"

    Untuk membuat fungsi kita perlu menggunakan CREATE FUNCTION disusul dengan RETURNS dan diakhiri dengan RETURN. Berikut formatnya.

    CREATE FUNCTION\n    [nama_fungsi]([daftar parameter])\nRETURNS [tipe data]\nBEGIN\n    [daftar deklarasi variabel]\n    [perintah1];\n    [perintah2];\n    ... [dst]\n    RETURN [nilai keluaran];\nEND;\n

    RETUNRS [tipe data] berfungsi untuk menentukan tipe data keluaran dari fungsi tersebut. Semisal kita ingin emngembalikan nilai berupa bilangan bulat, berarti kita perlu menulis RETURNS INT.

    Mari kita buat contohnya.

    CREATE FUNCTION harga_buku(isbn CHAR(13))\n    RETURNS DECIMAL(10, 0) DETERMINISTIC\nBEGIN\n-- Mendeklarasikan veriabel\nDECLARE harga DECIMAL(10,0);\n\n-- Seleksi data dan menampung hasilnya ke dalam variabel\nSELECT buku_harga INTO harga\nFROM buku\nWHERE buku_isbn = isbn;\n\n-- Mengembalikan nilai hasil proses\nRETURN harga;\n\nEND;\n//\n
    Selanjutnya, coba kita eksekusi.
    SELECT harga_buku('222-34222-1-0');\n

    Ingin lebih jelas? kita coba begini.

    SELECT harga_buku('222-34222-1-0')\nAS 'Harga Buku';\n

    Kita juga bisa memanggil fungsi di dalam ekspresi secara langsung. Contoh:

    SET total = harga_buku('222-34222-1-0') * 2;\n
    Dalam contoh tersebut, pemanggilan fungsi secara langsung digunakan untuk proses perkalian dengan bilangan lain. Dengan demikian, eksekusi fungsi perlakuannya sama dengan penggunaan variabel normal.

    "},{"location":"bab10/#menghapus-prosedur-dan-fungsi","title":"Menghapus Prosedur dan Fungsi","text":"

    Kita gunakan DROP PROCEDURE untuk menghapus prosedur, dan DROP FUNCTION untuk menghapus fungsi, diikuti nama prosedur ataupun fungsi. Contoh:

    -- Menghapus prosedur\nDROP PROCEDURE select_penerbit;\n\n-- Menghapus fungsi\nDROP FUNCTION harga_buku;\n
    "},{"location":"bab10/#menampilkan-daftar-prosedur-dan-fungsi","title":"Menampilkan Daftar Prosedur dan Fungsi","text":"

    Ada beberapa variasi perintah di dalam MySQL untuk menampilkan prosedur maupun fungsi.

    Query-1

    Menampilkan seluruhprosedur yang tersimpan di dalam database beserta properti dan informasi metadata lainnya.

    SHOW PROCEDURE STATUS;\n

    Query-2

    Menampilkan prosedur berdasarkan filter yang dilakukan menggunakan klausa LIKE.

    SHOW PROCEDURE STATUS\nWHERE name LIKE 'insert';\n

    Query-3

    Menampilkan seluruh fungsi yang tersimpan dalam database, beserta properti dan informasi metadata dari fungsi-fungsi tersebut.

    SHOW FUNCTION STATUS;\n

    "},{"location":"bab10/#hak-akses-untuk-bekerja-dengan-prosedur-dan-fungsi","title":"Hak Akses untuk Bekerja dengan Prosedur dan Fungsi","text":"

    Untuk bekerja menggunakan prosedur dan fungsi kita perlu memiliki beberapa hak akses berikut.

    "},{"location":"bab10/#variabel-di-dalam-prosedur-dan-fungsi","title":"Variabel di dalam Prosedur dan Fungsi","text":""},{"location":"bab10/#pemilihan-dalam-prosedur-dan-fungsi","title":"Pemilihan dalam Prosedur dan Fungsi","text":""},{"location":"bab10/#perintah-if","title":"Perintah IF","text":"

    Bentuk umum perintah IF adalah:

    Bentuk 1

    IF [kondisi] THEN\n    [daftar aksi]\nEND IF\n

    Ini adalah bentuk yang paling sederhana, karena hanya memiliki satu kondisi untuk diperiksa. Jika ekspresi bernilai benar, maka daftar aksi akan dieksekusi, namun jika salah, maka aksi tidak akan dijalankan.

    Bentuk 2

    IF [kondisi] THEN\n    [daftar aksi1]\nELSEIF [kondisi2] THEN\n    [daftar aksi2]\nELSE [daftar aksi3]\nEND IF\n
    Ini adalah bentuk yang sedikit lebih kompleks. Jika kondisi1 bernilai benar, maka daftar aksi1 akan dijalankan. Jika tidak, maka akan dilanjutkan pengecekan kondisi2, jika benar, maka daftar aksi2 akan dijalankan. Jika tidak maka daftar aksi3 yang akan dijalankan.

    Kita coba contoh berikut.

    DELIMITER //\nCREATE FUNCTION get_penerbit9isbn CHAR(13)\n    RETURNS VARCHAR(50) DETERMINISTIC\nBEGIN\n    DECLARE namapenerbit VARCHAR(50);\n    SELECT b.penerbit_nama INTO namapenerbit\n    FROM\n        buku a,\n        penerbit b\n    WHERE\n        a.penerbit_id = b.penerbit_id\n        AND\n        a.buku_isbn = isbn;\n\n    IF namapenerbit IS NULL THEN\n        SET namapenerbit = '';\n    END IF;\n\n    RETURN namapenerbit;\nEND;\n//\n

    Penjelasan Kode

    Inti penggunaan IF pada kode di atas adalah, jika namapenerbit bernilai NULL maka variabel namapenerbit akan diisi dengan nilai string kosong.

    Sekarang coba kita tes fungsi tersebut.

    SELECT get_penerbit('222-34222-1-0');\n
    "},{"location":"bab10/#perintah-case","title":"Perintah CASE","text":"

    Format penggunaan CASE adalah sebagai berikut.

    CASE [ekspresi]\n    WHEN [nilai1]\n    THEN [daftar aksi1];\n    WHEN [nilai2]\n    THEN [daftar aksi2];\n    ...[dst]\n\n    ELSE [daftar aksi]\nEND CASE\n

    Penjelasan Kode

    Jika ekspresi yang diperiksa memiliki nilai yang sama dengan nilai1, maka yang akan dieksekusi adalah daftar aksi1. Jika ekspresi sama dengan nilai2, maka yang akan dieksekusi adalah daftar aksi2, dan seterusnya.

    Jika semua nilai konstan yang didefinisikan tidak ada yang sama dengan ekspresi, maka yang akan dieksekusi adalah daftar aksi yang terdapat pada bagian ELSE.

    Sekarang kita coba menerapkan CASE dengan fungsi berikut.

    DELIMITER //\nCREATE FUNCTION ubah_format_tanggal(tanggal DATE)\n    RETURNS VARCHAR(30) DETERMINISTIC\nBEGIN\n    DECLARE dd INT(2);\n    DECLARE mm INT(2);\n    DECLARE yy INT(4);\n    DECLARE bulan VARCHAR(9);\n\n    SET dd = EXTRACT(DAY FROM tanggal);\n    SET mm = EXTRACT(MONTH FROM tanggal);\n    SET yy = EXTRACT(YEAR FROM tanggal);\n\n    CASE mm\n        WHEN 1 THEN SET bulan = 'Januari';\n        WHEN 2 THEN SET bulan = 'Februari';\n        WHEN 3 THEN SET bulan = 'Maret';\n        WHEN 4 THEN SET bulan = 'April';\n        WHEN 5 THEN SET bulan = 'Mei';\n        WHEN 6 THEN SET bulan = 'Juni';\n        WHEN 7 THEN SET bulan = 'Juli';\n        WHEN 8 THEN SET bulan = 'Agustus';\n        WHEN 9 THEN SET bulan = 'September';\n        WHEN 10 THEN SET bulan = 'Oktober';\n        WHEN 11 THEN SET bulan = 'November';\n        WHEN 12 THEN SET bulan = 'Desember';\n    END CASE;\n\n    RETURN CONCAT(\n        CONVERT(dd, CHAR),\n        ' ',\n        bulan,\n        ' ' ,\n        CONVERT(yy, CHAR)\n    );\nEND\n//\n

    Penjelasan Kode

    Fungsi di atas berguna untuk mengubah format tanggal yang dilewatkan sebagai parameter, dari bentuk standar (dalam format angka) ke bentuk tanggal yang menggunakan nama bulan.

    Sekarang mari kita coba gunakan fungsi tersebut.

    SELECT\n    buku_judul \"Judul\",\n    ubah_format_tanggal(buku_tgl_terbit) \"Tanggal Terbit\",\n    buku_harga \"Harga\"\nFROM\n    buku;\n
    Sebagai perbandingan, coba kita jalankan query di atas tanpa menggunakan fungsiubah_format_tanggal.

    SELECT\n    buku_judul \"Judul\",\n    buku_tgl_terbit \"Tanggal Terbit\",\n    buku_harga \"Harga\"\nFROM\n    buku;\n
    "},{"location":"bab10/#pengulangan-dalam-prosedur-dan-fungsi","title":"Pengulangan dalam Prosedur dan Fungsi","text":"

    Satu atau beberapa aksi dapat dieksekusi secara berulang menggunakan blok perulangan. Di dalam MySQL blok perulangan dapat dibuat menggunakan:

    "},{"location":"bab10/#perintah-loop","title":"Perintah LOOP","text":"

    Berikut format sintaksnya

    LOOP\n    [daftar aksi];\nEND LOOP\n

    Mari langsung kita buat contohnya dengan memasukkan LOOP ke dalam sebuah fungsi.

    DELIMITER //\nCREATE FUNCTION jumlahkan(n INT)\n    RETURNS int(11) DETERMINISTIC\nBEGIN\n    DECLARE i INT DEFAULT 0;\n    DECLARE total INT DEFAULT 0;\n    myloop: LOOP\n        SET i = i + 1;\n        IF i > n THEN\n            -- keluar dari perulangan\n            LEAVE myloop;\n        END IF;\n        SET total = total + i;\n    END LOOP myoop;\n\n    RETURN total;\nEND;\n//\n

    Penjelasan Kode

    Kita memberi label pada badan perulangan dengan nama myloop. Fungsi di atas berguna untuk menjumlahkan n buah bilangan positif pertama.

    Sebagai contoh, jika n bernilai 5, maka hasilnya adalah 15, berasal dari 1 + 2 + 3 + 4 + 5.

    Sekarang, kita coba eksekusi fungsi LOOP tersebut.

    SELECT jumlahkan(5);\n
    "},{"location":"bab10/#perintah-while","title":"Perintah WHILE","text":"

    Bentuk umum sintaksnya adalah

    WHILE [kondisi] DO\n    [daftar aksi];\nENd WHILE\n

    Mari kita buat fungsi yang mengandung WHILE

    DELIMITER //\nCREATE FUNCTION jumlahkan_while(n INT)\n    RETURNS int(11) DETERMINISTIC\nBEGIN\n    DECLARE i INT DEFAULT 1;\n    DECLARE total INT DEFAULT 0;\n    WHILE (i <= n) DO\n        SET total = total + i;\n        SET i = i + 1;\n    END WHILE;\n\n    RETURN total;\nEND;\n//\n

    Penjelasan Kode

    Fungsi di atas merupakan modifikasi dari kode program sebelumnya. Perbedaannya, kali ini kita menggunakan perintah WHILE dalam proses pengulangan aksinya. Hasil yang diperoleh sama seperti pada fungsi sebelumnya.

    "},{"location":"bab10/#perintah-repeat","title":"Perintah REPEAT","text":"

    Format sintaks REPEAT sebagai berikut.

    REPEAT\n    [daftar aksi]\nUNTIL [kondisi]\nEND REPEAT\n
    Sekarang, mari kita coba implementasikan ke dalam sebuah fungsi.

    DELIMITER //\nCREATE FUNCTION jumlahkan_repeat(n INT)\n    RETURNS int(11) DETERMINISTIC\nBEGIN\n    DECLARE i INT DEFAULT 1;\n    DECLARE total INT DEFAULT 0;\n\n    REPEAT\n        SET total = total + i;\n        SET i = i + 1;\n    UNTIL (i > n)\n    END REPEAT;\n\n    RETURN total;\nEND;\n//\n

    Penjelasan Kode

    Ketika dieksekusi, cara kerja fungsi di atas akan sama seperti dua fungsi sebelumnya \ud83d\ude02

    "},{"location":"bab10/#perintah-leave-dan-iterate","title":"Perintah LEAVE dan ITERATE","text":"

    Mari kita coba terapkan keduanya pada fungsi berikut.

    DELIMITER //\nCREATE PROCEDURE tampilkan_bil_genap(n INT)\nBEGIN\n    DECLARE i INT DEFAULT 0;\n    DECLARE str VARCHAR(200) DEFAULT '';\n    next: LOOP\n        SET i = i + 1;\n        IF (i mod 2 = 1) THEN\n            ITERATE next;\n        END IF;\n        IF (i > n) THEN\n            LEAVE next;\n        END IF;\n        SET str = CONCAT(str, CONVERT(i, CHAR), ' ');\n    ENd LOOP next;\n    SELECT str AS \"Bilangan Genap\";\nEND;\n//\n

    Penjelasan Kode

    Pada kode di atas, kita membuat sebuah prosedur yang dapat menampilkan bilangan genap yang terdapat antara bilangan 1 dan n. Nilai n ditentukan pada saat pemanggilan prosedur.

    Sekarang kita coba panggil prosedur di atas.

    CALL tampilkan_bil_genap(50);\n

    Tentu saja

    Perintah tersebut akan menampilkan bilangan genap aygn berada dalam rentang 1 dan 20.

    "},{"location":"bab11/","title":"Trigger","text":"

    Sebelum lebih lanjut membahas trigger, ada baiknya kita siapkan dulu tabel khusus untuk operasi trigger nantinya.

    USE buku_db;\n\nCREATE TABLE histori_buku(\n    buku_isbn CHAR(13),\n    buku_judul VARCHAR(75),\n    penerbit_id CHAR(4),\n    buku_tglterbit DATE,\n    buku_jmlhalaman INT,\n    buku_deskripsi TEXT,\n    buku_harga DECIMAL(10, 0),\n    aksi varchar(6),\n    aksi_tgl DATE\n);\n
    "},{"location":"bab11/#alasan-menggunakan-trigger","title":"Alasan Menggunakan Trigger","text":"

    Beberapa alasan kita menggunakan trigger adalah:

    Selain ketiga manfaat di atas, Trigger juga dapat meringankan kode di bagian aplikasi atau stored procedure yang dikembangkan. Kita tidak perlu menulis kode program di dalam aplikasi untuk melakukan validasi data.

    "},{"location":"bab11/#konsep-trigger","title":"Konsep Trigger","text":"

    Beberapa konsep yang perlu diketahui dan dipahami tentang trigger yaitu:

    "},{"location":"bab11/#daftar-event-untuk-aktivasi-trigger","title":"Daftar Event untuk Aktivasi Trigger","text":"Event Keterangan BEFORE INSERT Trigger diaktivasi sebelum data ditambahkan ke dalam suatu tabel. AFTER INSERT Trigger diaktivasi setelah data ditambahkan ke dalam suatu tabel. BEFORE UPDATE Trigger diaktivasi sebelum data dalam suatu tabel diubah. AFTER UPDATE Trigger diaktivasi setelah data daalam suatu tabel diubah. BEFORE DELETE Trigger diaktivasi sebelum data dihapus daru suatu tabel. AFTER DELETE Trigger diaktivasi setelah data dihapus dari suatu tabel."},{"location":"bab11/#membuat-trigger","title":"Membuat Trigger","text":"

    Format pembuatan trigger adalah

    CREATE TRIGGER [nama_trigger]\n[BEFORE | AFTER]\n[INSERT | UPDATE | DELETE]\nON [nama_tabel]\nFOR EACH ROW\nBEGIN\n    [badan trigger]\nEND\n
    Sekarang mari kita buat trigger nya.

    DELIMITER $$\nCREATE TRIGGER tr_ai_buku\nAFTER INSERT\nON BUKU\nFOR EACH ROW\nBEGIN\n    INSERT INTO histori_buku VALUES (\n    new.buku_isbn,\n    new.buku_judul,\n    new.penerbit_id,\n    new.buku_tglterbit,\n    new.buku_jmlhalaman,\n    new.buku_deskripsi,\n    new.buku_harga,\n    'INSERT',\n    CURRENT_DATE()\n    );\nEND $$\n

    Penjelasan Kode

    "},{"location":"bab11/#memeriksa-pengaruh-trigger","title":"Memeriksa Pengaruh Trigger","text":"

    Untuk memeriksa pengaruh daripada trigger, sekarang kita coba memasukkan sampel data ke dalam tabel buku.

    INSERT INTO buku VALUES(\n    '999-11555-2-2',\n    'Microsoft Excell',\n    'PB04',\n    '2009/02/07',\n    200,\n    NULL,\n    60000\n);\n
    Ketika perintah tersebut dijalankan dan tidak terjadi error maka harusnya datanya masuk ke dalam tabel buku dan ada data baru di tabel histori_buku. Mari kita cek.

    SELECT * FROM histori_buku;\n
    "},{"location":"bab11/#referensi-trigger-new-old","title":"Referensi Trigger : NEW-OLD","text":"

    Referensi NEW dan OLD berguna untuk mengambil:

    Sebagai contoh:

    INSERT INTO\n    penerbit (penerbit_id, penerbit_nama)\nVALUES\n    ('PB06','INFORMATIKA');\n

    Jika perintah di atas dieksekusi maka MySQL akan menyimpan nilai-nilai tersebut ke dalam referensi NEW. Dengan demikian new.penerbit_id akan bernilai PB06 dan new.penerbit_nama akan bernilai INFORMATIKA.

    Contoh lagi

    UPDATE penerbit\n    SET penerbit_nama = 'Informatika Bandung'\nWHERE\n    penerbit_id = 'PB06';\n

    Contoh lagi

    DELETE FROM penerbit\nWHERE penerbit_id = 'PB06';\n

    Kesimpulan

    "},{"location":"bab11/#menghapus-trigger","title":"Menghapus Trigger","text":"

    Untuk menghapus trigger kita bisa menggunakan perintah DROP TRIGGER dengan format

    DRPO TRIGGER [nama_database].[nama_trigger];\n

    Mari kita coba

    DROP TRIGGER buku_db.tr_ai_buku;\n

    Sebenarnya kita bisa juga menghapus trigger tanpa mencantumkan nama databasenya, asalkan saat ini kita sedang mengaktifkan/ menggunakan databasenya.

    DROP TRIGGER tr_ai_buku;\n
    "},{"location":"bab11/#hak-akses-trigger","title":"Hak Akses Trigger","text":""},{"location":"bab11/#batasan-trigger","title":"Batasan Trigger","text":"

    Kita sudah tahu bahwasanya menggunakan trigger dapat membantu pekerjaan kita, namun kita perlu tahu juga bahwasanya trigger juga memiliki beberapa batasan berikut.

    "},{"location":"bab11/#implementasi-trigger","title":"Implementasi Trigger","text":"

    Trigger AFTER UPDATE

    Membuat trigger tr_au_buku yang akan diaktivasi setiap kali user mengubah data pada tabel buku.

    DELIMITER $$\nCREATE TRIGGER tr_au_buku\nAFTER UPDATE\nON buku\nFOR EACH ROW\nBEGIN\n    DECLARE isbn CHAR(13);\n    DECLARE judul VARCHAR(75);\n    DECLARE penerbit_id CHAR(4);\n    DECLARE tgl_terbit DATE;\n    DECLARE jml_halaman INT;\n    DECLARE deskripsi TEXT;\n    DECLARE harga DECIMAL(10,0);\n\n    -- Mengisi nilai isbn\n    IF new.buku_isbn IS NULL THEN\n        SET isbn = old.buku_isbn;\n    ELSE\n        SET isbn = new.buku_isbn;\n    END IF;\n\n    -- mengisi nilai judul\n    IF new.buku_judul IS NULL THEN\n        SET judul = old.buku_judul;\n    ELSE\n        SET judul = new.buku_judul;\n    END IF;\n\n    -- mengisi nilai penerbit_id\n    IF new.penerbit_id IS NULL THEN\n        SET penerbit_id = old.penerbit_id;\n    ELSE\n        SET penerbit_id = new.penerbit_id;\n    END IF;\n\n    -- mengisi nilai tgl_terbit\n    IF new.buku_tglterbit IS NULL THEN\n        SET tgl_terbit = old.buku_tglterbit;\n    ELSE\n        SET tgl_terbit = new.buku_tglterbit;\n    END IF;\n\n    -- mengisi nilai jml_halaman\n    IF new.buku_jmlhalaman IS NULL THEN\n        SET jml_halaman = old.buku_jmlhalaman;\n    ELSE\n        SET jml_halaman = new.buku_jmlhalaman;\n    END IF;\n\n    -- mengisi nilai deskripsi\n    IF new.buku_deskripsi IS NULL THEN\n        SET deskripsi = old.buku_deskripsi;\n    ELSE\n        SET deskripsi = new.buku_deskripsi;\n    END IF;\n\n    -- mengisi nilai harga\n    IF new.buku_harga IS NULL THEN\n        SET harga = old.buku_harga;\n    ELSE\n        SET harga = new.buku_harga;\n    END IF;\n\n    -- memasukkan data ke dalam tabel histori_buku\n    INSERT INTO histori_buku\n    VALUES (\n        isbn,\n        judul,\n        penerbit_id,\n        tgl_terbit,\n        jml_halaman,\n        deskripsi,\n        harga,\n        'UPDATE',\n        CURRENT_DATE()\n    );   \n\nEND $$\n

    Trigger AFTER DELETE

    Membuat trigger tr_ad_buku yang akan diaktivasi setiap kali user mengubah data pada tabel buku.

    DELIMITER $\nCREATE TRIGGER tr_ad_buku\nAFTER DELETE\nON buku\nFOR EACH ROW\nBEGIN\n    INSERT INTO histori_buku VALUES(\n        old.buku_isbn,\n        old.buku_judul,\n        old.penerbit_id,\n        old.buku_tglterbit,\n        old.buku_jmlhalaman,\n        old.buku_deskripsi,\n        old.buku_harga,\n        'DELETE',\n        CURRENT_DATE()\n    );\nEND $$\n

    Sebagai percobaan, sekarang kita coba mengubah data pada tabel buku.

    UPDATE buku\nSET penerbit_id = 'PB05',\n    buku_jmlhalaman = 254,\n    buku_harga = 64000\nWHERE\n    buku_isbn = '999-11555-2-2';\n

    Selanjutnya, kita coba menghapus data dari tabel buku.

    DELETE FROM buku\nWHERE buku_isbn = '999-11555-2-2';\n

    Harusnya ada tambahan 2 baris data pada tabel histori_buku. Sekarang mari kita cek.

    SELECT * FROM histori_buku;\n

    Trigger BEFORE INSERT

    DELIMITER $$\nCREATE TRIGGER tr_bi_buku\nBEFORE INSERT\nON buku\nFOR EACH ROW\nBEGIN\n    IF new.buku_jmlhalaman <= 149 THEN\n        SIGNAL SQLSTATE '45000'\n            SET MESSAGE_TEXT = 'Tidak bisa menambah buku, jumlah halaman terlalu sedikit.';\n    END IF;\nEND $$\n

    Untuk membuktikan pengaruh trigger tersebut, sekarang kita coba tambahkan data buku baru.

    INSERT INTO buku VALUES(\n    '999-11555-2-3',\n    'Microsoft Publisher',\n    'PB04',\n    '2021/02/07',\n    100,\n    NULL,\n    6000\n);\n

    Hasilnya? \ud83d\ude0e

    "},{"location":"bab12/","title":"Ekspor dan Impor","text":""},{"location":"bab12/#mengekspor-data","title":"Mengekspor Data","text":""},{"location":"bab12/#menggunakan-mysqldump","title":"Menggunakan mysqldump","text":""},{"location":"bab12/#menggunakan-mysqlhotcopy","title":"Menggunakan mysqlhotcopy","text":""},{"location":"bab12/#menyalin-file-data","title":"Menyalin File Data","text":""},{"location":"bab12/#menggunakan-backup-table","title":"Menggunakan BACKUP TABLE","text":""},{"location":"bab12/#mengimpor-data","title":"Mengimpor Data","text":""},{"location":"bab2/","title":"Manipulasi Data Dengan DML","text":"
    INSERT, UPDATE, DELETE\n
    "},{"location":"bab2/#memasukkan-data-tabel","title":"Memasukkan Data Tabel","text":""},{"location":"bab2/#tabel-kategori","title":"Tabel Kategori","text":"
    INSERT INTO kategori (kategori_nama) VALUES\n('Database'),\n('Desain Grafis'),\n('Jaringan Komputer'),\n('Pemrograman'),\n('Web dan Internet'),\n('Office Application');\n
    "},{"location":"bab2/#tabel-pengarang","title":"Tabel Pengarang","text":"
    INSERT INTO pengarang VALUES\n('P01','Andi Setiawan'),\n('P02','Rudi Wicaksono'),\n('P03','Beni Tito'),\n('P04','Prasetya'),\n('P05','Erik Rusdianto'),\n('P06','Rosdiana'),\n('P07','Fredi Hidayat'),\n('P08','Hasanudin'),\n('P09','Ahmad hanafi'),\n('P10','Iwan Gunardi'),\n('P11','Iman Teguh'),\n('P12','Abdul Ghozali'),\n('P13','Tegar Sanjaya');\n
    "},{"location":"bab2/#tabel-penerbit","title":"Tabel Penerbit","text":"
    INSERT INTO penerbit VALUES\n('PB01','Angkasa Raya'),\n('PB02','Cahaya Ilmu Persada'),\n('PB03','Sinar Ilmu Perkasa'),\n('PB04','Intan'),\n('PB05','Sinar Raya'),\n('PB06','Informatika'),\n('PB07','Tiga Sekawan'),\n('PB08','Cipta Ilmu');\n
    "},{"location":"bab2/#tabel-buku","title":"Tabel Buku","text":"
    INSERT INTO buku VALUES\n('222-34222-1-0','Belajar Photoshop','PB01','2019/07/02',300,NULL,42000),\n('222-34222-1-1','Panduan CorelDRAW','PB02','2020/03/15',400,NULL,55000),\n('979-96446-9-0','Belajar SQL','PB06','2019/10/12',346,NULL,45000),\n('979-96446-9-1','Panduan Basis Data','PB01','2017/03/02',257,NULL,37000),\n('979-96446-9-2','Perancangan Sistem','PB03','2013/09/20',403,NULL,37000),\n('979-96446-9-3','Microsoft Access','PB06','2015/07/13',400,NULL,48500),\n('888-96771-3-0','Pemrograman Pascal','PB08','2014/11/01',350,NULL,50000),\n('888-96771-3-1','Pemrograman Java','PB06','2017/01/23',450,NULL,72000),\n('888-96771-3-2','Pemrograman C untuk Hardware','PB05','2016/12/25',398,NULL,47000),\n('888-96771-3-3','Panduan C++','PB06','2015/07/15',490,NULL,65000),\n('888-96771-3-4','Belajar Delphi','PB05','2018/08/11',328,NULL,50000),\n('888-96771-3-5','Visual Basic','PB02','2017/10/14',250,NULL,50000),\n('666-96771-2-0','Panduan Membangun Jaringan TCP/IP','PB08','2016/08/02',200,NULL,60000),\n('666-96771-2-1','Implementasi TCP/IP di Linux','PB08','2018/11/21',230,NULL,350000),\n('777-76723-5-0','Belajar PHP 8','PB07','2020/05/02',600,NULL,95000),\n('777-76723-5-1','Aplikasi Web dengan Python','PB07','2014/08/01',180,NULL,30000),\n('777-76723-5-2','Internet Marketing','PB07','2017/01/24',150,NULL,38500),\n('777-76723-5-3','Panduan Menjadi Youtuber','PB07','2017/01/24','243',NULL,38500),\n('999-11555-2-0','Microsoft Power Point','PB06','2018/11/23',300,NULL,57500),\n('999-11555-2-1','Microsoft Word','PB04','2017/12/01',270,NULL,60000);\n
    "},{"location":"bab2/#tabel-link-buku-pengarang","title":"Tabel Link Buku Pengarang","text":"
    INSERT INTO link_buku_pengarang VALUES\n('222-34222-1-0','P01'),\n('222-34222-1-1','P04'),\n('666-96771-2-0','P04'),\n('666-96771-2-0','P07'),\n('666-96771-2-0','P06'),\n('666-96771-2-1','P04'),\n('666-96771-2-1','P01'),\n('777-76723-5-0','P02'),\n('777-76723-5-0','P04'),\n('777-76723-5-1','P03'),\n('777-76723-5-1','P12'),\n('777-76723-5-1','P10'),\n('777-76723-5-2','P13'),\n('777-76723-5-3','P08'),\n('777-76723-5-3','P09'),\n('888-96771-3-0','P04'),\n('888-96771-3-1','P02'),\n('888-96771-3-1','P11'),\n('888-96771-3-2','P01'),\n('888-96771-3-2','P06'),\n('888-96771-3-3','P02'),\n('888-96771-3-4','P10'),\n('888-96771-3-4','P09'),\n('888-96771-3-5','P02'),\n('979-96446-9-0','P11'),\n('979-96446-9-0','P02'),\n('979-96446-9-1','P07'),\n('979-96446-9-2','P13'),\n('979-96446-9-2','P10'),\n('979-96446-9-2','P12'),\n('979-96446-9-2','P03'),\n('979-96446-9-3','P11'),\n('999-11555-2-0','P11'),\n('999-11555-2-0','P13'),\n('999-11555-2-1','P08'),\n('999-11555-2-1','P09'),\n('999-11555-2-1','P10'),\n('999-11555-2-1','P06');\n
    "},{"location":"bab2/#tabel-link-buku-kategori","title":"Tabel Link Buku Kategori","text":"
    INSERT INTO link_buku_kategori VALUES\n('222-34222-1-0',2),\n('222-34222-1-1',2),\n('979-96446-9-0',1),\n('979-96446-9-1',1),\n('979-96446-9-2',1),\n('979-96446-9-2',4),\n('979-96446-9-3',1),\n('888-96771-3-0',4),\n('888-96771-3-1',4),\n('888-96771-3-2',4),\n('888-96771-3-3',4),\n('888-96771-3-4',4),\n('888-96771-3-5',4),\n('666-96771-2-0',3),\n('666-96771-2-1',3),\n('777-76723-5-0',4),\n('777-76723-5-0',5),\n('777-76723-5-1',4),\n('777-76723-5-1',5),\n('777-76723-5-2',5),\n('777-76723-5-3',5),\n('999-11555-2-0',6),\n('999-11555-2-1',6);\n
    "},{"location":"bab2/#query-tambahan","title":"Query Tambahan","text":""},{"location":"bab2/#mengubah-data","title":"Mengubah Data","text":"

    Mengubah Data Tabel Penerbit

    UPDATE penerbit\n    SET penerbit_nama = 'Informatika Bandung'\nWHERE\n    penerbit_id = 'PB06';\n

    Mengubah Data Tabel Buku

    UPDATE buku\n    SET buku_judul = 'Tuntunan Praktis Menggunakan Microsoft Word 2010',\n        penerbit_id = 'PB02'\nWHERE\n    buku_isbn = '999-11555-2-1';\n

    "},{"location":"bab2/#menghapus-data","title":"Menghapus Data","text":"

    Menghapus 1 Baris Data

    DELETE FROM buku\nWHERE buku_isbn = '888-96771-3-5';\n

    Menghapus Seluruh Baris Data

    DELETE FROM buku;\n

    Menghapus tabel beserta isinya, lalu mere-build ulang tabel tanpa data

    TRUNCATE table buku;\n

    "},{"location":"bab3/","title":"Kontrol Hak Akses & Transaksi Data","text":"
    TCL : Grant, Revoke, Commit, Rollback\n
    INSERT INTO test VALUES\n(1,'Baris Pertama'),\n(2,'Baris Ke dua'),\n(3,'Baris ke tiga');\n
    COMMIT;\n
    INSERT INTO test VALUES\n(4,'Baris ke empat'),\n(5,'Baris ke lima'),\n(6,'Baris ke enam');\n
    ROLLBACK;\n
    "},{"location":"bab4/","title":"Seleksi Data - Bagian 1","text":""},{"location":"bab4/#perintah-select","title":"Perintah SELECT","text":"

    Menampilkan seluruh kolom dan data dalam tabel

    SELECT * FROM buku;\n

    Menampilkan beberapa kolom dari tabel buku

    SELECT  buku_isbn,\n        buku_judul,\n        penerbit_id,\n        buku_tglterbit,\n        buku_jmlhalaman,\n        buku_deskripsi,\n        buku_harga\nFROM\n    buku;\n

    Menampilkan beberapa kolom dari tabel buku dan memberi alias

    SELECT  buku_isbn ISBN,\n        buku_judul JUDUL,\n        penerbit_id PENERBIT,\n        buku_tglterbit TERBIT,\n        buku_jmlhalaman HALAMAN,\n        buku_deskripsi DESKRIPSI,\n        buku_harga HARGA\nFROM\n    buku;\n

    Menampilkan seluruh data dari beberapa kolom

    SELECT\n    buku_harga,\n    buku_judul\nFROM\n    buku;\n

    Menampilkan seluruh data dari beberapa kolom dan memberi alias

    SELECT\n    buku_harga HARGA,\n    buku_judul JUDUL\nFROM\n    buku;\n

    Menyertakan nama database dan tabel dalam perintah SELECT

    SELECT\n    buku.buku_isbn,\n    buku.buku_judul,\n    buku.buku_harga\nFROM\n    buku_db.buku;\n

    Menggunakan Alias tabel

    SELECT\n    a.buku_isbn,\n    a.buku_judul,\n    a.buku_harga\nFROM\n    buku a;\n

    Menggunakan Alias pada nama kolom

    SELECT\n    buku_isbn as 'ISBN',\n    buku_judul as 'JUDUL BUKU',\n    buku_harga as 'HARGA'\nFROM\n    buku;\n

    "},{"location":"bab4/#menyaring-data","title":"Menyaring Data","text":"

    Data yang ditampilkan dapat disaring (filter) berdasarkan kebutuhan informasi yang akan disajikan. Untuk menyaring data, perlu didefinisikan kondisi yang akan dijadikans ebagai kriteria penyaringan. Dalam perintah SELECT ditambah klausa WHERE setelahnya.

    Contoh 1 Menampilkan data buku yang harganya kurang dari Rp. 45.000

    SELECT\n    buku_isbn as 'ISBN',\n    buku_judul as 'JUDUL BUKU',\n    buku_harga as 'HARGA'\nFROM\n    buku\nWHERE\n    buku_harga < 45000;\n

    Menampilkan data buku yang harganya kurang dari Rp. 45.000 dan ISBN diawali oleh angka 777

    SELECT\n    buku_isbn as 'ISBN',\n    buku_judul as 'JUDUL BUKU',\n    buku_harga as 'HARGA'\nFROM\n    buku\nWHERE\n    (buku_harga < 45000) AND\n    (buku_isbn LIKE '777%');\n

    Menampilkan data dengan rentang tertentu Menggunakan klausa BETWEEN

    Contoh BETWEEN 1

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nWHERE\n    buku_harga\n    BETWEEN 50000 AND 60000;\n

    Contoh BETWEEN 2

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nWHERE\n    (buku_harga >= 50000) AND\n    (buku_harga <= 60000);\n

    "},{"location":"bab4/#klausa-limit","title":"Klausa LIMIT","text":"

    LIMIT digunakan untuk membatasi data yang disajikan sesuai batas limit yang ditentukan terurut dari atas.

    Contoh LIMIT 1

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nLIMIT 5;\n

    LIMIT juga bisa membatasi data yang dimulai dari baris tertentu. Contoh LIMIT 2 Membatasi 10 data dimulai dari urutan ke-6

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nLIMIT 5,10;\n

    "},{"location":"bab4/#klausa-distinct","title":"Klausa DISTINCT","text":"

    Klausa ini berfungsi untuk menghilangkan data yang dobel saat disajikan.

    Contoh sebelum diberi DISTINCT

    SELECT penerbit_id FROM buku;\n

    Setelah diberi klausa DISTINCT

    SELECT DISTINCT penerbit_id FROM buku;\n

    "},{"location":"bab4/#mengurutkan-data","title":"Mengurutkan Data","text":"

    Secara default data yang disajikan menggunakan printah SELECT akan ditmpilkan sesuai urutan data dimasukkan, kecuali pada kolom yang diatur sebagai primary key, maka dia akan urut sesui bilangan. Untuk mengurutkan data sesuai kolom tertentu kita bisa menggunakan klausa ORDER BY.

    Contoh Penggunaan ORDER BY Mengurutkan datan sesuai kolom 'buku_judul'

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nORDER BY\n    buku_judul;\n

    Pengurutan data dari terkecil ke terbesar (Ascending)

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nORDER BY\n    buku_judul ASC;\n

    Pengurutan data dari terbesar ke terkecil (Descending)

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nORDER BY\n    buku_judul DESC;\n

    "},{"location":"bab5/","title":"Seleksi Data - Bagian 2","text":""},{"location":"bab5/#pengelompokan-data-menggunakan-group-by","title":"Pengelompokan Data menggunakan GROUP BY","text":"

    Penggunaan kalusa GROUP BY disertakan dalam perintah SELECT - Contoh 1

    SELECT\n    penerbit_id,\n    COUNT(*)\nFROM\n    buku\nGROUP BY\n    penerbit_id;\n
    Jumlah buku yang ditampilkan dari hasil kode di atas adalah hasil dari proses pengelompokan brdasarkan penerbit (dalam hal ini kolom penerbit_id).

    GROUP CONCAT() adalah fungsi agregasi yagn berguna untuk mengelompokkan baris data menjadi satu teks (string) tunggal.

    "},{"location":"bab5/#menggabungkan-data","title":"Menggabungkan Data","text":"

    Proses menggabungkan 2 query select menjadi 1 dengan perintah UNION dengan syarat masing-masing query select menghasilkan jumlah row data yang sama.

    "},{"location":"bab5/#join-seleksi-data-dari-2-tabel-atau-lebih","title":"Join : Seleksi Data dari 2 Tabel atau Lebih","text":"

    Seleksi data dari 2 tabel atau lebih, lebih rumit dibandingkan seleksi data dari 1 tabel. Syarat utamanya adalah adanya kolom relasi. Kolom relasi adalah kolom yang digunakan sebagai kunci untuk menghubungkan antara tabel yang satu dengan tabel yang lain.

    "},{"location":"bab5/#pengurangan-dan-interseksi-data","title":"Pengurangan dan Interseksi Data","text":"

    Hal ini dilakukan untuk menyeleksi sekelompok data dari satu tabel lalu dikurangi dengan sekelompok data dari tabel lain.

    "},{"location":"bab5/#sub-query","title":"Sub-query","text":"

    Subquery adalah perintah SELECT yang terdapat dalam perintah SELECT lain. Hal ini memudahkan kita untuk membuat berbagai format laporan semisal crosstab query.

    Subquery juga biasa digunakan sebagai kolom penentu kondisi query (di bagian WHERE).

    "},{"location":"bab6/","title":"Tabel Virtual","text":"

    View adalah objek di dalam database yang berisi kumpulan kolom yang dihasilkan dari perintah SELECT. Sederhananya view adalah objek yang menyimpan hasil query, baik dari satu tabel atau lebih. View juga sering disebut sebagai tabel virtual, karena view sebenranya tidak memiliki data. Data yang ditampilkan oleh view diambil dari tabel-tabel aktual yang disertakan dalam perintah SELECT.

    "},{"location":"bab6/#mengapa-perlu-menggunakan-tabel-virtual","title":"Mengapa Perlu Menggunakan Tabel Virtual?","text":"

    Dalam pengelolaan database, view memiliki manfaat bagi kita, di antaranya:

    1. Akses data menjadi lebih mudah.
      • Dapat digunakan untuk menampilkan rangkuman dari suatu perhitungan tertentu.
      • Dapat menampilkan beberapa kolom atau beberapa baris saja dari suatu tabel, tergantung dari kondisi yang didefinisikan.
      • Dapat digunakan untuk menampilkan data yang berasal dari dua tabel atau lebih.
    2. View dapat digunakan untuk menampilkan data yang berbeda untuk masing-masing user, sehingga setiap user hanya dapat melihat data yang sesuai dengan hak aksesnya.

    Pada kasus-kasus tertentu, data yang terdapat dalam satu view juga harus dapat dimodifikasi menggunakan perintah INSERT, UPDATE maupun DELETE. Jika data dalam suatu view diubah, sebenarnya yang berubah adalah data pada base table.

    "},{"location":"bab6/#membuat-view","title":"Membuat View","text":"

    Dalam MySQL, view dibuat menggunakan perintah CREATE VIEW. Berikut sintaks umum yang digunakan.

    CREATE VIEW [nama_view] AS [perintah SELECT];\n
    Sekarang kita buat view-nya.
    CREATE VIEW v_buku AS\nSELECT\n    a.buku_isbn,\n    a.buku_judul,\n    b.penerbit_nama,\n    a.buku_tglterbit,\n    a.buku_jmlhalaman,\n    a.buku_harga\nFROM\n    buku a,\n    penerbit b\nWHERE\n    a.penerbit_id = b.penerbit_id\nORDER BY\n    a.buku_judul;\n
    Perintah di atas akan mendefinisikan view di dalam database dengan nama v_buku. View tersebut berisi perintah SELECT yang melibatkan dua tabel, yaitu buku dan penerbit. Kolom relasi antara dua tabel tersebut adalah kolom penerbit_id.

    Sekarang kita bisa menampilkan data buku dengan SELECT view tersebut, berikut query-nya.

    SELECT * FROM v_buku;\n

    "},{"location":"bab6/#melihat-daftar-kolom-di-dalam-view","title":"Melihat Daftar Kolom di dalam view","text":"

    Sama halnya seperti pada objek tabel, kita juga dapat melihat daftar kolom yang terdapat di dalam suatu view. Untuk melakukan hal ini kita bisa menjalankan query. Contoh:

    DESC v_buku;\n

    "},{"location":"bab6/#mengubah-view","title":"Mengubah View","text":"

    Untuk mengubah definisi dari suatu view yang sebelumnya sudah dibuat, kita perlu menggunakan perintah ALTER VIEW. Perintah ini akan membuang atau menghapus definisi view yang lama dan menimpanya dengan definisi view yang baru. Format query-nya sebagai berikut.

    ALTER VIEW [nama_view] AS [perintah SELECT yang baru]\n

    Sekarang perhatikan dan jalankan query berikut.

    ALTER VIEW v_buku AS\nSELECT\n    a.buku_isbn,\n    a.buku_judul,\n    b.penerbit_nama,\n    a.buku_harga\nFROM\n    buku a,\n    penerbit b\nWHERE\n    a.penerbit_id = b.penerbit_id\nORDER BY\n    a.buku_judul;\n

    "},{"location":"bab6/#menghapus-view","title":"Menghapus View","text":"

    Kita dapat menghapus satua tau lebih view yang terdapat di dalam database dengan menggunakan perintah DROP VIEW. Format umum query-nya adalah sebagai berikut.

    DROP VIEW [IF EXISTS] [nama_view];\n
    IF EXISTS bersifat opsional dan berfungsi untuk mencegah terjadinya kesalahan pada saat perintah tersebut dieksekusi, yaitu dengan cara melakukan pemeriksaan terlebih dahulu, apakah view yang akan dihapus tersebut ada di dalam database atau tidak.

    Jika nama view yang disertakan dalam perintah DROP VIEW ternyata tidak ada, maka server MySQL akan mengeluarkan pesan peringatan/ warning. Kitadapat menampilkan isi peringatan tersebut dengan perintah SHOW WARNINGS.

    Perhatikan query berikut.

    DROP VIEW v1, v2;\n
    Query di atas akan menghapus dua view sekaligus. Sekarang jalankan query berikut untuk menghapus view v_buku.

    DROP VIEW v_buku;\n
    "},{"location":"bab6/#membuat-view-yang-dapat-dimodifikasi","title":"Membuat View yang Dapat Dimodifikasi","text":"

    Suatu view dapat dimodifikasi jika kolom-kolom dalam view tersebut mengacu langsung ke kolom yang terdapat pada base tabel, bukan hasil proses perhitungan. Sebagai contoh, coba perhatikan dan jalankan query berikut.

    Membuat view v_jmlBukuPerPenerbit

    CREATE VIEW v_jmlBukuPerPenerbit AS\nSELECT\n    b.penerbit_nama \"Nama Penerbit\",\n    COUNT(a.buku_judul) \"Jumlah Buku\"\nFROM\n    buku a,\n    penerbit b\nWHERE\n    a.penerbit_id = b.penerbit_id\nGROUP BY\n    b.penerbit_nama\nORDER BY\n    b.penerbit_nama;\n
    View tersebut berfungsi untuk menampilkan laporan jumlah buku per penerbit. Untuk melihat hasilnya jalankan query berikut.
    SELECT * FROM v_jmlBukuPerPenerbit;\n
    View di atas merupakan view yang tidak dapat dimodifikasi, karena data yang ditampilkan merupakan hasil proses perhitungan dari fungsi COUNT().

    Sekarang kita coba membuat view yang bisa dimodifikasi. Perhatikan dan jalankan query berikut.

    Membuat view v_jmlHalaman

    CREATE VIEW v_jmlHalaman AS\nSELECT\n    buku_isbn,\n    buku_judul,\n    buku_jmlhalaman\nFROM\n    buku\nORDER BY\n    buku_isbn;\n
    Selanjutnya kita coba lihat data yang disajikan dari view di atas.
    SELECT * FROM v_jmlHalaman\nWHERE\n    buku_isbn = \"999-1555-2-1\";\n
    Perhatikan hasilnya, maka akan menampilkan 1 baris data. Sekarang kita coba lakukan modifikasi terhadap view tersebut dengan query berikut.
    UPDATE v_jmlHalaman\nSET\n    buku_halaman = buku_halaman + 10\nWHERE\n    buku_isbn = \"999-1555-2-1\";\n
    Setelah berhasil mengupdate view v_jmlHalaman, kita coba ulangi perintah berikut dan perhatikan hasilnya.
    SELECT * FROM v_jmlHalaman\nWHERE\n    buku_isbn = \"999-1555-2-1\";\n

    Perhatikan nilai dari kolom buku_jmlhalaman. Nilai yang ditampilkan sekarang adalah 280, yang awalnya bernilai 270. Ini terjadi karena kita telah melakukan modifikasi terhadap view v_jmlHalaman menggunakan perintah UPDATE.

    Data yang sebenarnya diubah adalah data pada kolom tabel yang diakses, bukan data di dalam view yang bersangkutan. karena secara fisik view tidak pernah memiliki data. Karena inilah view sering disebut sebagai tabel virtual. Untuk membuktikan hal ini sekarang mari kita lihat datanya langsung dari tabel asli.

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_jmlhalaman\nFROM\n    buku\nWHERE\n    buku_isbn = \"999-1555-2-1\";\n
    Hasil yang diperoleh akan sama seperti pada asat kita mengaksesnya melalui view v_jmlHalaman.

    "},{"location":"bab6/#batasan-batasan-dalam-penggunaan-view","title":"Batasan-batasan dalam Penggunaan View","text":"

    Pendefinisian view dapat menggunakan klausa-klausa yang terdapat pada perintah SELECT, seperti WHERE, GROUP BY, ORDER BY dan lain-lain. Namun demikian ada batasan-batasan yang perlu diperhatikan, yaitu:

    1. Kita tidak dapat membuat view temporari
    2. Kita tidak dapat mengasosiasikan trigger dengan view
    3. Tabel-tabel yang diakses oleh view harus ada di dalam database. Jika nama tabel diubah, maka view tidak dapat digunakan lagi, karena terjadi kesalahan pada saat dieksekusi
    4. Perintah SELECT yang didefinisikan di dalam view tidak boleh berisi kontruksi-kontruksi berikut:
      • Subquery di dalam klausa FROM
      • Mengacu ke tabel temporari
    "},{"location":"bab7/","title":"Manajemen User","text":""},{"location":"bab7/#membuat-user","title":"Membuat User","text":"

    User adalah orang yang dapat menggunakan database. Sejauh mana user tersebut dapat bekerja di dalam database ditentukan dari hak akses yang dimilikinya: apakah sebagai Database Administrator yang memiliki hak akses penuh terhadap database yang diolah ataupun sekedar Operator yang memiliki hak akses terbatas sesuai jenis pekerjaannya.

    Format query untuk membuat user adalah sebagai berikut.

    CREATE USER [nama_user] IDENTIFIED BY [password];\n

    Jalankan query berikut untuk membuat user baru.

    CREATE USER 'admin' IDENTIFIED BY 's3cr3t';\n
    Query tersebut akan membuat user baru dengan nama admin dan password s3cr3t. Ingat, bahwa user tersebut baru kita buat dan belum memiliki hak akses apapun terhadap database, namun kita sudah bisa login ke server MySQL menggunakan user tersebut.

    Keluar dari user saat ini dengan perintah \\q lalu ENTER. Selanjutnya mari kita login

    mysql -u admin -p\n
    Tekan ENTER lalu masukkan password s3cr3t dan tekan ENTER. Setelah berhasil coba jalankan query berikut.

    Menampilkan database

    SHOW DATABASES;\n

    Mengaktifkan/ menggunakan database buku_db

    USE buku_db;\n
    Apa hasilnya? \ud83d\ude02

    "},{"location":"bab7/#mengenal-hak-akses","title":"Mengenal Hak Akses","text":"

    Hak akses adalah suatu izin yang dapat diberikan kepada seorang user. Dengan izin tersebut, seorang user dapat melakukan aksi-aksi tertentu terhadap database.

    Hak akses tersebut dikelompokkan menjadi 2, yaitu:

    1. Tingkat User
    2. Tingkat Administrator

    Hak Akses Tingkat User

    Hak Akses Keterangan CREATE Membuat database, tabel atau indeks CREATE TEMPORARY TABLE Membuat tabel temporari CREATE VIEW Membuat view DELETE Menghapus baris data EXECUTE Mengeksekusi prosedur INDEX Membuat indeks INSERT Memasukkan baris-baris data ke dalam tabel LOCK TABLES Mengunci suatu tabel SELECT Mengambil/ memilih data dari tabel SHOW DATABASES Menampilkan semua database SHOW VIEW Melihat daftar view yang dimiliki database UPDATE Mengubah data di dalam tabel USAGE Melakukan login, tapi tidak bisa melakukan apapun

    Hak Akses Tingkat Administrator

    Hak Akses Keterangan ALL Memiliki semua hak akses, kecuali WITH GRANT OPTION ALTER Mengubah struktur tabel CREATE USER Membuat user lain DROP Menghapus database, tabel atau view FILE Memuat data dari suatu file PROCESS Melihat daftar proses yang dieksekusi MySQL RELOAD Menggunakan perintah FLUSH SHUTDOWN Menghentikan server MySQL"},{"location":"bab7/#memberi-hak-akses","title":"Memberi Hak Akses","text":"

    Perintah yagn digunakan untuk memberikan hak akses adalah GRANT, format umumnya sebgaimana berikut.

    GRANT [hak akses]\nON [nama_tabel]|*|*.*|[nama_database]\nTO [nama_user]\nIDENTIFIED BY [password];\n
    Jalankan query berikut untuk memberikan semua hak akses pada semua tabel yang terdapat dalam database bukudb kepada user admin.

    GRANT ALL\nON bukudb.*\nTO 'admin'@'%'\nIDENTIFIED BY 's3cr3t';\n

    Terkadang kita tidak perlu memberikan semua hak akses kepada user tertentu, untuk itu kita bisa menjalankan query berikut sebagai contohnya.

    GRANT USAGE, INSERT, UPDATE, DELETE, SELECT\nON pengarang\nTO 'admin'@'%'\nIDENTIFIED BY 's3cr3t';\n

    Dengan query tersebut, maka user admin hanya bisa memasukkan, mengubah, menghapus dan mengambil/ menampilkan data yang terdapat pada tabel pengarang saja.

    "},{"location":"bab7/#mencabut-hak-akses","title":"Mencabut Hak Akses","text":"

    Untuk mencabut/ menarik kembali hak akses dari user tertentu bisa menggunakan perintah REVOKE dengan format

    REVOKE [hak akses]\nON [nama_tabel]|*|*.*|[nama_database]\nFROM [nama user];\n

    Contoh 1

    REVOKE ALL\nON bukudb.*\nFROM admin\n
    Query tersebut akan mencabut semua hak akses admin terahdap database bukudb.

    Contoh 2

    REVOKE USAGE, INSERT, UPDATE, DELETE, SELECT\nON pengarang\nFROM 'admin';\n
    Query tersebut akan mencabut hak akses USAGE, INSERT, UPDATE, DELETE, SELECT dari user admin terhadap tabel pengarang.

    "},{"location":"bab7/#menghapus-user","title":"Menghapus User","text":"

    Untuk menghapus user format query-nya adalah

    DROP USER [nama_user_1], [nama_user_2], ...dst;\n

    Mari kita coba

    DROP USER 'admin'@'%';\n

    "},{"location":"bab7/#mengetahui-tabel-hak-akses","title":"Mengetahui Tabel Hak Akses","text":"

    Ketika kita menjalankan query GRANT dan REVOKE, sebenarnya MySQL menyimpan data hak akses tersebut di dalam database mysql. Sehingga sebenarnya kita bisa saja melihat bahkan memberi ataupun menghapus hak akses user dengan memanipulasi database mysql tanpa melakukan query GRANT dan REVOKE.

    Jika kita ingin memodifikasi data secara langsung, kita harus menjalankan query

    FLUSH PRIVILEGES\n
    Perintah tersebut berfungsi me-refresh perubahan yang telah dilakukan ke dalam database mysql.

    Berikut beberapa tabel dalam database mysql yang berkaitan dengan proses pemberian dan pencabutan hak akses user.

    Coba kita jalankan query berikut.

    Mengaktifkan database mysql dan menampilkan seluruh tabel di dalamnya.

    USE mysql;\nSHOW TABLES;\n

    Menampilkan struktur tabel user

    DESC user;\n

    Menampilkan beberapa kolom data dari tabel user.

    SELECT user, host\nFROM user;\n

    "},{"location":"bab8/","title":"Fungsi Agregasi","text":"

    Fungsi Agregasi adalah fungsi di dalam MySQL yang digunakan untuk melakukan perhitungan pada query. Pada umumnya penggunaannya dikombinasikan dengan klausa GROUP BY untuk menghasilkan rangkuman nilai yang dikelompokkan berdasarkan nilai tertentu.

    Berikut ini beberapa fungsi yang termasuk dalam fungsi agregasi:

    "},{"location":"bab8/#fungsi-min","title":"Fungsi MIN()","text":"

    Menampilkan jumlah halaman paling sedikit

    SELECT MIN(buku) FROM buku;\n

    Menampilkan urutan abjad paling awal dari judul buku

    SELECT MIN(buku_judul) FROM buku;\n

    "},{"location":"bab8/#fungsi-max","title":"Fungsi MAX()","text":"

    Contoh, menampilkan halaman buku terbanyak.

    SELECT MAX(buku_jmlhalaman) FROM buku;\n

    Menampilkan buku dengan abjad paling akhir.

    SELECT MAX(buku_judul) FROM buku;\n

    "},{"location":"bab8/#fungsi-sum","title":"Fungsi SUM()","text":"

    SUM() berguna untuk menjumlahkan nilai dari suatu kolom dalam tabel tertentu. Contoh:

    SELECT SUM(buku_jmlhalaman) FROM buku;\n
    Nilai yang tampil merupakan total dari semua jumlah halaman buku pada kolom buku_jmlhalaman.

    "},{"location":"bab8/#fungsi-count","title":"Fungsi COUNT()","text":"

    Berbeda dengan SUM(), fungsi COUNT() akan mengembalikan jumlah baris data pada kolom dari tabel tertentu.

    Contoh, menampilkan jumlah buku dari penerbit dengan penerbit_id = PB06.

    SELECT COUNT(*)\nFROM buku\nWHERE penerbit_id = 'PB06';\n

    Untuk lebih membuktikan, coba kita cek dengan cara biasa.

    SELECT\n    buku_isbn,\n    buku_judul\nFROM\n    buku\nWHERE\n    penerbit_id = 'PB06';\n

    "},{"location":"bab8/#fungsi-avg","title":"Fungsi AVG()","text":"

    Berfungsi untuk mendapatkan nilai rata-rata dari suatu kolom. Sebagai contoh, kita ibsa menghitung nilai rata-rata dari jumlah halaman buku dengan kode penerbit PB06 dengan perintah berikut.

    SELECT\n    AVG(buku_jmlhalaman)\nFROM\n    buku\nWHERE\n    penerbit_id = 'PB06';\n

    Untuk lebih membuktikan, silahkan jalankan perintah berikut dan hitung rata-rata kolom buku_jmlhalaman secara manual.

    SELECT\n    buku_isbn,\n    buku_judul,\n    penerbit_id,\n    buku_jmlhalaman\nFROM\n    buku\nWHERE \n    penerbit_id = 'PB06';\n

    "},{"location":"bab8/#fungsi-group_concat","title":"Fungsi GROUP_CONCAT()","text":"

    Contoh, menampilkan data nama penerbit dari tabel penerbit.

    SELECT penerbit_nama\nFROM penerbit;\n

    Selanjutnya kita ubah query nya sebagai berikut.

    SELECT GROUP_CONCAT(penerbit_nama)\nFROM penerbit;\n

    Hasilnya, semua baris data akan digabungkan menjadi 1 baris.

    Dalam kasus yang lebih nyata, kita bisa mengelompokkan daftar buku sesuai nama penerbit. berikut query-nya.

    SELECT\n    b.penerbit_nama,\n    GROUP_CONCAT(a.buku_judul)\nFROM\n    buku a,\n    penerbit b\nWHERE\n    a.penerbit_id = b.penerbit_id\nGROUP BY\n    b.penerbit_nama\nORDER BY\n    b.penerbit_nama;\n

    Fungsi GROUP_CONCAT() memiliki beberapa bentuk penggunaan, yaitu:

    "},{"location":"bab8/#fungsi-agregasi-pada-nilai-null","title":"Fungsi Agregasi Pada Nilai NULL","text":"

    Secara umum, fungsi-fungsi agregasi akan mengabaikan nilai NULL, kecuali COUNT(). Fungsi COUNT() memiliki sifat:

    Untuk membuktikan hal tersebut, kita buat contoh tabel baru tnull.

    CREATE TABLE tnull(\n    a int\n);\n

    Memasukkan data ke dalam tabel tnull

    INSERT INTO tnull VALUES\n(1),\n(NULL),\n(NULL),\n(NULL),\n(NULL);\n

    Sekarang kita buktikan sifat pertama.

    SELECT COUNT(*) \nFROM tnull;\n
    Hasilnya adalah 5, karena nilai NULL tetap dihitung.

    Sekarang kita buktikan sifat kedua.

    -- Query-1\nSELECT COUNT(DISTINCT a)\nFROM tnull;\n\n-- Query-2\nSELECT COUNT(a)\nFROM tnull;\n
    Hasilnya adalah 1 karena nilai NULL tidak dihitung sebagai 1 baris data, dengan kata lain NULL diabaikan.

    Perintah SELECT mungkin saja menghasilkan baris kosong atau nilai NULL di setiap barisnya. Jika kita menggunakan fungsi agregasi pada kolom yang berisi baris kosong atau nilai NULL di setiap baris yang ada, maka:

    Sebagai bukti, coba kita hapus 1 baris data yang berisi nilai non-NULL.

    DELETE FROM tnull\nWHERE a=1;\n
    Lalu kita cek data yang tersisa
    SELECT * FROM tnull;\n

    Selanjutnya kita coba eksekusi satu-persatu fungsi agregasi untuk mengetahui nilai yang dikembalikan.

    SELECT COUNT(a) FROM tnull;\n
    Perintah di atas akan menghasilkan nilai 0 (nol), namun jika kita mencoba fungsi agregasi yang lain,

    SELECT MIN(a) FROM tnull;\nSELECT MAX(a) FROM tnull;\nSELECT SUM(a) FROM tnull;\nSELECT AVG(a) FROM tnull;\nSELECT GROUP_CONCAT(a) FROM tnull;\n
    Semua perintah di atas akan menghasilkan nilai NULL.

    "},{"location":"bab9/","title":"Operator dan Fungsi","text":"

    Beberapa fungsi yang sering dipakai dapat dikelompokkan menjadi:

    "},{"location":"bab9/#operator","title":"Operator","text":""},{"location":"bab9/#operator-aritmatika","title":"Operator Aritmatika","text":"

    Operator aritmatika digunakan untuk melakukan perhitungan di dalam query maupun prosedur/ fungsi. Berikut daftarnya

    Operator Keterangan + Untuk melakukan operasi penjumlahan - Untuk melakukan operasi pengurangan * Untuk melakukan operasi perkalian / Untuk melakukan operasi pembagian

    Contoh kasus, kita akan menghitung harga buku tertentu yang sudah didiskon sebanyak 25%.

    SELECT\n    buku_judul 'Judul',\n    buku_harga 'Harga Normal',\n    buku_harga - (0.25 * buku_harga) 'Harga Diskon 25%'\nFROM\n    buku\nWHERE\n    buku_isbn IN ('222-34222-1-0','222-34222-1-1')\n

    "},{"location":"bab9/#operator-relasional","title":"Operator Relasional","text":"

    Operator relasional digunakan untuk membandingkan dua nilai atau ekspresi. Berikut tabel operator-operator yang termasuk.

    Operator Keterangan = Sama dengan != atau <> Tidak sama dengan < Lebih kecil <= Lebih kecil atau sama dengan > Lebih besar >= Lebih besar atau sama dengan n BETWEEN min AND max Memeriksa n apakah berada di dalam rentang min dan max atau tidak n IN (set) Memeriksa keanggotaan himpunan (set), apakah n anggota dari himpunan yang didefinisikan atau tidak n IS NULL Memeriksa nilai n dengan nilai NULL ISNULL(n) Memeriksa nilai n, NULL atau tidak

    Sebagai contoh, kita akan menampilkan daftar buku yang harganya di bawah Rp. 50.000.

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nWHERE\n    buku_harga <= 50000\n

    "},{"location":"bab9/#operator-logika","title":"Operator Logika","text":"

    Oeprator logika berfungsi untuk memeriksa nilai kebenaran (true atau false). Berikut daftar operatornya.

    Operator Keterangan AND atau && Operasi logika AND OR atau || Operasi logika OR NOT atau ! Operasi negasi XOR Operasi Exclusive OR

    Beberapa hal yang perlu diperhatikan ketika menggunakan operator logika:

    Sebagai contoh, query berikut berfungsi untuk menampilakn data buku yang harganya di bawah atau sama dengan Rp. 50.000 dan memiliki kode penerbit PB06

    SELECT\n    buku_isbn,\n    buku_judul,\n    penerbit_id,\n    buku_harga\nFROM\n    buku\nWHERE\n    buku_harga <= 50000 AND\n    penerbit_id = 'PB06';\n
    "},{"location":"bab9/#fungsi","title":"Fungsi","text":""},{"location":"bab9/#fungsi-teks","title":"Fungsi Teks","text":"

    Fungsi concat()

    concat() berfungsi untuk menyambung dua teks atau lebih, tergantung dari banyaknya parameter yang dilewatkans aat pemanggialn fungsi. Contoh:

    SELECT CONCAT('Belajar',' ', 'MySQL')\n

    Fungsi length()

    Berfungsi untuk mengetahui jumlah karakter dari teks. Contoh:

    SELECT LENGTH('Belajar MySQL');\n

    Fungsi locate()

    Berfungsi untuk mencari karakter atau bagian teks (substring) dari suatu teks. Contoh:

    SELECT LOCATE('base', 'Pemrograman Database MySQL', 1);\n
    Query di atas akan mencari teks base di dalam teks Pemrograman Database MySQL dimulai dari posisi karakter ke-1. Jika karakter yang dimaksud tidak ditemukan, maka MySQL akan mengembalikan nilai 0.

    Fungsi lower() dan upper()

    lower() berfungsi untuk mengubah teks menjadi huruf kecil, sedangkan upper() berfungsi mengubah teks menjadi huruf kapital. Contoh:

    SELECT LOWER('BELAJAR');\nSELECT UPPER('database');\n

    Fungsi quote()

    quote() digunakan untuk mengapit teks menggunakan tanda petik tunggal. Sebagai contoh, jika kita igin membuat teks untuk proses INSERT dalam suatu prosedur/ fungsi yang didefinisikan sendiri. Contoh:

    SET @STR = 'MySQL';\nSELECT @STR;\n
    Perintah di atas akan memberikan hasil berupa string 'MySQL'. Sekarang coba yang ini.
    SET @STR = quote('MySQL');\nSELECT @STR;\n
    Perintah tersebut akan menampilkan string 'MySQL' yang mengandung tanda kutip.

    Fungsi replace()

    Kita bisa mengganti bagian teks tertentu dengan fungsi ini. Contoh:

    SELECT REPLACE(\n    'Pemrograman Database',\n    'Database',\n    'MySQL'\n)\n
    Perintah di atas akan mengganti teks Database yang berada pada string Pemrograman Database dengan teks MySQL.

    Fungsi substring()

    Digunakan untuk mengambil karakter atau bagian teks (dengan jumlah tertentu) dari suatu teks. Contoh:

    SELECT SUBSTRING('MySQL', 1, 2);\n
    Perintah di atas akan mengambil 2 karakter dari teks MySQL dimulai dari karakter ke-1, sehingga menghasilkan teks QL.

    Fungsi trim()

    Pada kasus-kasus tertentu, sering kali terjadi data yang tersimpan di dalam dataabse memiliki format yang belum sempurna. Sebagai contoh, data yang seharusnya berupa 'MySQL', tapi pada kenyataannya di dalamd database tertulis 'My SQL' atau ' MySQL' (mengandung whitespace atau karakter kosong baik di depan atau di belakang teks).

    Kesalahan data seperti ini biasanya (tanpa sengaja) dilakukan oleh pneggna aplikasi atau operator entri data. Sebagai contoh, secara tidak sadar pengguna aplikasi telah menekan tombol spasi pada saat sedang melakukan entri data. Dengan demikian, data yang tersimpan di dalam database juga akan ikut mengandung spasi.

    Kasus semacam ini terkadang sering membuat pusing para programmer database dan DBA (Database Administrator) pada saat mereka menulis query. Pasalnya, emreka merasa bahwa query sudah tertulis dengan benar, tapi data atau hasil yagn ditampilkan tidak sesuai dengan keinginan.

    Untuk mengatasi masalah tersebut, kita bisa menggunakan fungsi trim() pada saat membandingkan data berupa teks. Jika kita ingin menghilangkan whitespace di awal string kita gunakan ltrim(), sedangkan jika di akhir string menggunakan rtrim(). Contoh:

    SELECT\n    buku_isbn,\n    buku_judul\nFROM\n    buku\nWHERE\n    TRIM(penerbit_id) = 'PB06';\n
    "},{"location":"bab9/#fungsi-bilangan","title":"Fungsi Bilangan","text":"

    Untuk mengolah data bilangan, MySQL sudah menyediakan beberapa fungsi. Berikut tabelnya.

    Fungsi Keterangan abs() Mengembalikan nilai mutlak dari n. Misal abs(-10) akan mengembalikan nilai 10. round() Membulatkan bilangan desimal n menjadi bilangan bulat. Misal round(3.45) hasilnya 3. ceiling(n) Pembulatan ke atas terdekat. Misal ceiling(3.25) menghasilkan 4. floor(n) Pembulatan ke bawah terdekat. Misal floor(3.97) menghasilkan nilai 3. mod(n,m) Operasi sisa hasil bagi/ modulus. Misal mod(11,4) menghasilkan nilai 3. power(n,m) Mengembalikan nilai n pangkat m. Misal power(10,2) hasilnya 100. sqrt(n) Mengembalikan akar pangkat 2 dari n. Misal sqrt(4) hasilnya 2. rand(n) Mengembalikan nilai acak (random) antara 0 dan 1. Parameter n bersifat opsional."},{"location":"bab9/#fungsi-tanggal-dan-waktu","title":"Fungsi Tanggal dan Waktu","text":"

    Kolom bertipe tanggal dan waktu umumnya digunakan untuk mencatat kapan suatu transaksi atau kejadian terjadi dalam database.

    Fungsi Keterangan Contoh now() Mengembalikan tanggal dan waktu saat ini (tanggal penuh dengan jam, menit, detik). SELECT now(); hasil: 2024-11-29 10:15:30 curdate() Mengembalikan tanggal hari ini (hanya tanggal, tanpa waktu). SELECT curdate(); hasil: 2024-11-29 curtime() Mengembalikan waktu saat ini (hanya jam, menit, dan detik). SELECT curtime(); hasil: 10:15:30 extract(day from [tanggal]) Mengambil nilai hari dari kolom tanggal. SELECT extract(day from '2024-11-29'); hasil: 29 extract(month from [tanggal]) Mengambil nilai bulan dari kolom tanggal. SELECT extract(month from '2024-11-29'); hasil: 11 extract(year from [tanggal]) Mengambil nilai tahun dari kolom tanggal. SELECT extract(year from '2024-11-29'); hasil: 2024 dayname([tanggal]) Mengembalikan nama hari dari tanggal tertentu (dalam bahasa Inggris). SELECT dayname('2024-11-29'); hasil: Friday date_format([tanggal], format) Memformat tanggal sesuai pola tertentu. SELECT date_format('2024-11-29', '%d-%m-%Y'); hasil: 29-11-2024 time_format([waktu], format) Memformat waktu sesuai pola tertentu. SELECT time_format('10:15:30', '%h:%i %p'); hasil: 10:15 AM

    Penjelasan Format untuk date_format dan time_format:

    Catatan:

    Format dapat disesuaikan dengan kebutuhan untuk menampilkan data yang lebih user-friendly. Contoh-contoh di atas juga dapat digunakan dalam perintah SQL untuk pengolahan data.

    "},{"location":"bab9/#fungsi-konversi-typecasting","title":"Fungsi Konversi / Typecasting","text":"

    Contoh:

    SELECT CAST('13' AS SIGNED);\nSELECT CONVERT('13', SIGNED);\n

    Berikut tipe-tipe data yang dapat digunakan dalam fungsi cast() dan convert().

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Beranda","text":""},{"location":"#selamat-datang","title":"Selamat Datang","text":""},{"location":"#tutorial-belajar-mysql","title":"Tutorial Belajar MySQL","text":""},{"location":"#edisi-best-practice","title":"Edisi Best Practice","text":"

    Mulai Belajar

    "},{"location":"bab1/","title":"Mendefinisikan Data dengan DML","text":"
    Create - Alter - Drop\n
    "},{"location":"bab1/#membuat-database","title":"Membuat Database","text":"

    Langkah pertama yagn harus kita lakukan adalah membuat database. Kali ini kita akan membuat database baru bernama \"buku_db\".

    CREATE DATABASE buku_db;\n
    Setelah database tercipta, kita perlu mengaktifkan/ memilih database yang akan kita manipulasi.
    USE buku_db;\n

    "},{"location":"bab1/#membuat-tabel","title":"Membuat Tabel","text":"

    Tahap selanjutnya kita perlu membuat beberapa tabel, yaitu:

    Berikut query yang perlu kita jalankan.

    Tabel kategori

    CREATE TABLE kategori(\nkategori_id int not null auto_increment,\nkategori_nama varchar(25),\nprimary key(kategori_id)\n);\n
    Tabel pengarang
    CREATE TABLE pengarang(\npengarang_id char(3) not null,\npengarang_nama varchar(30),\nprimary key(pengarang_id)\n);\n

    Tabel penerbit

    CREATE TABLE penerbit(\npenerbit_id char(4) not null,\npenerbit_nama varchar(50),\nprimary key(penerbit_id)\n);\n

    Tabel buku

    CREATE TABLE buku(\nbuku_isbn char(13) not null,\nbuku_judul varchar(75),\npenerbit_id char(4),\nbuku_tglterbit date,\nbuku_jmlhalaman int,\nbuku_deskripsi text,\nbuku_harga decimal,\nprimary key(buku_isbn),\nforeign key(penerbit_id)\n    references penerbit(penerbit_id)\n);\n

    Tabel link_buku_pengarang

    CREATE TABLE link_buku_pengarang(\nbuku_isbn char(13) not null,\npengarang_id char(3) not null,\nprimary key(buku_isbn, pengarang_id),\nforeign key(buku_isbn)\n    references buku(buku_isbn),\nforeign key(pengarang_id)\n    references pengarang(pengarang_id)\n);\n

    Tabel link_buku_kategori

    CREATE TABLE link_buku_kategori(\nbuku_isbn char(13) not null,\nkategori_id int not null,\nprimary key(buku_isbn, kategori_id),\nforeign key(buku_isbn)\n    references buku(buku_isbn),\nforeign key(kategori_id)\n    references kategori(kategori_id)\n);\n

    "},{"location":"bab1/#query-tambahan","title":"Query Tambahan","text":"

    Mengubah nama tabel

    ALTER TABLE\n    kategori\nRENAME TO\n    kategori_buku;\n
    Menambah kolom
    ALTER TABLE\n    buku\nADD COLUMN\n    buku_sinopsis text;\n

    Mengubah Kolom

    ALTER TABLE\n    buku\nCHANGE\n    buku_isbn buku_id char(15);\n

    Menghapus kolom

    ALTER TABLE\n    buku\nDROP\n    buku_sinopsis;\n

    Menambah primary key

    ALTER TABLE\n    buku\nADD\n    primary key(buku_judul);\n

    Menambah foreign key

    ALTER TABLE\n    link_buku_kategori\nADD\n    foreign key(buku_isbn)\n    references buku(buku_isbn);\n

    Menghapus primary key

    ALTER TABLE\n    buku\nDROP primary key;\n

    Menghapus foreign key

    ALTER TABLE\n    fk_link_buku_kategori;\n

    Menambah indeks

    ALTER TABLE\n    buku\nADD INDEX\n    idx_judul(buku_judul);\n

    Menghapus indeks

    ALTER TABLE\n    buku\nDROP INDEX\n    idx_judul;\n

    Menghapus Tabel

    DROP TABLE IF EXIST\n    link_buku_kategori;\nDROP TABLE\n    link_buku_kategori,\n    link_buku_pengarang;\n

    "},{"location":"bab10/","title":"Prosedur dan Fungsi","text":""},{"location":"bab10/#manfaat-prosedur-dan-fungsi","title":"Manfaat Prosedur dan Fungsi","text":"

    Pembuatan prosedur dan fungsi memiliki beberapa manfaat, di antaranya:

    "},{"location":"bab10/#perbedaan-prosedur-dan-fungsi","title":"Perbedaan Prosedur dan Fungsi","text":"

    Perbedaan antara prosedur dan fungsi terletak pada peruntukan, cara pembuatan dan cara eksekusinya. Berikut hal-hal yang perlu diperhatikan.

    "},{"location":"bab10/#membuat-dan-mengeksekusi-prosedur","title":"Membuat dan Mengeksekusi Prosedur","text":"

    Format pembuatan prosedur pada umumnya sebagaimana berikut.

    CREATE PROCEDURE [nama_prosedur] ([daftar parameter])\nBEGIN\n    [daftar deklarasi variabel]\n    [perintah1];\n    [perintah2]\n    ... dst\nEND;\n
    Sekarang kita coba membuat satu prosedur.
    DELIMITER //\nCREATE PROCEDURE select_penerbit()\nBEGIN\n    SELECT penerbit_nama\n    FROM penerbit\n    WHERE penerbit_id='PB06';\nEND;\n//\n
    Sekarang coba kita jalankan prosedurnya.

    CALL select_penerbit();\n
    Setelah dijalankan, kita tahu bahwa prosedur select_penerbit() tersebut berfungsi untuk menampilkan nama penerbit yang memiliki id penerbit PB06.

    Selanjutnya, kita coba membuat prosedur yang memiliki parameter.

    DELIMITER //\nCREATE PROCEDURE\n    insert_penerbit(id char(4), nama varchar(50))\nBEGIN\n    INSERT INTO penerbit\n    (penerbit_id, penerbit_nama)\n    VALUES (id, nama);\nEND;\n//\n
    Selanjutnya kita coba eksekusi.
    CALL insert_penerbit('PB10','Sinar Terang');\n
    Kita tahu bahwa prosedur yang baru saja kita buat dan kita jalankan berfungsi untuk menambahkan data penerbit. Untuk membuktikannya coba kita cek data penerbit dengan perintah
    SELECT * FROM penerbit;\n
    Tentu saja ada penerbit Sinar Terang dengan penerbit_id PB10 bertengger di baris terakhir.

    "},{"location":"bab10/#membuat-dan-mengeksekusi-fungsi","title":"Membuat dan Mengeksekusi Fungsi","text":"

    Untuk membuat fungsi kita perlu menggunakan CREATE FUNCTION disusul dengan RETURNS dan diakhiri dengan RETURN. Berikut formatnya.

    CREATE FUNCTION\n    [nama_fungsi]([daftar parameter])\nRETURNS [tipe data]\nBEGIN\n    [daftar deklarasi variabel]\n    [perintah1];\n    [perintah2];\n    ... [dst]\n    RETURN [nilai keluaran];\nEND;\n

    RETUNRS [tipe data] berfungsi untuk menentukan tipe data keluaran dari fungsi tersebut. Semisal kita ingin emngembalikan nilai berupa bilangan bulat, berarti kita perlu menulis RETURNS INT.

    Mari kita buat contohnya.

    CREATE FUNCTION harga_buku(isbn CHAR(13))\n    RETURNS DECIMAL(10, 0) DETERMINISTIC\nBEGIN\n-- Mendeklarasikan veriabel\nDECLARE harga DECIMAL(10,0);\n\n-- Seleksi data dan menampung hasilnya ke dalam variabel\nSELECT buku_harga INTO harga\nFROM buku\nWHERE buku_isbn = isbn;\n\n-- Mengembalikan nilai hasil proses\nRETURN harga;\n\nEND;\n//\n
    Selanjutnya, coba kita eksekusi.
    SELECT harga_buku('222-34222-1-0');\n

    Ingin lebih jelas? kita coba begini.

    SELECT harga_buku('222-34222-1-0')\nAS 'Harga Buku';\n

    Kita juga bisa memanggil fungsi di dalam ekspresi secara langsung. Contoh:

    SET total = harga_buku('222-34222-1-0') * 2;\n
    Dalam contoh tersebut, pemanggilan fungsi secara langsung digunakan untuk proses perkalian dengan bilangan lain. Dengan demikian, eksekusi fungsi perlakuannya sama dengan penggunaan variabel normal.

    "},{"location":"bab10/#menghapus-prosedur-dan-fungsi","title":"Menghapus Prosedur dan Fungsi","text":"

    Kita gunakan DROP PROCEDURE untuk menghapus prosedur, dan DROP FUNCTION untuk menghapus fungsi, diikuti nama prosedur ataupun fungsi. Contoh:

    -- Menghapus prosedur\nDROP PROCEDURE select_penerbit;\n\n-- Menghapus fungsi\nDROP FUNCTION harga_buku;\n
    "},{"location":"bab10/#menampilkan-daftar-prosedur-dan-fungsi","title":"Menampilkan Daftar Prosedur dan Fungsi","text":"

    Ada beberapa variasi perintah di dalam MySQL untuk menampilkan prosedur maupun fungsi.

    Query-1

    Menampilkan seluruhprosedur yang tersimpan di dalam database beserta properti dan informasi metadata lainnya.

    SHOW PROCEDURE STATUS;\n

    Query-2

    Menampilkan prosedur berdasarkan filter yang dilakukan menggunakan klausa LIKE.

    SHOW PROCEDURE STATUS\nWHERE name LIKE 'insert';\n

    Query-3

    Menampilkan seluruh fungsi yang tersimpan dalam database, beserta properti dan informasi metadata dari fungsi-fungsi tersebut.

    SHOW FUNCTION STATUS;\n

    "},{"location":"bab10/#hak-akses-untuk-bekerja-dengan-prosedur-dan-fungsi","title":"Hak Akses untuk Bekerja dengan Prosedur dan Fungsi","text":"

    Untuk bekerja menggunakan prosedur dan fungsi kita perlu memiliki beberapa hak akses berikut.

    "},{"location":"bab10/#variabel-di-dalam-prosedur-dan-fungsi","title":"Variabel di dalam Prosedur dan Fungsi","text":""},{"location":"bab10/#pemilihan-dalam-prosedur-dan-fungsi","title":"Pemilihan dalam Prosedur dan Fungsi","text":""},{"location":"bab10/#perintah-if","title":"Perintah IF","text":"

    Bentuk umum perintah IF adalah:

    Bentuk 1

    IF [kondisi] THEN\n    [daftar aksi]\nEND IF\n

    Ini adalah bentuk yang paling sederhana, karena hanya memiliki satu kondisi untuk diperiksa. Jika ekspresi bernilai benar, maka daftar aksi akan dieksekusi, namun jika salah, maka aksi tidak akan dijalankan.

    Bentuk 2

    IF [kondisi] THEN\n    [daftar aksi1]\nELSEIF [kondisi2] THEN\n    [daftar aksi2]\nELSE [daftar aksi3]\nEND IF\n
    Ini adalah bentuk yang sedikit lebih kompleks. Jika kondisi1 bernilai benar, maka daftar aksi1 akan dijalankan. Jika tidak, maka akan dilanjutkan pengecekan kondisi2, jika benar, maka daftar aksi2 akan dijalankan. Jika tidak maka daftar aksi3 yang akan dijalankan.

    Kita coba contoh berikut.

    DELIMITER //\nCREATE FUNCTION get_penerbit9isbn CHAR(13)\n    RETURNS VARCHAR(50) DETERMINISTIC\nBEGIN\n    DECLARE namapenerbit VARCHAR(50);\n    SELECT b.penerbit_nama INTO namapenerbit\n    FROM\n        buku a,\n        penerbit b\n    WHERE\n        a.penerbit_id = b.penerbit_id\n        AND\n        a.buku_isbn = isbn;\n\n    IF namapenerbit IS NULL THEN\n        SET namapenerbit = '';\n    END IF;\n\n    RETURN namapenerbit;\nEND;\n//\n

    Penjelasan Kode

    Inti penggunaan IF pada kode di atas adalah, jika namapenerbit bernilai NULL maka variabel namapenerbit akan diisi dengan nilai string kosong.

    Sekarang coba kita tes fungsi tersebut.

    SELECT get_penerbit('222-34222-1-0');\n
    "},{"location":"bab10/#perintah-case","title":"Perintah CASE","text":"

    Format penggunaan CASE adalah sebagai berikut.

    CASE [ekspresi]\n    WHEN [nilai1]\n    THEN [daftar aksi1];\n    WHEN [nilai2]\n    THEN [daftar aksi2];\n    ...[dst]\n\n    ELSE [daftar aksi]\nEND CASE\n

    Penjelasan Kode

    Jika ekspresi yang diperiksa memiliki nilai yang sama dengan nilai1, maka yang akan dieksekusi adalah daftar aksi1. Jika ekspresi sama dengan nilai2, maka yang akan dieksekusi adalah daftar aksi2, dan seterusnya.

    Jika semua nilai konstan yang didefinisikan tidak ada yang sama dengan ekspresi, maka yang akan dieksekusi adalah daftar aksi yang terdapat pada bagian ELSE.

    Sekarang kita coba menerapkan CASE dengan fungsi berikut.

    DELIMITER //\nCREATE FUNCTION ubah_format_tanggal(tanggal DATE)\n    RETURNS VARCHAR(30) DETERMINISTIC\nBEGIN\n    DECLARE dd INT(2);\n    DECLARE mm INT(2);\n    DECLARE yy INT(4);\n    DECLARE bulan VARCHAR(9);\n\n    SET dd = EXTRACT(DAY FROM tanggal);\n    SET mm = EXTRACT(MONTH FROM tanggal);\n    SET yy = EXTRACT(YEAR FROM tanggal);\n\n    CASE mm\n        WHEN 1 THEN SET bulan = 'Januari';\n        WHEN 2 THEN SET bulan = 'Februari';\n        WHEN 3 THEN SET bulan = 'Maret';\n        WHEN 4 THEN SET bulan = 'April';\n        WHEN 5 THEN SET bulan = 'Mei';\n        WHEN 6 THEN SET bulan = 'Juni';\n        WHEN 7 THEN SET bulan = 'Juli';\n        WHEN 8 THEN SET bulan = 'Agustus';\n        WHEN 9 THEN SET bulan = 'September';\n        WHEN 10 THEN SET bulan = 'Oktober';\n        WHEN 11 THEN SET bulan = 'November';\n        WHEN 12 THEN SET bulan = 'Desember';\n    END CASE;\n\n    RETURN CONCAT(\n        CONVERT(dd, CHAR),\n        ' ',\n        bulan,\n        ' ' ,\n        CONVERT(yy, CHAR)\n    );\nEND\n//\n

    Penjelasan Kode

    Fungsi di atas berguna untuk mengubah format tanggal yang dilewatkan sebagai parameter, dari bentuk standar (dalam format angka) ke bentuk tanggal yang menggunakan nama bulan.

    Sekarang mari kita coba gunakan fungsi tersebut.

    SELECT\n    buku_judul \"Judul\",\n    ubah_format_tanggal(buku_tgl_terbit) \"Tanggal Terbit\",\n    buku_harga \"Harga\"\nFROM\n    buku;\n
    Sebagai perbandingan, coba kita jalankan query di atas tanpa menggunakan fungsiubah_format_tanggal.

    SELECT\n    buku_judul \"Judul\",\n    buku_tgl_terbit \"Tanggal Terbit\",\n    buku_harga \"Harga\"\nFROM\n    buku;\n
    "},{"location":"bab10/#pengulangan-dalam-prosedur-dan-fungsi","title":"Pengulangan dalam Prosedur dan Fungsi","text":"

    Satu atau beberapa aksi dapat dieksekusi secara berulang menggunakan blok perulangan. Di dalam MySQL blok perulangan dapat dibuat menggunakan:

    "},{"location":"bab10/#perintah-loop","title":"Perintah LOOP","text":"

    Berikut format sintaksnya

    LOOP\n    [daftar aksi];\nEND LOOP\n

    Mari langsung kita buat contohnya dengan memasukkan LOOP ke dalam sebuah fungsi.

    DELIMITER //\nCREATE FUNCTION jumlahkan(n INT)\n    RETURNS int(11) DETERMINISTIC\nBEGIN\n    DECLARE i INT DEFAULT 0;\n    DECLARE total INT DEFAULT 0;\n    myloop: LOOP\n        SET i = i + 1;\n        IF i > n THEN\n            -- keluar dari perulangan\n            LEAVE myloop;\n        END IF;\n        SET total = total + i;\n    END LOOP myoop;\n\n    RETURN total;\nEND;\n//\n

    Penjelasan Kode

    Kita memberi label pada badan perulangan dengan nama myloop. Fungsi di atas berguna untuk menjumlahkan n buah bilangan positif pertama.

    Sebagai contoh, jika n bernilai 5, maka hasilnya adalah 15, berasal dari 1 + 2 + 3 + 4 + 5.

    Sekarang, kita coba eksekusi fungsi LOOP tersebut.

    SELECT jumlahkan(5);\n
    "},{"location":"bab10/#perintah-while","title":"Perintah WHILE","text":"

    Bentuk umum sintaksnya adalah

    WHILE [kondisi] DO\n    [daftar aksi];\nENd WHILE\n

    Mari kita buat fungsi yang mengandung WHILE

    DELIMITER //\nCREATE FUNCTION jumlahkan_while(n INT)\n    RETURNS int(11) DETERMINISTIC\nBEGIN\n    DECLARE i INT DEFAULT 1;\n    DECLARE total INT DEFAULT 0;\n    WHILE (i <= n) DO\n        SET total = total + i;\n        SET i = i + 1;\n    END WHILE;\n\n    RETURN total;\nEND;\n//\n

    Penjelasan Kode

    Fungsi di atas merupakan modifikasi dari kode program sebelumnya. Perbedaannya, kali ini kita menggunakan perintah WHILE dalam proses pengulangan aksinya. Hasil yang diperoleh sama seperti pada fungsi sebelumnya.

    "},{"location":"bab10/#perintah-repeat","title":"Perintah REPEAT","text":"

    Format sintaks REPEAT sebagai berikut.

    REPEAT\n    [daftar aksi]\nUNTIL [kondisi]\nEND REPEAT\n
    Sekarang, mari kita coba implementasikan ke dalam sebuah fungsi.

    DELIMITER //\nCREATE FUNCTION jumlahkan_repeat(n INT)\n    RETURNS int(11) DETERMINISTIC\nBEGIN\n    DECLARE i INT DEFAULT 1;\n    DECLARE total INT DEFAULT 0;\n\n    REPEAT\n        SET total = total + i;\n        SET i = i + 1;\n    UNTIL (i > n)\n    END REPEAT;\n\n    RETURN total;\nEND;\n//\n

    Penjelasan Kode

    Ketika dieksekusi, cara kerja fungsi di atas akan sama seperti dua fungsi sebelumnya \ud83d\ude02

    "},{"location":"bab10/#perintah-leave-dan-iterate","title":"Perintah LEAVE dan ITERATE","text":"

    Mari kita coba terapkan keduanya pada fungsi berikut.

    DELIMITER //\nCREATE PROCEDURE tampilkan_bil_genap(n INT)\nBEGIN\n    DECLARE i INT DEFAULT 0;\n    DECLARE str VARCHAR(200) DEFAULT '';\n    next: LOOP\n        SET i = i + 1;\n        IF (i mod 2 = 1) THEN\n            ITERATE next;\n        END IF;\n        IF (i > n) THEN\n            LEAVE next;\n        END IF;\n        SET str = CONCAT(str, CONVERT(i, CHAR), ' ');\n    ENd LOOP next;\n    SELECT str AS \"Bilangan Genap\";\nEND;\n//\n

    Penjelasan Kode

    Pada kode di atas, kita membuat sebuah prosedur yang dapat menampilkan bilangan genap yang terdapat antara bilangan 1 dan n. Nilai n ditentukan pada saat pemanggilan prosedur.

    Sekarang kita coba panggil prosedur di atas.

    CALL tampilkan_bil_genap(50);\n

    Tentu saja

    Perintah tersebut akan menampilkan bilangan genap aygn berada dalam rentang 1 dan 20.

    "},{"location":"bab11/","title":"Trigger","text":"

    Sebelum lebih lanjut membahas trigger, ada baiknya kita siapkan dulu tabel khusus untuk operasi trigger nantinya.

    USE buku_db;\n\nCREATE TABLE histori_buku(\n    buku_isbn CHAR(13),\n    buku_judul VARCHAR(75),\n    penerbit_id CHAR(4),\n    buku_tglterbit DATE,\n    buku_jmlhalaman INT,\n    buku_deskripsi TEXT,\n    buku_harga DECIMAL(10, 0),\n    aksi varchar(6),\n    aksi_tgl DATE\n);\n
    "},{"location":"bab11/#alasan-menggunakan-trigger","title":"Alasan Menggunakan Trigger","text":"

    Beberapa alasan kita menggunakan trigger adalah:

    Selain ketiga manfaat di atas, Trigger juga dapat meringankan kode di bagian aplikasi atau stored procedure yang dikembangkan. Kita tidak perlu menulis kode program di dalam aplikasi untuk melakukan validasi data.

    "},{"location":"bab11/#konsep-trigger","title":"Konsep Trigger","text":"

    Beberapa konsep yang perlu diketahui dan dipahami tentang trigger yaitu:

    "},{"location":"bab11/#daftar-event-untuk-aktivasi-trigger","title":"Daftar Event untuk Aktivasi Trigger","text":"Event Keterangan BEFORE INSERT Trigger diaktivasi sebelum data ditambahkan ke dalam suatu tabel. AFTER INSERT Trigger diaktivasi setelah data ditambahkan ke dalam suatu tabel. BEFORE UPDATE Trigger diaktivasi sebelum data dalam suatu tabel diubah. AFTER UPDATE Trigger diaktivasi setelah data daalam suatu tabel diubah. BEFORE DELETE Trigger diaktivasi sebelum data dihapus daru suatu tabel. AFTER DELETE Trigger diaktivasi setelah data dihapus dari suatu tabel."},{"location":"bab11/#membuat-trigger","title":"Membuat Trigger","text":"

    Format pembuatan trigger adalah

    CREATE TRIGGER [nama_trigger]\n[BEFORE | AFTER]\n[INSERT | UPDATE | DELETE]\nON [nama_tabel]\nFOR EACH ROW\nBEGIN\n    [badan trigger]\nEND\n
    Sekarang mari kita buat trigger nya.

    DELIMITER $$\nCREATE TRIGGER tr_ai_buku\nAFTER INSERT\nON BUKU\nFOR EACH ROW\nBEGIN\n    INSERT INTO histori_buku VALUES (\n    new.buku_isbn,\n    new.buku_judul,\n    new.penerbit_id,\n    new.buku_tglterbit,\n    new.buku_jmlhalaman,\n    new.buku_deskripsi,\n    new.buku_harga,\n    'INSERT',\n    CURRENT_DATE()\n    );\nEND $$\n

    Penjelasan Kode

    "},{"location":"bab11/#memeriksa-pengaruh-trigger","title":"Memeriksa Pengaruh Trigger","text":"

    Untuk memeriksa pengaruh daripada trigger, sekarang kita coba memasukkan sampel data ke dalam tabel buku.

    INSERT INTO buku VALUES(\n    '999-11555-2-2',\n    'Microsoft Excell',\n    'PB04',\n    '2009/02/07',\n    200,\n    NULL,\n    60000\n);\n
    Ketika perintah tersebut dijalankan dan tidak terjadi error maka harusnya datanya masuk ke dalam tabel buku dan ada data baru di tabel histori_buku. Mari kita cek.

    SELECT * FROM histori_buku;\n
    "},{"location":"bab11/#referensi-trigger-new-old","title":"Referensi Trigger : NEW-OLD","text":"

    Referensi NEW dan OLD berguna untuk mengambil:

    Sebagai contoh:

    INSERT INTO\n    penerbit (penerbit_id, penerbit_nama)\nVALUES\n    ('PB06','INFORMATIKA');\n

    Jika perintah di atas dieksekusi maka MySQL akan menyimpan nilai-nilai tersebut ke dalam referensi NEW. Dengan demikian new.penerbit_id akan bernilai PB06 dan new.penerbit_nama akan bernilai INFORMATIKA.

    Contoh lagi

    UPDATE penerbit\n    SET penerbit_nama = 'Informatika Bandung'\nWHERE\n    penerbit_id = 'PB06';\n

    Contoh lagi

    DELETE FROM penerbit\nWHERE penerbit_id = 'PB06';\n

    Kesimpulan

    "},{"location":"bab11/#menghapus-trigger","title":"Menghapus Trigger","text":"

    Untuk menghapus trigger kita bisa menggunakan perintah DROP TRIGGER dengan format

    DRPO TRIGGER [nama_database].[nama_trigger];\n

    Mari kita coba

    DROP TRIGGER buku_db.tr_ai_buku;\n

    Sebenarnya kita bisa juga menghapus trigger tanpa mencantumkan nama databasenya, asalkan saat ini kita sedang mengaktifkan/ menggunakan databasenya.

    DROP TRIGGER tr_ai_buku;\n
    "},{"location":"bab11/#hak-akses-trigger","title":"Hak Akses Trigger","text":""},{"location":"bab11/#batasan-trigger","title":"Batasan Trigger","text":"

    Kita sudah tahu bahwasanya menggunakan trigger dapat membantu pekerjaan kita, namun kita perlu tahu juga bahwasanya trigger juga memiliki beberapa batasan berikut.

    "},{"location":"bab11/#implementasi-trigger","title":"Implementasi Trigger","text":"

    Trigger AFTER UPDATE

    Membuat trigger tr_au_buku yang akan diaktivasi setiap kali user mengubah data pada tabel buku.

    DELIMITER $$\nCREATE TRIGGER tr_au_buku\nAFTER UPDATE\nON buku\nFOR EACH ROW\nBEGIN\n    DECLARE isbn CHAR(13);\n    DECLARE judul VARCHAR(75);\n    DECLARE penerbit_id CHAR(4);\n    DECLARE tgl_terbit DATE;\n    DECLARE jml_halaman INT;\n    DECLARE deskripsi TEXT;\n    DECLARE harga DECIMAL(10,0);\n\n    -- Mengisi nilai isbn\n    IF new.buku_isbn IS NULL THEN\n        SET isbn = old.buku_isbn;\n    ELSE\n        SET isbn = new.buku_isbn;\n    END IF;\n\n    -- mengisi nilai judul\n    IF new.buku_judul IS NULL THEN\n        SET judul = old.buku_judul;\n    ELSE\n        SET judul = new.buku_judul;\n    END IF;\n\n    -- mengisi nilai penerbit_id\n    IF new.penerbit_id IS NULL THEN\n        SET penerbit_id = old.penerbit_id;\n    ELSE\n        SET penerbit_id = new.penerbit_id;\n    END IF;\n\n    -- mengisi nilai tgl_terbit\n    IF new.buku_tglterbit IS NULL THEN\n        SET tgl_terbit = old.buku_tglterbit;\n    ELSE\n        SET tgl_terbit = new.buku_tglterbit;\n    END IF;\n\n    -- mengisi nilai jml_halaman\n    IF new.buku_jmlhalaman IS NULL THEN\n        SET jml_halaman = old.buku_jmlhalaman;\n    ELSE\n        SET jml_halaman = new.buku_jmlhalaman;\n    END IF;\n\n    -- mengisi nilai deskripsi\n    IF new.buku_deskripsi IS NULL THEN\n        SET deskripsi = old.buku_deskripsi;\n    ELSE\n        SET deskripsi = new.buku_deskripsi;\n    END IF;\n\n    -- mengisi nilai harga\n    IF new.buku_harga IS NULL THEN\n        SET harga = old.buku_harga;\n    ELSE\n        SET harga = new.buku_harga;\n    END IF;\n\n    -- memasukkan data ke dalam tabel histori_buku\n    INSERT INTO histori_buku\n    VALUES (\n        isbn,\n        judul,\n        penerbit_id,\n        tgl_terbit,\n        jml_halaman,\n        deskripsi,\n        harga,\n        'UPDATE',\n        CURRENT_DATE()\n    );   \n\nEND $$\n

    Trigger AFTER DELETE

    Membuat trigger tr_ad_buku yang akan diaktivasi setiap kali user mengubah data pada tabel buku.

    DELIMITER $\nCREATE TRIGGER tr_ad_buku\nAFTER DELETE\nON buku\nFOR EACH ROW\nBEGIN\n    INSERT INTO histori_buku VALUES(\n        old.buku_isbn,\n        old.buku_judul,\n        old.penerbit_id,\n        old.buku_tglterbit,\n        old.buku_jmlhalaman,\n        old.buku_deskripsi,\n        old.buku_harga,\n        'DELETE',\n        CURRENT_DATE()\n    );\nEND $$\n

    Sebagai percobaan, sekarang kita coba mengubah data pada tabel buku.

    UPDATE buku\nSET penerbit_id = 'PB05',\n    buku_jmlhalaman = 254,\n    buku_harga = 64000\nWHERE\n    buku_isbn = '999-11555-2-2';\n

    Selanjutnya, kita coba menghapus data dari tabel buku.

    DELETE FROM buku\nWHERE buku_isbn = '999-11555-2-2';\n

    Harusnya ada tambahan 2 baris data pada tabel histori_buku. Sekarang mari kita cek.

    SELECT * FROM histori_buku;\n

    Trigger BEFORE INSERT

    DELIMITER $$\nCREATE TRIGGER tr_bi_buku\nBEFORE INSERT\nON buku\nFOR EACH ROW\nBEGIN\n    IF new.buku_jmlhalaman <= 149 THEN\n        SIGNAL SQLSTATE '45000'\n            SET MESSAGE_TEXT = 'Tidak bisa menambah buku, jumlah halaman terlalu sedikit.';\n    END IF;\nEND $$\n

    Untuk membuktikan pengaruh trigger tersebut, sekarang kita coba tambahkan data buku baru.

    INSERT INTO buku VALUES(\n    '999-11555-2-3',\n    'Microsoft Publisher',\n    'PB04',\n    '2021/02/07',\n    100,\n    NULL,\n    6000\n);\n

    Hasilnya? \ud83d\ude0e

    "},{"location":"bab12/","title":"Ekspor dan Impor","text":""},{"location":"bab12/#mengekspor-data","title":"Mengekspor Data","text":""},{"location":"bab12/#menggunakan-mysqldump","title":"Menggunakan mysqldump","text":""},{"location":"bab12/#menggunakan-mysqlhotcopy","title":"Menggunakan mysqlhotcopy","text":""},{"location":"bab12/#menyalin-file-data","title":"Menyalin File Data","text":""},{"location":"bab12/#menggunakan-backup-table","title":"Menggunakan BACKUP TABLE","text":""},{"location":"bab12/#mengimpor-data","title":"Mengimpor Data","text":""},{"location":"bab2/","title":"Manipulasi Data Dengan DML","text":"
    INSERT, UPDATE, DELETE\n
    "},{"location":"bab2/#memasukkan-data-tabel","title":"Memasukkan Data Tabel","text":""},{"location":"bab2/#tabel-kategori","title":"Tabel Kategori","text":"
    INSERT INTO kategori (kategori_nama) VALUES\n('Database'),\n('Desain Grafis'),\n('Jaringan Komputer'),\n('Pemrograman'),\n('Web dan Internet'),\n('Office Application');\n
    "},{"location":"bab2/#tabel-pengarang","title":"Tabel Pengarang","text":"
    INSERT INTO pengarang VALUES\n('P01','Andi Setiawan'),\n('P02','Rudi Wicaksono'),\n('P03','Beni Tito'),\n('P04','Prasetya'),\n('P05','Erik Rusdianto'),\n('P06','Rosdiana'),\n('P07','Fredi Hidayat'),\n('P08','Hasanudin'),\n('P09','Ahmad hanafi'),\n('P10','Iwan Gunardi'),\n('P11','Iman Teguh'),\n('P12','Abdul Ghozali'),\n('P13','Tegar Sanjaya');\n
    "},{"location":"bab2/#tabel-penerbit","title":"Tabel Penerbit","text":"
    INSERT INTO penerbit VALUES\n('PB01','Angkasa Raya'),\n('PB02','Cahaya Ilmu Persada'),\n('PB03','Sinar Ilmu Perkasa'),\n('PB04','Intan'),\n('PB05','Sinar Raya'),\n('PB06','Informatika'),\n('PB07','Tiga Sekawan'),\n('PB08','Cipta Ilmu');\n
    "},{"location":"bab2/#tabel-buku","title":"Tabel Buku","text":"
    INSERT INTO buku VALUES\n('222-34222-1-0','Belajar Photoshop','PB01','2019/07/02',300,NULL,42000),\n('222-34222-1-1','Panduan CorelDRAW','PB02','2020/03/15',400,NULL,55000),\n('979-96446-9-0','Belajar SQL','PB06','2019/10/12',346,NULL,45000),\n('979-96446-9-1','Panduan Basis Data','PB01','2017/03/02',257,NULL,37000),\n('979-96446-9-2','Perancangan Sistem','PB03','2013/09/20',403,NULL,37000),\n('979-96446-9-3','Microsoft Access','PB06','2015/07/13',400,NULL,48500),\n('888-96771-3-0','Pemrograman Pascal','PB08','2014/11/01',350,NULL,50000),\n('888-96771-3-1','Pemrograman Java','PB06','2017/01/23',450,NULL,72000),\n('888-96771-3-2','Pemrograman C untuk Hardware','PB05','2016/12/25',398,NULL,47000),\n('888-96771-3-3','Panduan C++','PB06','2015/07/15',490,NULL,65000),\n('888-96771-3-4','Belajar Delphi','PB05','2018/08/11',328,NULL,50000),\n('888-96771-3-5','Visual Basic','PB02','2017/10/14',250,NULL,50000),\n('666-96771-2-0','Panduan Membangun Jaringan TCP/IP','PB08','2016/08/02',200,NULL,60000),\n('666-96771-2-1','Implementasi TCP/IP di Linux','PB08','2018/11/21',230,NULL,350000),\n('777-76723-5-0','Belajar PHP 8','PB07','2020/05/02',600,NULL,95000),\n('777-76723-5-1','Aplikasi Web dengan Python','PB07','2014/08/01',180,NULL,30000),\n('777-76723-5-2','Internet Marketing','PB07','2017/01/24',150,NULL,38500),\n('777-76723-5-3','Panduan Menjadi Youtuber','PB07','2017/01/24','243',NULL,38500),\n('999-11555-2-0','Microsoft Power Point','PB06','2018/11/23',300,NULL,57500),\n('999-11555-2-1','Microsoft Word','PB04','2017/12/01',270,NULL,60000);\n
    "},{"location":"bab2/#tabel-link-buku-pengarang","title":"Tabel Link Buku Pengarang","text":"
    INSERT INTO link_buku_pengarang VALUES\n('222-34222-1-0','P01'),\n('222-34222-1-1','P04'),\n('666-96771-2-0','P04'),\n('666-96771-2-0','P07'),\n('666-96771-2-0','P06'),\n('666-96771-2-1','P04'),\n('666-96771-2-1','P01'),\n('777-76723-5-0','P02'),\n('777-76723-5-0','P04'),\n('777-76723-5-1','P03'),\n('777-76723-5-1','P12'),\n('777-76723-5-1','P10'),\n('777-76723-5-2','P13'),\n('777-76723-5-3','P08'),\n('777-76723-5-3','P09'),\n('888-96771-3-0','P04'),\n('888-96771-3-1','P02'),\n('888-96771-3-1','P11'),\n('888-96771-3-2','P01'),\n('888-96771-3-2','P06'),\n('888-96771-3-3','P02'),\n('888-96771-3-4','P10'),\n('888-96771-3-4','P09'),\n('888-96771-3-5','P02'),\n('979-96446-9-0','P11'),\n('979-96446-9-0','P02'),\n('979-96446-9-1','P07'),\n('979-96446-9-2','P13'),\n('979-96446-9-2','P10'),\n('979-96446-9-2','P12'),\n('979-96446-9-2','P03'),\n('979-96446-9-3','P11'),\n('999-11555-2-0','P11'),\n('999-11555-2-0','P13'),\n('999-11555-2-1','P08'),\n('999-11555-2-1','P09'),\n('999-11555-2-1','P10'),\n('999-11555-2-1','P06');\n
    "},{"location":"bab2/#tabel-link-buku-kategori","title":"Tabel Link Buku Kategori","text":"
    INSERT INTO link_buku_kategori VALUES\n('222-34222-1-0',2),\n('222-34222-1-1',2),\n('979-96446-9-0',1),\n('979-96446-9-1',1),\n('979-96446-9-2',1),\n('979-96446-9-2',4),\n('979-96446-9-3',1),\n('888-96771-3-0',4),\n('888-96771-3-1',4),\n('888-96771-3-2',4),\n('888-96771-3-3',4),\n('888-96771-3-4',4),\n('888-96771-3-5',4),\n('666-96771-2-0',3),\n('666-96771-2-1',3),\n('777-76723-5-0',4),\n('777-76723-5-0',5),\n('777-76723-5-1',4),\n('777-76723-5-1',5),\n('777-76723-5-2',5),\n('777-76723-5-3',5),\n('999-11555-2-0',6),\n('999-11555-2-1',6);\n
    "},{"location":"bab2/#query-tambahan","title":"Query Tambahan","text":""},{"location":"bab2/#mengubah-data","title":"Mengubah Data","text":"

    Mengubah Data Tabel Penerbit

    UPDATE penerbit\n    SET penerbit_nama = 'Informatika Bandung'\nWHERE\n    penerbit_id = 'PB06';\n

    Mengubah Data Tabel Buku

    UPDATE buku\n    SET buku_judul = 'Tuntunan Praktis Menggunakan Microsoft Word 2010',\n        penerbit_id = 'PB02'\nWHERE\n    buku_isbn = '999-11555-2-1';\n

    "},{"location":"bab2/#menghapus-data","title":"Menghapus Data","text":"

    Menghapus 1 Baris Data

    DELETE FROM buku\nWHERE buku_isbn = '888-96771-3-5';\n

    Menghapus Seluruh Baris Data

    DELETE FROM buku;\n

    Menghapus tabel beserta isinya, lalu mere-build ulang tabel tanpa data

    TRUNCATE table buku;\n

    "},{"location":"bab3/","title":"Kontrol Hak Akses & Transaksi Data","text":"
    TCL : Grant, Revoke, Commit, Rollback\n
    INSERT INTO test VALUES\n(1,'Baris Pertama'),\n(2,'Baris Ke dua'),\n(3,'Baris ke tiga');\n
    COMMIT;\n
    INSERT INTO test VALUES\n(4,'Baris ke empat'),\n(5,'Baris ke lima'),\n(6,'Baris ke enam');\n
    ROLLBACK;\n
    "},{"location":"bab4/","title":"Seleksi Data - Bagian 1","text":""},{"location":"bab4/#perintah-select","title":"Perintah SELECT","text":"

    Menampilkan seluruh kolom dan data dalam tabel

    SELECT * FROM buku;\n

    Menampilkan beberapa kolom dari tabel buku

    SELECT  buku_isbn,\n        buku_judul,\n        penerbit_id,\n        buku_tglterbit,\n        buku_jmlhalaman,\n        buku_deskripsi,\n        buku_harga\nFROM\n    buku;\n

    Menampilkan beberapa kolom dari tabel buku dan memberi alias

    SELECT  buku_isbn ISBN,\n        buku_judul JUDUL,\n        penerbit_id PENERBIT,\n        buku_tglterbit TERBIT,\n        buku_jmlhalaman HALAMAN,\n        buku_deskripsi DESKRIPSI,\n        buku_harga HARGA\nFROM\n    buku;\n

    Menampilkan seluruh data dari beberapa kolom

    SELECT\n    buku_harga,\n    buku_judul\nFROM\n    buku;\n

    Menampilkan seluruh data dari beberapa kolom dan memberi alias

    SELECT\n    buku_harga HARGA,\n    buku_judul JUDUL\nFROM\n    buku;\n

    Menyertakan nama database dan tabel dalam perintah SELECT

    SELECT\n    buku.buku_isbn,\n    buku.buku_judul,\n    buku.buku_harga\nFROM\n    buku_db.buku;\n

    Menggunakan Alias tabel

    SELECT\n    a.buku_isbn,\n    a.buku_judul,\n    a.buku_harga\nFROM\n    buku a;\n

    Menggunakan Alias pada nama kolom

    SELECT\n    buku_isbn as 'ISBN',\n    buku_judul as 'JUDUL BUKU',\n    buku_harga as 'HARGA'\nFROM\n    buku;\n

    "},{"location":"bab4/#menyaring-data","title":"Menyaring Data","text":"

    Data yang ditampilkan dapat disaring (filter) berdasarkan kebutuhan informasi yang akan disajikan. Untuk menyaring data, perlu didefinisikan kondisi yang akan dijadikans ebagai kriteria penyaringan. Dalam perintah SELECT ditambah klausa WHERE setelahnya.

    Contoh 1 Menampilkan data buku yang harganya kurang dari Rp. 45.000

    SELECT\n    buku_isbn as 'ISBN',\n    buku_judul as 'JUDUL BUKU',\n    buku_harga as 'HARGA'\nFROM\n    buku\nWHERE\n    buku_harga < 45000;\n

    Menampilkan data buku yang harganya kurang dari Rp. 45.000 dan ISBN diawali oleh angka 777

    SELECT\n    buku_isbn as 'ISBN',\n    buku_judul as 'JUDUL BUKU',\n    buku_harga as 'HARGA'\nFROM\n    buku\nWHERE\n    (buku_harga < 45000) AND\n    (buku_isbn LIKE '777%');\n

    Menampilkan data dengan rentang tertentu Menggunakan klausa BETWEEN

    Contoh BETWEEN 1

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nWHERE\n    buku_harga\n    BETWEEN 50000 AND 60000;\n

    Contoh BETWEEN 2

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nWHERE\n    (buku_harga >= 50000) AND\n    (buku_harga <= 60000);\n

    "},{"location":"bab4/#klausa-limit","title":"Klausa LIMIT","text":"

    LIMIT digunakan untuk membatasi data yang disajikan sesuai batas limit yang ditentukan terurut dari atas.

    Contoh LIMIT 1

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nLIMIT 5;\n

    LIMIT juga bisa membatasi data yang dimulai dari baris tertentu. Contoh LIMIT 2 Membatasi 10 data dimulai dari urutan ke-6

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nLIMIT 5,10;\n

    "},{"location":"bab4/#klausa-distinct","title":"Klausa DISTINCT","text":"

    Klausa ini berfungsi untuk menghilangkan data yang dobel saat disajikan.

    Contoh sebelum diberi DISTINCT

    SELECT penerbit_id FROM buku;\n

    Setelah diberi klausa DISTINCT

    SELECT DISTINCT penerbit_id FROM buku;\n

    "},{"location":"bab4/#mengurutkan-data","title":"Mengurutkan Data","text":"

    Secara default data yang disajikan menggunakan printah SELECT akan ditmpilkan sesuai urutan data dimasukkan, kecuali pada kolom yang diatur sebagai primary key, maka dia akan urut sesui bilangan. Untuk mengurutkan data sesuai kolom tertentu kita bisa menggunakan klausa ORDER BY.

    Contoh Penggunaan ORDER BY Mengurutkan datan sesuai kolom 'buku_judul'

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nORDER BY\n    buku_judul;\n

    Pengurutan data dari terkecil ke terbesar (Ascending)

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nORDER BY\n    buku_judul ASC;\n

    Pengurutan data dari terbesar ke terkecil (Descending)

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nORDER BY\n    buku_judul DESC;\n

    "},{"location":"bab5/","title":"Seleksi Data - Bagian 2","text":""},{"location":"bab5/#pengelompokan-data-menggunakan-group-by","title":"Pengelompokan Data menggunakan GROUP BY","text":"

    Penggunaan kalusa GROUP BY disertakan dalam perintah SELECT - Contoh 1

    SELECT\n    penerbit_id,\n    COUNT(*)\nFROM\n    buku\nGROUP BY\n    penerbit_id;\n
    Jumlah buku yang ditampilkan dari hasil kode di atas adalah hasil dari proses pengelompokan brdasarkan penerbit (dalam hal ini kolom penerbit_id).

    GROUP CONCAT() adalah fungsi agregasi yagn berguna untuk mengelompokkan baris data menjadi satu teks (string) tunggal.

    "},{"location":"bab5/#menggabungkan-data","title":"Menggabungkan Data","text":"

    Proses menggabungkan 2 query select menjadi 1 dengan perintah UNION dengan syarat masing-masing query select menghasilkan jumlah row data yang sama.

    "},{"location":"bab5/#join-seleksi-data-dari-2-tabel-atau-lebih","title":"Join : Seleksi Data dari 2 Tabel atau Lebih","text":"

    Seleksi data dari 2 tabel atau lebih, lebih rumit dibandingkan seleksi data dari 1 tabel. Syarat utamanya adalah adanya kolom relasi. Kolom relasi adalah kolom yang digunakan sebagai kunci untuk menghubungkan antara tabel yang satu dengan tabel yang lain.

    "},{"location":"bab5/#pengurangan-dan-interseksi-data","title":"Pengurangan dan Interseksi Data","text":"

    Hal ini dilakukan untuk menyeleksi sekelompok data dari satu tabel lalu dikurangi dengan sekelompok data dari tabel lain.

    "},{"location":"bab5/#sub-query","title":"Sub-query","text":"

    Subquery adalah perintah SELECT yang terdapat dalam perintah SELECT lain. Hal ini memudahkan kita untuk membuat berbagai format laporan semisal crosstab query.

    Subquery juga biasa digunakan sebagai kolom penentu kondisi query (di bagian WHERE).

    "},{"location":"bab6/","title":"Tabel Virtual","text":"

    View adalah objek di dalam database yang berisi kumpulan kolom yang dihasilkan dari perintah SELECT. Sederhananya view adalah objek yang menyimpan hasil query, baik dari satu tabel atau lebih. View juga sering disebut sebagai tabel virtual, karena view sebenranya tidak memiliki data. Data yang ditampilkan oleh view diambil dari tabel-tabel aktual yang disertakan dalam perintah SELECT.

    "},{"location":"bab6/#mengapa-perlu-menggunakan-tabel-virtual","title":"Mengapa Perlu Menggunakan Tabel Virtual?","text":"

    Dalam pengelolaan database, view memiliki manfaat bagi kita, di antaranya:

    1. Akses data menjadi lebih mudah.
      • Dapat digunakan untuk menampilkan rangkuman dari suatu perhitungan tertentu.
      • Dapat menampilkan beberapa kolom atau beberapa baris saja dari suatu tabel, tergantung dari kondisi yang didefinisikan.
      • Dapat digunakan untuk menampilkan data yang berasal dari dua tabel atau lebih.
    2. View dapat digunakan untuk menampilkan data yang berbeda untuk masing-masing user, sehingga setiap user hanya dapat melihat data yang sesuai dengan hak aksesnya.

    Pada kasus-kasus tertentu, data yang terdapat dalam satu view juga harus dapat dimodifikasi menggunakan perintah INSERT, UPDATE maupun DELETE. Jika data dalam suatu view diubah, sebenarnya yang berubah adalah data pada base table.

    "},{"location":"bab6/#membuat-view","title":"Membuat View","text":"

    Dalam MySQL, view dibuat menggunakan perintah CREATE VIEW. Berikut sintaks umum yang digunakan.

    CREATE VIEW [nama_view] AS [perintah SELECT];\n
    Sekarang kita buat view-nya.
    CREATE VIEW v_buku AS\nSELECT\n    a.buku_isbn,\n    a.buku_judul,\n    b.penerbit_nama,\n    a.buku_tglterbit,\n    a.buku_jmlhalaman,\n    a.buku_harga\nFROM\n    buku a,\n    penerbit b\nWHERE\n    a.penerbit_id = b.penerbit_id\nORDER BY\n    a.buku_judul;\n
    Perintah di atas akan mendefinisikan view di dalam database dengan nama v_buku. View tersebut berisi perintah SELECT yang melibatkan dua tabel, yaitu buku dan penerbit. Kolom relasi antara dua tabel tersebut adalah kolom penerbit_id.

    Sekarang kita bisa menampilkan data buku dengan SELECT view tersebut, berikut query-nya.

    SELECT * FROM v_buku;\n

    "},{"location":"bab6/#melihat-daftar-kolom-di-dalam-view","title":"Melihat Daftar Kolom di dalam view","text":"

    Sama halnya seperti pada objek tabel, kita juga dapat melihat daftar kolom yang terdapat di dalam suatu view. Untuk melakukan hal ini kita bisa menjalankan query. Contoh:

    DESC v_buku;\n

    "},{"location":"bab6/#mengubah-view","title":"Mengubah View","text":"

    Untuk mengubah definisi dari suatu view yang sebelumnya sudah dibuat, kita perlu menggunakan perintah ALTER VIEW. Perintah ini akan membuang atau menghapus definisi view yang lama dan menimpanya dengan definisi view yang baru. Format query-nya sebagai berikut.

    ALTER VIEW [nama_view] AS [perintah SELECT yang baru]\n

    Sekarang perhatikan dan jalankan query berikut.

    ALTER VIEW v_buku AS\nSELECT\n    a.buku_isbn,\n    a.buku_judul,\n    b.penerbit_nama,\n    a.buku_harga\nFROM\n    buku a,\n    penerbit b\nWHERE\n    a.penerbit_id = b.penerbit_id\nORDER BY\n    a.buku_judul;\n

    "},{"location":"bab6/#menghapus-view","title":"Menghapus View","text":"

    Kita dapat menghapus satua tau lebih view yang terdapat di dalam database dengan menggunakan perintah DROP VIEW. Format umum query-nya adalah sebagai berikut.

    DROP VIEW [IF EXISTS] [nama_view];\n
    IF EXISTS bersifat opsional dan berfungsi untuk mencegah terjadinya kesalahan pada saat perintah tersebut dieksekusi, yaitu dengan cara melakukan pemeriksaan terlebih dahulu, apakah view yang akan dihapus tersebut ada di dalam database atau tidak.

    Jika nama view yang disertakan dalam perintah DROP VIEW ternyata tidak ada, maka server MySQL akan mengeluarkan pesan peringatan/ warning. Kitadapat menampilkan isi peringatan tersebut dengan perintah SHOW WARNINGS.

    Perhatikan query berikut.

    DROP VIEW v1, v2;\n
    Query di atas akan menghapus dua view sekaligus. Sekarang jalankan query berikut untuk menghapus view v_buku.

    DROP VIEW v_buku;\n
    "},{"location":"bab6/#membuat-view-yang-dapat-dimodifikasi","title":"Membuat View yang Dapat Dimodifikasi","text":"

    Suatu view dapat dimodifikasi jika kolom-kolom dalam view tersebut mengacu langsung ke kolom yang terdapat pada base tabel, bukan hasil proses perhitungan. Sebagai contoh, coba perhatikan dan jalankan query berikut.

    Membuat view v_jmlBukuPerPenerbit

    CREATE VIEW v_jmlBukuPerPenerbit AS\nSELECT\n    b.penerbit_nama \"Nama Penerbit\",\n    COUNT(a.buku_judul) \"Jumlah Buku\"\nFROM\n    buku a,\n    penerbit b\nWHERE\n    a.penerbit_id = b.penerbit_id\nGROUP BY\n    b.penerbit_nama\nORDER BY\n    b.penerbit_nama;\n
    View tersebut berfungsi untuk menampilkan laporan jumlah buku per penerbit. Untuk melihat hasilnya jalankan query berikut.
    SELECT * FROM v_jmlBukuPerPenerbit;\n
    View di atas merupakan view yang tidak dapat dimodifikasi, karena data yang ditampilkan merupakan hasil proses perhitungan dari fungsi COUNT().

    Sekarang kita coba membuat view yang bisa dimodifikasi. Perhatikan dan jalankan query berikut.

    Membuat view v_jmlHalaman

    CREATE VIEW v_jmlHalaman AS\nSELECT\n    buku_isbn,\n    buku_judul,\n    buku_jmlhalaman\nFROM\n    buku\nORDER BY\n    buku_isbn;\n
    Selanjutnya kita coba lihat data yang disajikan dari view di atas.
    SELECT * FROM v_jmlHalaman\nWHERE\n    buku_isbn = \"999-1555-2-1\";\n
    Perhatikan hasilnya, maka akan menampilkan 1 baris data. Sekarang kita coba lakukan modifikasi terhadap view tersebut dengan query berikut.
    UPDATE v_jmlHalaman\nSET\n    buku_halaman = buku_halaman + 10\nWHERE\n    buku_isbn = \"999-1555-2-1\";\n
    Setelah berhasil mengupdate view v_jmlHalaman, kita coba ulangi perintah berikut dan perhatikan hasilnya.
    SELECT * FROM v_jmlHalaman\nWHERE\n    buku_isbn = \"999-1555-2-1\";\n

    Perhatikan nilai dari kolom buku_jmlhalaman. Nilai yang ditampilkan sekarang adalah 280, yang awalnya bernilai 270. Ini terjadi karena kita telah melakukan modifikasi terhadap view v_jmlHalaman menggunakan perintah UPDATE.

    Data yang sebenarnya diubah adalah data pada kolom tabel yang diakses, bukan data di dalam view yang bersangkutan. karena secara fisik view tidak pernah memiliki data. Karena inilah view sering disebut sebagai tabel virtual. Untuk membuktikan hal ini sekarang mari kita lihat datanya langsung dari tabel asli.

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_jmlhalaman\nFROM\n    buku\nWHERE\n    buku_isbn = \"999-1555-2-1\";\n
    Hasil yang diperoleh akan sama seperti pada asat kita mengaksesnya melalui view v_jmlHalaman.

    "},{"location":"bab6/#batasan-batasan-dalam-penggunaan-view","title":"Batasan-batasan dalam Penggunaan View","text":"

    Pendefinisian view dapat menggunakan klausa-klausa yang terdapat pada perintah SELECT, seperti WHERE, GROUP BY, ORDER BY dan lain-lain. Namun demikian ada batasan-batasan yang perlu diperhatikan, yaitu:

    1. Kita tidak dapat membuat view temporari
    2. Kita tidak dapat mengasosiasikan trigger dengan view
    3. Tabel-tabel yang diakses oleh view harus ada di dalam database. Jika nama tabel diubah, maka view tidak dapat digunakan lagi, karena terjadi kesalahan pada saat dieksekusi
    4. Perintah SELECT yang didefinisikan di dalam view tidak boleh berisi kontruksi-kontruksi berikut:
      • Subquery di dalam klausa FROM
      • Mengacu ke tabel temporari
    "},{"location":"bab7/","title":"Manajemen User","text":""},{"location":"bab7/#membuat-user","title":"Membuat User","text":"

    User adalah orang yang dapat menggunakan database. Sejauh mana user tersebut dapat bekerja di dalam database ditentukan dari hak akses yang dimilikinya: apakah sebagai Database Administrator yang memiliki hak akses penuh terhadap database yang diolah ataupun sekedar Operator yang memiliki hak akses terbatas sesuai jenis pekerjaannya.

    Format query untuk membuat user adalah sebagai berikut.

    CREATE USER [nama_user] IDENTIFIED BY [password];\n

    Jalankan query berikut untuk membuat user baru.

    CREATE USER 'admin' IDENTIFIED BY 's3cr3t';\n
    Query tersebut akan membuat user baru dengan nama admin dan password s3cr3t. Ingat, bahwa user tersebut baru kita buat dan belum memiliki hak akses apapun terhadap database, namun kita sudah bisa login ke server MySQL menggunakan user tersebut.

    Keluar dari user saat ini dengan perintah \\q lalu ENTER. Selanjutnya mari kita login

    mysql -u admin -p\n
    Tekan ENTER lalu masukkan password s3cr3t dan tekan ENTER. Setelah berhasil coba jalankan query berikut.

    Menampilkan database

    SHOW DATABASES;\n

    Mengaktifkan/ menggunakan database buku_db

    USE buku_db;\n
    Apa hasilnya? \ud83d\ude02

    "},{"location":"bab7/#mengenal-hak-akses","title":"Mengenal Hak Akses","text":"

    Hak akses adalah suatu izin yang dapat diberikan kepada seorang user. Dengan izin tersebut, seorang user dapat melakukan aksi-aksi tertentu terhadap database.

    Hak akses tersebut dikelompokkan menjadi 2, yaitu:

    1. Tingkat User
    2. Tingkat Administrator

    Hak Akses Tingkat User

    Hak Akses Keterangan CREATE Membuat database, tabel atau indeks CREATE TEMPORARY TABLE Membuat tabel temporari CREATE VIEW Membuat view DELETE Menghapus baris data EXECUTE Mengeksekusi prosedur INDEX Membuat indeks INSERT Memasukkan baris-baris data ke dalam tabel LOCK TABLES Mengunci suatu tabel SELECT Mengambil/ memilih data dari tabel SHOW DATABASES Menampilkan semua database SHOW VIEW Melihat daftar view yang dimiliki database UPDATE Mengubah data di dalam tabel USAGE Melakukan login, tapi tidak bisa melakukan apapun

    Hak Akses Tingkat Administrator

    Hak Akses Keterangan ALL Memiliki semua hak akses, kecuali WITH GRANT OPTION ALTER Mengubah struktur tabel CREATE USER Membuat user lain DROP Menghapus database, tabel atau view FILE Memuat data dari suatu file PROCESS Melihat daftar proses yang dieksekusi MySQL RELOAD Menggunakan perintah FLUSH SHUTDOWN Menghentikan server MySQL"},{"location":"bab7/#memberi-hak-akses","title":"Memberi Hak Akses","text":"

    Perintah yagn digunakan untuk memberikan hak akses adalah GRANT, format umumnya sebgaimana berikut.

    GRANT [hak akses]\nON [nama_tabel]|*|*.*|[nama_database]\nTO [nama_user]\nIDENTIFIED BY [password];\n
    Jalankan query berikut untuk memberikan semua hak akses pada semua tabel yang terdapat dalam database bukudb kepada user admin.

    GRANT ALL\nON bukudb.*\nTO 'admin'@'%'\nIDENTIFIED BY 's3cr3t';\n

    Terkadang kita tidak perlu memberikan semua hak akses kepada user tertentu, untuk itu kita bisa menjalankan query berikut sebagai contohnya.

    GRANT USAGE, INSERT, UPDATE, DELETE, SELECT\nON pengarang\nTO 'admin'@'%'\nIDENTIFIED BY 's3cr3t';\n

    Dengan query tersebut, maka user admin hanya bisa memasukkan, mengubah, menghapus dan mengambil/ menampilkan data yang terdapat pada tabel pengarang saja.

    "},{"location":"bab7/#mencabut-hak-akses","title":"Mencabut Hak Akses","text":"

    Untuk mencabut/ menarik kembali hak akses dari user tertentu bisa menggunakan perintah REVOKE dengan format

    REVOKE [hak akses]\nON [nama_tabel]|*|*.*|[nama_database]\nFROM [nama user];\n

    Contoh 1

    REVOKE ALL\nON bukudb.*\nFROM admin\n
    Query tersebut akan mencabut semua hak akses admin terahdap database bukudb.

    Contoh 2

    REVOKE USAGE, INSERT, UPDATE, DELETE, SELECT\nON pengarang\nFROM 'admin';\n
    Query tersebut akan mencabut hak akses USAGE, INSERT, UPDATE, DELETE, SELECT dari user admin terhadap tabel pengarang.

    "},{"location":"bab7/#menghapus-user","title":"Menghapus User","text":"

    Untuk menghapus user format query-nya adalah

    DROP USER [nama_user_1], [nama_user_2], ...dst;\n

    Mari kita coba

    DROP USER 'admin'@'%';\n

    "},{"location":"bab7/#mengetahui-tabel-hak-akses","title":"Mengetahui Tabel Hak Akses","text":"

    Ketika kita menjalankan query GRANT dan REVOKE, sebenarnya MySQL menyimpan data hak akses tersebut di dalam database mysql. Sehingga sebenarnya kita bisa saja melihat bahkan memberi ataupun menghapus hak akses user dengan memanipulasi database mysql tanpa melakukan query GRANT dan REVOKE.

    Jika kita ingin memodifikasi data secara langsung, kita harus menjalankan query

    FLUSH PRIVILEGES\n
    Perintah tersebut berfungsi me-refresh perubahan yang telah dilakukan ke dalam database mysql.

    Berikut beberapa tabel dalam database mysql yang berkaitan dengan proses pemberian dan pencabutan hak akses user.

    Coba kita jalankan query berikut.

    Mengaktifkan database mysql dan menampilkan seluruh tabel di dalamnya.

    USE mysql;\nSHOW TABLES;\n

    Menampilkan struktur tabel user

    DESC user;\n

    Menampilkan beberapa kolom data dari tabel user.

    SELECT user, host\nFROM user;\n

    "},{"location":"bab8/","title":"Fungsi Agregasi","text":"

    Fungsi Agregasi adalah fungsi di dalam MySQL yang digunakan untuk melakukan perhitungan pada query. Pada umumnya penggunaannya dikombinasikan dengan klausa GROUP BY untuk menghasilkan rangkuman nilai yang dikelompokkan berdasarkan nilai tertentu.

    Berikut ini beberapa fungsi yang termasuk dalam fungsi agregasi:

    "},{"location":"bab8/#fungsi-min","title":"Fungsi MIN()","text":"

    Menampilkan jumlah halaman paling sedikit

    SELECT MIN(buku) FROM buku;\n

    Menampilkan urutan abjad paling awal dari judul buku

    SELECT MIN(buku_judul) FROM buku;\n

    "},{"location":"bab8/#fungsi-max","title":"Fungsi MAX()","text":"

    Contoh, menampilkan halaman buku terbanyak.

    SELECT MAX(buku_jmlhalaman) FROM buku;\n

    Menampilkan buku dengan abjad paling akhir.

    SELECT MAX(buku_judul) FROM buku;\n

    "},{"location":"bab8/#fungsi-sum","title":"Fungsi SUM()","text":"

    SUM() berguna untuk menjumlahkan nilai dari suatu kolom dalam tabel tertentu. Contoh:

    SELECT SUM(buku_jmlhalaman) FROM buku;\n
    Nilai yang tampil merupakan total dari semua jumlah halaman buku pada kolom buku_jmlhalaman.

    "},{"location":"bab8/#fungsi-count","title":"Fungsi COUNT()","text":"

    Berbeda dengan SUM(), fungsi COUNT() akan mengembalikan jumlah baris data pada kolom dari tabel tertentu.

    Contoh, menampilkan jumlah buku dari penerbit dengan penerbit_id = PB06.

    SELECT COUNT(*)\nFROM buku\nWHERE penerbit_id = 'PB06';\n

    Untuk lebih membuktikan, coba kita cek dengan cara biasa.

    SELECT\n    buku_isbn,\n    buku_judul\nFROM\n    buku\nWHERE\n    penerbit_id = 'PB06';\n

    "},{"location":"bab8/#fungsi-avg","title":"Fungsi AVG()","text":"

    Berfungsi untuk mendapatkan nilai rata-rata dari suatu kolom. Sebagai contoh, kita ibsa menghitung nilai rata-rata dari jumlah halaman buku dengan kode penerbit PB06 dengan perintah berikut.

    SELECT\n    AVG(buku_jmlhalaman)\nFROM\n    buku\nWHERE\n    penerbit_id = 'PB06';\n

    Untuk lebih membuktikan, silahkan jalankan perintah berikut dan hitung rata-rata kolom buku_jmlhalaman secara manual.

    SELECT\n    buku_isbn,\n    buku_judul,\n    penerbit_id,\n    buku_jmlhalaman\nFROM\n    buku\nWHERE \n    penerbit_id = 'PB06';\n

    "},{"location":"bab8/#fungsi-group_concat","title":"Fungsi GROUP_CONCAT()","text":"

    Contoh, menampilkan data nama penerbit dari tabel penerbit.

    SELECT penerbit_nama\nFROM penerbit;\n

    Selanjutnya kita ubah query nya sebagai berikut.

    SELECT GROUP_CONCAT(penerbit_nama)\nFROM penerbit;\n

    Hasilnya, semua baris data akan digabungkan menjadi 1 baris.

    Dalam kasus yang lebih nyata, kita bisa mengelompokkan daftar buku sesuai nama penerbit. berikut query-nya.

    SELECT\n    b.penerbit_nama,\n    GROUP_CONCAT(a.buku_judul)\nFROM\n    buku a,\n    penerbit b\nWHERE\n    a.penerbit_id = b.penerbit_id\nGROUP BY\n    b.penerbit_nama\nORDER BY\n    b.penerbit_nama;\n

    Fungsi GROUP_CONCAT() memiliki beberapa bentuk penggunaan, yaitu:

    "},{"location":"bab8/#fungsi-agregasi-pada-nilai-null","title":"Fungsi Agregasi Pada Nilai NULL","text":"

    Secara umum, fungsi-fungsi agregasi akan mengabaikan nilai NULL, kecuali COUNT(). Fungsi COUNT() memiliki sifat:

    Untuk membuktikan hal tersebut, kita buat contoh tabel baru tnull.

    CREATE TABLE tnull(\n    a int\n);\n

    Memasukkan data ke dalam tabel tnull

    INSERT INTO tnull VALUES\n(1),\n(NULL),\n(NULL),\n(NULL),\n(NULL);\n

    Sekarang kita buktikan sifat pertama.

    SELECT COUNT(*) \nFROM tnull;\n
    Hasilnya adalah 5, karena nilai NULL tetap dihitung.

    Sekarang kita buktikan sifat kedua.

    -- Query-1\nSELECT COUNT(DISTINCT a)\nFROM tnull;\n\n-- Query-2\nSELECT COUNT(a)\nFROM tnull;\n
    Hasilnya adalah 1 karena nilai NULL tidak dihitung sebagai 1 baris data, dengan kata lain NULL diabaikan.

    Perintah SELECT mungkin saja menghasilkan baris kosong atau nilai NULL di setiap barisnya. Jika kita menggunakan fungsi agregasi pada kolom yang berisi baris kosong atau nilai NULL di setiap baris yang ada, maka:

    Sebagai bukti, coba kita hapus 1 baris data yang berisi nilai non-NULL.

    DELETE FROM tnull\nWHERE a=1;\n
    Lalu kita cek data yang tersisa
    SELECT * FROM tnull;\n

    Selanjutnya kita coba eksekusi satu-persatu fungsi agregasi untuk mengetahui nilai yang dikembalikan.

    SELECT COUNT(a) FROM tnull;\n
    Perintah di atas akan menghasilkan nilai 0 (nol), namun jika kita mencoba fungsi agregasi yang lain,

    SELECT MIN(a) FROM tnull;\nSELECT MAX(a) FROM tnull;\nSELECT SUM(a) FROM tnull;\nSELECT AVG(a) FROM tnull;\nSELECT GROUP_CONCAT(a) FROM tnull;\n
    Semua perintah di atas akan menghasilkan nilai NULL.

    "},{"location":"bab9/","title":"Operator dan Fungsi","text":"

    Beberapa fungsi yang sering dipakai dapat dikelompokkan menjadi:

    "},{"location":"bab9/#operator","title":"Operator","text":""},{"location":"bab9/#operator-aritmatika","title":"Operator Aritmatika","text":"

    Operator aritmatika digunakan untuk melakukan perhitungan di dalam query maupun prosedur/ fungsi. Berikut daftarnya

    Operator Keterangan + Untuk melakukan operasi penjumlahan - Untuk melakukan operasi pengurangan * Untuk melakukan operasi perkalian / Untuk melakukan operasi pembagian

    Contoh kasus, kita akan menghitung harga buku tertentu yang sudah didiskon sebanyak 25%.

    SELECT\n    buku_judul 'Judul',\n    buku_harga 'Harga Normal',\n    buku_harga - (0.25 * buku_harga) 'Harga Diskon 25%'\nFROM\n    buku\nWHERE\n    buku_isbn IN ('222-34222-1-0','222-34222-1-1')\n

    "},{"location":"bab9/#operator-relasional","title":"Operator Relasional","text":"

    Operator relasional digunakan untuk membandingkan dua nilai atau ekspresi. Berikut tabel operator-operator yang termasuk.

    Operator Keterangan = Sama dengan != atau <> Tidak sama dengan < Lebih kecil <= Lebih kecil atau sama dengan > Lebih besar >= Lebih besar atau sama dengan n BETWEEN min AND max Memeriksa n apakah berada di dalam rentang min dan max atau tidak n IN (set) Memeriksa keanggotaan himpunan (set), apakah n anggota dari himpunan yang didefinisikan atau tidak n IS NULL Memeriksa nilai n dengan nilai NULL ISNULL(n) Memeriksa nilai n, NULL atau tidak

    Sebagai contoh, kita akan menampilkan daftar buku yang harganya di bawah Rp. 50.000.

    SELECT\n    buku_isbn,\n    buku_judul,\n    buku_harga\nFROM\n    buku\nWHERE\n    buku_harga <= 50000\n

    "},{"location":"bab9/#operator-logika","title":"Operator Logika","text":"

    Oeprator logika berfungsi untuk memeriksa nilai kebenaran (true atau false). Berikut daftar operatornya.

    Operator Keterangan AND atau && Operasi logika AND OR atau || Operasi logika OR NOT atau ! Operasi negasi XOR Operasi Exclusive OR

    Beberapa hal yang perlu diperhatikan ketika menggunakan operator logika:

    Sebagai contoh, query berikut berfungsi untuk menampilakn data buku yang harganya di bawah atau sama dengan Rp. 50.000 dan memiliki kode penerbit PB06

    SELECT\n    buku_isbn,\n    buku_judul,\n    penerbit_id,\n    buku_harga\nFROM\n    buku\nWHERE\n    buku_harga <= 50000 AND\n    penerbit_id = 'PB06';\n
    "},{"location":"bab9/#fungsi","title":"Fungsi","text":""},{"location":"bab9/#fungsi-teks","title":"Fungsi Teks","text":"

    Fungsi concat()

    concat() berfungsi untuk menyambung dua teks atau lebih, tergantung dari banyaknya parameter yang dilewatkans aat pemanggialn fungsi. Contoh:

    SELECT CONCAT('Belajar',' ', 'MySQL')\n

    Fungsi length()

    Berfungsi untuk mengetahui jumlah karakter dari teks. Contoh:

    SELECT LENGTH('Belajar MySQL');\n

    Fungsi locate()

    Berfungsi untuk mencari karakter atau bagian teks (substring) dari suatu teks. Contoh:

    SELECT LOCATE('base', 'Pemrograman Database MySQL', 1);\n
    Query di atas akan mencari teks base di dalam teks Pemrograman Database MySQL dimulai dari posisi karakter ke-1. Jika karakter yang dimaksud tidak ditemukan, maka MySQL akan mengembalikan nilai 0.

    Fungsi lower() dan upper()

    lower() berfungsi untuk mengubah teks menjadi huruf kecil, sedangkan upper() berfungsi mengubah teks menjadi huruf kapital. Contoh:

    SELECT LOWER('BELAJAR');\nSELECT UPPER('database');\n

    Fungsi quote()

    quote() digunakan untuk mengapit teks menggunakan tanda petik tunggal. Sebagai contoh, jika kita igin membuat teks untuk proses INSERT dalam suatu prosedur/ fungsi yang didefinisikan sendiri. Contoh:

    SET @STR = 'MySQL';\nSELECT @STR;\n
    Perintah di atas akan memberikan hasil berupa string 'MySQL'. Sekarang coba yang ini.
    SET @STR = quote('MySQL');\nSELECT @STR;\n
    Perintah tersebut akan menampilkan string 'MySQL' yang mengandung tanda kutip.

    Fungsi replace()

    Kita bisa mengganti bagian teks tertentu dengan fungsi ini. Contoh:

    SELECT REPLACE(\n    'Pemrograman Database',\n    'Database',\n    'MySQL'\n)\n
    Perintah di atas akan mengganti teks Database yang berada pada string Pemrograman Database dengan teks MySQL.

    Fungsi substring()

    Digunakan untuk mengambil karakter atau bagian teks (dengan jumlah tertentu) dari suatu teks. Contoh:

    SELECT SUBSTRING('MySQL', 1, 2);\n
    Perintah di atas akan mengambil 2 karakter dari teks MySQL dimulai dari karakter ke-1, sehingga menghasilkan teks QL.

    Fungsi trim()

    Pada kasus-kasus tertentu, sering kali terjadi data yang tersimpan di dalam dataabse memiliki format yang belum sempurna. Sebagai contoh, data yang seharusnya berupa 'MySQL', tapi pada kenyataannya di dalamd database tertulis 'My SQL' atau ' MySQL' (mengandung whitespace atau karakter kosong baik di depan atau di belakang teks).

    Kesalahan data seperti ini biasanya (tanpa sengaja) dilakukan oleh pneggna aplikasi atau operator entri data. Sebagai contoh, secara tidak sadar pengguna aplikasi telah menekan tombol spasi pada saat sedang melakukan entri data. Dengan demikian, data yang tersimpan di dalam database juga akan ikut mengandung spasi.

    Kasus semacam ini terkadang sering membuat pusing para programmer database dan DBA (Database Administrator) pada saat mereka menulis query. Pasalnya, emreka merasa bahwa query sudah tertulis dengan benar, tapi data atau hasil yagn ditampilkan tidak sesuai dengan keinginan.

    Untuk mengatasi masalah tersebut, kita bisa menggunakan fungsi trim() pada saat membandingkan data berupa teks. Jika kita ingin menghilangkan whitespace di awal string kita gunakan ltrim(), sedangkan jika di akhir string menggunakan rtrim(). Contoh:

    SELECT\n    buku_isbn,\n    buku_judul\nFROM\n    buku\nWHERE\n    TRIM(penerbit_id) = 'PB06';\n
    "},{"location":"bab9/#fungsi-bilangan","title":"Fungsi Bilangan","text":"

    Untuk mengolah data bilangan, MySQL sudah menyediakan beberapa fungsi. Berikut tabelnya.

    Fungsi Keterangan abs() Mengembalikan nilai mutlak dari n. Misal abs(-10) akan mengembalikan nilai 10. round() Membulatkan bilangan desimal n menjadi bilangan bulat. Misal round(3.45) hasilnya 3. ceiling(n) Pembulatan ke atas terdekat. Misal ceiling(3.25) menghasilkan 4. floor(n) Pembulatan ke bawah terdekat. Misal floor(3.97) menghasilkan nilai 3. mod(n,m) Operasi sisa hasil bagi/ modulus. Misal mod(11,4) menghasilkan nilai 3. power(n,m) Mengembalikan nilai n pangkat m. Misal power(10,2) hasilnya 100. sqrt(n) Mengembalikan akar pangkat 2 dari n. Misal sqrt(4) hasilnya 2. rand(n) Mengembalikan nilai acak (random) antara 0 dan 1. Parameter n bersifat opsional."},{"location":"bab9/#fungsi-tanggal-dan-waktu","title":"Fungsi Tanggal dan Waktu","text":"

    Kolom bertipe tanggal dan waktu umumnya digunakan untuk mencatat kapan suatu transaksi atau kejadian terjadi dalam database.

    Fungsi Keterangan Contoh now() Mengembalikan tanggal dan waktu saat ini (tanggal penuh dengan jam, menit, detik). SELECT now(); hasil: 2024-11-29 10:15:30 curdate() Mengembalikan tanggal hari ini (hanya tanggal, tanpa waktu). SELECT curdate(); hasil: 2024-11-29 curtime() Mengembalikan waktu saat ini (hanya jam, menit, dan detik). SELECT curtime(); hasil: 10:15:30 extract(day from [tanggal]) Mengambil nilai hari dari kolom tanggal. SELECT extract(day from '2024-11-29'); hasil: 29 extract(month from [tanggal]) Mengambil nilai bulan dari kolom tanggal. SELECT extract(month from '2024-11-29'); hasil: 11 extract(year from [tanggal]) Mengambil nilai tahun dari kolom tanggal. SELECT extract(year from '2024-11-29'); hasil: 2024 dayname([tanggal]) Mengembalikan nama hari dari tanggal tertentu (dalam bahasa Inggris). SELECT dayname('2024-11-29'); hasil: Friday date_format([tanggal], format) Memformat tanggal sesuai pola tertentu. SELECT date_format('2024-11-29', '%d-%m-%Y'); hasil: 29-11-2024 time_format([waktu], format) Memformat waktu sesuai pola tertentu. SELECT time_format('10:15:30', '%h:%i %p'); hasil: 10:15 AM

    Penjelasan Format untuk date_format dan time_format:

    Catatan:

    Format dapat disesuaikan dengan kebutuhan untuk menampilkan data yang lebih user-friendly. Contoh-contoh di atas juga dapat digunakan dalam perintah SQL untuk pengolahan data.

    "},{"location":"bab9/#fungsi-konversi-typecasting","title":"Fungsi Konversi / Typecasting","text":"

    Contoh:

    SELECT CAST('13' AS SIGNED);\nSELECT CONVERT('13', SIGNED);\n

    Berikut tipe-tipe data yang dapat digunakan dalam fungsi cast() dan convert().

    "},{"location":"toc/","title":"Daftar Isi","text":"

    Daftar Isi

    Bab 1 - Mendefinisikan Data

    Bab 2 - Manipulasi Data

    Bab 3 - Kontrol Hak Akses

    Bab 4 - Seleksi Data 1

    Bab 5 - Seleksi Data 2

    Bab 6 - Tabel Virtual

    Bab 7 - Manajemen User

    Bab 8 - Fungsi Agregasi

    Bab 9 - Operator dan Fungsi

    Bab 10 - Prosedur dan Fungsi

    Bab 11 - Trigger

    Bab 12 - Ekspor dan Impor

    Beranda

    "}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index e45b04f..0c2ef4a 100755 --- a/sitemap.xml +++ b/sitemap.xml @@ -52,4 +52,8 @@ https://masipnu.github.io/tutorial-mysql/bab9/ 2024-12-04 + + https://masipnu.github.io/tutorial-mysql/toc/ + 2024-12-04 + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 21e37ad631f683ebafecaa7c352cd0ed29939171..f0319b26e7493bbf7111b69c789dfd56d84fb305 100755 GIT binary patch delta 230 zcmV?N^f`%|Xm$6IfsYcrzpt`Lb-B5GXi&&IWd_&I&YJ8{&jd>Sn_6oqDoh3JTe1He4b z5)CzdIiU1o3s`p{L3kBG$-U64D8#bhd3!`|eXW-*7}kUdGhet#wuZW?lEwo~@6S3_X%;7Gtg_JZsy#XQ^FETRvPzhF#q4vxKjrnA`86+}@$z51 g{Dzm`^71=ge$U90uiw`nNBAuD9dfW*!H1D zZQ6d>Y1#hP>EK!qsI19Z#03j#Q`xgJP0mioL%3yoxyZ&rW9 + + + + + + + + + + + + + + + + + + + + + + + + + + + Daftar Isi - Tutorial MySQL - Best Practice + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + + + + + +
    + + + +
    + +
    + + +
    + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file