Projek ini bertujuan untuk menggambarkan bagaimana salah satu aplikasi chatting terbesar, yaitu WhatsApp bekerja. Pada projek ini fungsi-fungsi yang dibutuhkan antara lain yaitu.
DDL (Create, Drop)
DML (Insert, Update, Delete)
DCL (SELECT)
Procedurs
Triggers
JOIN
Pembuatan database ini memperlihatkan ketika pengguna ingin registrasi dan menambahkan atau mengganti (nama atau nomor yang digunakan atau yang disimpannya).
Tahap pertama yang dilakukan adalah pembuatan database dengan nama wa_version
CREATE DATABASE wa_version
![](https://static.wixstatic.com/media/67563d_7310d01b80e14133bc3c331d76dfbd3c~mv2.png/v1/fill/w_333,h_25,al_c,q_85,enc_avif,quality_auto/67563d_7310d01b80e14133bc3c331d76dfbd3c~mv2.png)
Setelah membuat database, maka membuat tabel yang diperlukan. Disini pembuatan tabel pengguna dan tabel kontak
Tabel Pengguna
Tabel pengguna terdiri dari
Id bertipe Integer PRIMARY KEY
nama bertipe Varchar
foto bertipe Longblob
nomor bertipe Varchar UNIQUE KEY
CREATE TABLE `wa_version_02`.`pengguna` ( `id` INT(10) NOT NULL AUTO_INCREMENT , `nama` VARCHAR(50) NOT NULL , `foto` LONGBLOB NOT NULL , `nomor` VARCHAR(12) NOT NULL , PRIMARY KEY (`id`), UNIQUE (`nomor`)) ENGINE = InnoDB;
![](https://static.wixstatic.com/media/67563d_c0c16198be794e73a2875d158cdb6aab~mv2.png/v1/fill/w_764,h_32,al_c,q_85,enc_avif,quality_auto/67563d_c0c16198be794e73a2875d158cdb6aab~mv2.png)
2. Tabel Kontak
Tabel Kontak terdiri dari
id INT PRIMARY KEY
nomor bertipe VARCHAR
nama_kontak VARHCAR
nomor_kontak VARCHAR FOREIGN KEY
CREATE TABLE `wa_version_02`.`kontak` ( `id` INT(10) NOT NULL AUTO_INCREMENT , `nomor` VARCHAR(12) NOT NULL , `nama_kontak` VARCHAR(50) NULL , `nomor_kontak` VARCHAR(12) NULL , PRIMARY KEY (`id`), INDEX (`nomor`), INDEX (`nomor_kontak`)) ENGINE = InnoDB;
![](https://static.wixstatic.com/media/67563d_5fc1b6f749ed48cea22384462f7907a1~mv2.png/v1/fill/w_741,h_24,al_c,q_85,enc_avif,quality_auto/67563d_5fc1b6f749ed48cea22384462f7907a1~mv2.png)
Setelah itu akan diinputkan data contoh 5 pengguna ke dalam tabel pengguna
INSERT INTO `pengguna` (`id`, `nama`, `nomor`) VALUES (NULL, 'Adib', '085646317415'), (NULL, 'Amel', '082139087703'), (NULL, 'Farhan', '081246082297'), (NULL, 'Jevin', '082244929875'), (NULL, 'Milos', '082112211122')
Note: Foto disitu tidak ada karena kolom itu bersifat Longblob dimana jika dimasukkan menghasil teks yang sangat panjang.
![](https://static.wixstatic.com/media/67563d_81e851ba6a6c45c6b5bf7134137504ee~mv2.png/v1/fill/w_340,h_181,al_c,q_85,enc_avif,quality_auto/67563d_81e851ba6a6c45c6b5bf7134137504ee~mv2.png)
Registrasi
Setelah itu mari buat Stored Procedurs Registrasi. Tujuannya dibuat Procedurs ini untuk memudahkan pengguna untuk registrasi tanpa harus menulis querynya. Andaikan pada saat registrasi di WhatsApp sebenarnya pengguna hanya memasukkan nomor, nama dan foto. Sebearnya untuk memudahkan lagi harus bekerja sama dengan Software Engineering, namun karena ini ilustrasi database, maka harus memasukkan satu-satu.
DELIMITER //
CREATE PROCEDURE `Registrasi`(
IN `id` INT(12),
IN `nama` VARCHAR(50),
IN `foto` LONGBLOB,
IN `nomor` VARCHAR(12)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER
BEGIN
DECLARE str VARCHAR(50);
IF (SELECT DISTINCT(nomor) FROM pengguna WHERE pengguna.nomor != nomor) THEN
INSERT INTO pengguna VALUES('', nama, foto, nomor);
END IF;
END //
Jadi pada Procedure di atas bernama Registrasi yang mana variabelnya sama yang ada pada tabel pengguna. Setelah itu ditambahkan BEGIN dan lakukan suatu INSERT dimana dilihat terlebih dahulu nomor yang ada di tabel tersebut dengan bantuan distinct untuk menjatah setiap nomor hanya satu. Jika tidak ada, maka masukkan data tersebut kedalam tabel pengguna, namun jika ada berikan pesan 'Duplicate Entry'.
![](https://static.wixstatic.com/media/67563d_3fbf952165884fc09c6b8e74bbdfc9e8~mv2.png/v1/fill/w_120,h_57,al_c,q_85,enc_avif,quality_auto/67563d_3fbf952165884fc09c6b8e74bbdfc9e8~mv2.png)
Setelah proses pembuatan selesai, selanjutnya akan ditesting. Untuk mentestingnya gunakan fungsi CALL
![](https://static.wixstatic.com/media/67563d_5f0f8b357b4043b3910cb06b5d34be8f~mv2.png/v1/fill/w_308,h_57,al_c,q_85,enc_avif,quality_auto/67563d_5f0f8b357b4043b3910cb06b5d34be8f~mv2.png)
Fungsi di atas menyatakan bahwa nama 'Uvu' ingin daftar WhatsApp dengan nomor tersebut.
Tabel Pengguna
![](https://static.wixstatic.com/media/67563d_9f476188f824492588043f3bb68cfba5~mv2.png/v1/fill/w_248,h_33,al_c,q_85,enc_avif,quality_auto/67563d_9f476188f824492588043f3bb68cfba5~mv2.png)
Namun bagaimana jika Uvu ingin medaftar dengan nomor yang sama? Maka tabel akan menampilkan persan seperti berikut.
![](https://static.wixstatic.com/media/67563d_501f560eda5b46a096e6625425dbdc20~mv2.png/v1/fill/w_268,h_107,al_c,q_85,enc_avif,quality_auto/67563d_501f560eda5b46a096e6625425dbdc20~mv2.png)
Hal tersebut dikarenakan bahwasanya nomor bersifat Unique Key. Namun pada WhatsApp ketika pengguna melakukan registrasi, dia tidak memiliki kontak namun dapat menambahkan kontak. Sehingga, pada saat pengguna melakukan registrasi nomor, pengguna juga otomatis masuk kedalam tabel kontak. Maka pada procedurs, tinggal menambahkan query INSERT pada table kontak.
DELIMITER //
CREATE PROCEDURE `Registrasi`(
IN `id` INT(12),
IN `nama` VARCHAR(50),
IN `foto` LONGBLOB,
IN `nomor` VARCHAR(12)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER
BEGIN
DECLARE str VARCHAR(50);
IF (SELECT DISTINCT(nomor) FROM pengguna WHERE pengguna.nomor != nomor) THEN
INSERT INTO pengguna VALUES('', nama, foto, nomor);
INSERT INTO kontak VALUES('', nomor, NULL, NULL);
END IF;
END //
![](https://static.wixstatic.com/media/67563d_761f20fdb13b447d81a00c3e7ce6e478~mv2.png/v1/fill/w_544,h_199,al_c,q_85,enc_avif,quality_auto/67563d_761f20fdb13b447d81a00c3e7ce6e478~mv2.png)
Tambah Kontak
Setelah melakukan registrasi, maka selanjutnya akan membuat PROCEDUR untuk tambah kontak. Alur untuk tambah kontak sendiri seperti berikut.
Jika nomor sudah registrasi dan nama_kontak dan nomor_kontak adalah NULL. Maka UPDATE nama_kontak dengan nomor_kontak dengan yang dimasukkan pengguna saat menambahkan dengan nomor yang sama.
Namun, jika nomor_kontak itu pada nomor pengguna sudah terdapat pada tabel. Maka munculkan tabel tersebut (SELECT).
Jika kondisi kedua diatas, tidak terpenuhi. Maka masukkan data baru (INSERT)
DELIMITER //
CREATE PROCEDURE `tambahkontak`(IN `id` INT(10), IN `nomor` VARCHAR(12), IN `nama_kontak` VARCHAR(50), IN `nomor_kontak` VARCHAR(12)) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER BEGIN
IF(SELECT nomor_kontak FROM kontak WHERE kontak.nama_kontak IS NULL AND kontak.nomor_kontak IS NULL AND kontak.nomor = nomor) THEN
UPDATE kontak
SET
kontak.nama_kontak = nama_kontak,
kontak.nomor_kontak = nomor_kontak
WHERE kontak.nomor = nomor AND kontak.nomor_kontak IS NULL AND
kontak.nomor_kontak IS NULL;
ELSEIF (SELECT nomor kontak WHERE kontak.nomor = nomor AND
kontak.nomor_kontak IN (SELECT nomor_kontak FROM kontak
WHERE kontak.nomor_kontak = nomor_kontak) GROUP BY nomor) THEN
SELECT * FROM kontak;
ELSE
INSERT INTO kontak VALUES ('',nomor,nama_kontak,nomor_kontak);
END IF;
END //
Misal 'Uvu' ingin menambahkan Adib pada kontaknya. Maka yang terjadi adalah syarat pertama (UPDATE).
![](https://static.wixstatic.com/media/67563d_07bb1c76bb3e42a1a57311493c7ad072~mv2.png/v1/fill/w_383,h_53,al_c,q_85,enc_avif,quality_auto/67563d_07bb1c76bb3e42a1a57311493c7ad072~mv2.png)
![](https://static.wixstatic.com/media/67563d_df971bdf47e24674851a0325f24194ae~mv2.png/v1/fill/w_514,h_48,al_c,q_85,enc_avif,quality_auto/67563d_df971bdf47e24674851a0325f24194ae~mv2.png)
Namun, bagaimana jika dia menambahkan Adib dengan nomor_kontak yang sama? Maka yang terjadi adalah syarat yang kedua (SELECT).
![](https://static.wixstatic.com/media/67563d_bfb4af7da20c4c159880e2def8c31ff7~mv2.png/v1/fill/w_327,h_171,al_c,q_85,enc_avif,quality_auto/67563d_bfb4af7da20c4c159880e2def8c31ff7~mv2.png)
Selanjutnya, jika Uvu ingin menbamhkan kontak baru atas nama Amel? Maka yang terjadi adalah syarat ketiga (INSERT).
![](https://static.wixstatic.com/media/67563d_07369f210db74838846d799a86294791~mv2.png/v1/fill/w_342,h_54,al_c,q_85,enc_avif,quality_auto/67563d_07369f210db74838846d799a86294791~mv2.png)
![](https://static.wixstatic.com/media/67563d_41eed64aa74641baab60f30a2572468b~mv2.png/v1/fill/w_304,h_60,al_c,q_85,enc_avif,quality_auto/67563d_41eed64aa74641baab60f30a2572468b~mv2.png)
Edit Kontak
Proses selanjutnya adalah pembuatan PROCEDUR edit kontak. Procedur ini berfungsi jika nomor_kontak sudah dimiliki oleh nomor pengguna. Pada WhatsApp, ketika pengguna dapat mengubah nomor pada kontaknya jikalau nomor_kontak pada kontaknya berubah.
CREATE DEFINER=`root`@`localhost` PROCEDURE `editkontak`(
IN `nomor` VARCHAR(12),
IN `nama_kontak` VARCHAR(50),
IN `nomor_kontak` VARCHAR(12)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER
BEGIN
UPDATE kontak
SET
kontak.nomor = nomor,
kontak.nama_kontak = nama_kontak,
kontak.nomor_kontak = nomor_kontak
WHERE kontak.nomor = nomor AND kontak.nama_kontak = nama_kontak;
END
Katakan saja Amel merubah nomornya menjadi 082139087750. Pada WhatsApp, ketika pengguna (Uvu) memiliki nomor kontak sebelum diubah oleh pengguna (Amel) nomor tersebut, WhatsApp akan memberikan pesan 'Akun ini telah merubah kontaknya' dan WhatsApp tidak otomatis mengganti nomor_kontak baru (Amel) pada akun tersebut di miliki kita. Sehingga disini saya menambahkan Trigger ubah nomor.
CREATE TRIGGER `ubahnomor` AFTER UPDATE ON `pengguna` FOR EACH ROW UPDATE kontak
SET
nomor = NEW.nomor
WHERE kontak.nomor NOT IN (SELECT pengguna.nomor FROM pengguna)
Pada Trigger sendiri terdapat 4 acuan, yaitu
Trigger Name: Nama dari trigger tersebut
Table: Sumber pengubah tabel tersebut. Contoh jika diset di tabel pengguna. Maka jika data pengguna dirubah, tabel pengguna ini akan merubah data di tabel lain (seperti query diatas, di set pada tabel kontak).
TIME: time sendiri terdiri dari 2 pilihan. AFTER atau BEFORE. AFTER sendiri dijalankan setelah record dirubah pada database dan BEFORE dijalankan sebelum dirubah di database. Biasanya BEFORE digunakan untuk Validasi data.
EVENT: Event terdiri dari 3 pilihan, INSERT, UPDATE, DELETE.
![](https://static.wixstatic.com/media/67563d_9d08b13f20c445819604d9b706c33834~mv2.png/v1/fill/w_386,h_30,al_c,q_85,enc_avif,quality_auto/67563d_9d08b13f20c445819604d9b706c33834~mv2.png)
Misal, Amel menambahkan kontak Uvu dalam daftar kontaknya. Maka gunakan PROCEDUR tambah kontak.
![](https://static.wixstatic.com/media/67563d_16c19b1d1cea498eb8816e3acdb0b2e1~mv2.png/v1/fill/w_331,h_41,al_c,q_85,enc_avif,quality_auto/67563d_16c19b1d1cea498eb8816e3acdb0b2e1~mv2.png)
![](https://static.wixstatic.com/media/67563d_190a135f96024b7aa9a1fe9e8567ba2a~mv2.png/v1/fill/w_482,h_244,al_c,q_85,enc_avif,quality_auto/67563d_190a135f96024b7aa9a1fe9e8567ba2a~mv2.png)
Selanjutnya, andai kata Amel merubah nomornya menjadi 082139087750. Maka Trigger ubahnomor akan aktif. Pengaktifan trigger terjadi jika menggunakan query UPDATE pada umumnya pada tabel yang telah diset sumber update-annya menuju UPDATE pada tabel baru yang di set di quernya.
UPDATE pengguna
SET
nomor = '082139087750'
WHERE nomor = '082139087703'
Tabel Pengguna
![](https://static.wixstatic.com/media/67563d_4c6f35aed21c44a59749b3bd871464ee~mv2.png/v1/fill/w_456,h_219,al_c,q_85,enc_avif,quality_auto/67563d_4c6f35aed21c44a59749b3bd871464ee~mv2.png)
Tabel Kontak
![](https://static.wixstatic.com/media/67563d_bb4a13bbd4fd4b6b83dd4a664f916eee~mv2.png/v1/fill/w_485,h_242,al_c,q_85,enc_avif,quality_auto/67563d_bb4a13bbd4fd4b6b83dd4a664f916eee~mv2.png)
Dapat dilihat pada tabel nomor Amel yang sebelumnya 082139087703 berubah menjadi 082139087750. Namun, seperti yang telah dijelaskan sebelumnya, tabel nomor_kontak tidak berubah pada kontak Uvu (082121212111).
Jika Uvu ingin merubah nomor Amel pada daftar kontaknya, PROCEDUR editkontak yang digunakan.
![](https://static.wixstatic.com/media/67563d_c1ac6021aac44f0f8bacadc75d64a88e~mv2.png/v1/fill/w_329,h_56,al_c,q_85,enc_avif,quality_auto/67563d_c1ac6021aac44f0f8bacadc75d64a88e~mv2.png)
![](https://static.wixstatic.com/media/67563d_2ead5ce52e3e4d4bb22825113cdb2f98~mv2.png/v1/fill/w_304,h_100,al_c,q_85,enc_avif,quality_auto/67563d_2ead5ce52e3e4d4bb22825113cdb2f98~mv2.png)
Pada id 2 yang menyimpan dapat dilihat nomor_kontak pada Uvu berubah menjadi nomor yang diinputkan.
Selanjutnya, siapa saja yang daftar kontak yang disimpan Uvu dengan syarat tabel nama dan nama kontak. Permasalahan tersebut dapat diselesaikan dengan fungsi JOIN yang lebih spesifik yaitu INNER JOIN. Hal ini dikarenakan, permasalahan yang diberikan hanya ingin mendapati nama kontak yang terdaftar.
SELECT p.nama, k.nama_kontak FROM kontak k INNER JOIN pengguna p ON k.nomor = p.nomor WHERE p.nama = 'Uvu' AND p.nomor = '082121212111'
Pada query di atas, menyatakan bahwasa akan menampilkan kolom nama dari tabel pengguna dan nama dari tabel kontak. Setelah itu di INNER JOIN antar tabel dengan kuncinya memiliki nama dan tipe data yang sama pada kolom tiap tabel. Ditutup dengan syarat nama dari tabel pengguna adalah 'Uvu' DAN nomor dari tabel pengguna adalah '082121212111'
![](https://static.wixstatic.com/media/67563d_f8816694a6fb412f9a1b9fab4f081f36~mv2.png/v1/fill/w_144,h_64,al_c,q_85,enc_avif,quality_auto/67563d_f8816694a6fb412f9a1b9fab4f081f36~mv2.png)
Selanjutnya, andai saja saya adalah pemegang database dan ingin mengetahui siapa saja yang Uvu tidak simpan dari pengguna yang terdaftar. Disini saya tidak melihat totalnya, karena jika menghitung total akan menggunakan COUNT. Saya hanya ingin melihat nama_kontak yang tidak disimpan. Untuk menyelesaikan permasalahan tersebut saya menyelesaikan menggunakan LEFT JOIN. Dimana tabel yang dikiri adalah tabel kontak dikarenakan saya ingin mencari relasi yang sama dari tabel kontak ke tabel pengguna.
SELECT p.nama, k.nama_kontak FROM pengguna p LEFT OUTER JOIN kontak k ON p.nomor = k.nomor
![](https://static.wixstatic.com/media/67563d_aebd226f0e104a85952f737a9eb603c6~mv2.png/v1/fill/w_144,h_168,al_c,q_85,enc_avif,quality_auto/67563d_aebd226f0e104a85952f737a9eb603c6~mv2.png)
Ternyata Uvu tidak menyimpan Adib, Farhan, Jevin dan Milos.
Comments