KATEGORI: DATABASE

Operasi Dasar MySQL beserta Desain Skema Database

Membahas lengkap penggunaan Query Language yang dapat memudahkan kalian untuk belajar lebih jauh lagi ke dalam seluk-beluk MySQL. Selain itu terdapat tugas akhir untuk dikerjakan, sehingga dapat dipastikan pengetahuan kalian bukan hanya membaca saja.

Do Exploit
18 min readJul 15, 2020
Belajar Database MySQL
Thumbnail

Sudah beberapa minggu tidak ada kehadiran tutorial di channel medium ini, dikarenakan kelas gratis yang kian banyak, saya pun makin bingung atur jadwal buat selesaiin kelas-kelas nya.

Salah satu kelasnya adalah database design dari Eduonix, artikel ini cocok banget buat pemula yang mau belajar penggunaan database sederhana mysql pada ecommerce, elearning dan lain-lain.

Sebelum melanjutkan lebih jauh pastikan kalian telah menyiapkan mysql berbasis command-line untuk siap digunakan, jika belum melakukan apa-apa silahkan pergi ke artikel dibawah ini.

Kita perlu tahu juga kepanjangan dari SQL yaitu Structured Query Language, artinya database terstruktur dan bergantung pada aturan-aturan yang diaplikasikan pada field atau kolom dalam sebuah table. Misalnya kolom name_lengkap harus berupa string, maka kita bisa gunakan tipe data varchar dan lain-lain.

Tentunya sangat banyak juga constraint, tipe data dan fungsi yang kalian bisa temukan pada artikel dibawah ini.

SQL termasuk dalam RDBMS yaitu kepanjangannya Relational Database Management System yang artinya setiap tabel dapat saling ter integrasi satu sama lain. Untungnya apa sih? Misalnya terdapat data dalam kolom alamat, bukankah tidak terlihat bersih dan sulit dipahami jika isinya seperti gambar dibawah ini;

Contoh kolom alamat yang menyatu

Kita perlu membuat tabel baru lagi agar lebih mudah dibaca dan dipahami, caranya bisa di pisah-pisahkan setiap datanya, lalu hubungkan Address_ID dari tabel user ke kolom ID pada tabel Address sehingga hasil desain databasenya seperti dibawah ini;

Dibuat oleh Lucid Chart

Dimana sekarang terlihat lebih terstruktur dibandingkan saat semua datanya masih menyatu seperti sebelumnya.

Kita juga akan berinteraksi dengan yang namanya Query, yaitu syntax atau perintah yang digunakan untuk mengakses dan menampilkan keluaran berupa data. Dapat disebut juga sebagai query language, seperti saat ini yang kita gunakan adalah MySQL.

Ada 3 jenis query database yaitu;

  • DDL (Data Definition Language) 👈,
  • DML (Data Manipulation Language) 👈,
  • DCL (Data Control Language).

Kita akan mempelajari hanya dua diantaranya, lengkapnya silahkan lanjutkan bacaan kalian kebawah ini.

1. DDL (Data Definition Language)

DDL adalah sebuah metode Query SQL yang digunakan untuk membuat, menghapus, mengubah database, tabel dan kolom yang sudah ada maupun tidak ada.

1.1 CREATE

Jika diterjemahkan kedalam bahasa Indonesia artinya adalah membuat, mari kita coba membuat database bernama proyek_ku dengan mengetik perintah dibawah ini;

mysql> CREATE DATABASE proyek_aku;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| proyek_aku |
| sys |
+--------------------+
5 rows in set (0.00 sec)

Keterangan:

  • Query OK, menunjukkan bahwa perintah yang kita berikan pada mysql telah sukses dieksekusi, jika outputnya menunjukkan error maka kalian perlu memperhatikan kembali perintah yang diberikan. Dalam konteks ini kita telah berhasil membuat database bernama proyek_aku.
  • Database selain proyek_aku itu adalah database yang mengelola sistem penggunaan MySQL. Jadi bila kalian sudah mendalami lebih jauh tentang MySQL, kalian dapat sedikit bermain-main dengan mereka.

Selanjutnya mari kita buat tabel bernama koleksi_users dalam database proyek_aku, tapi sebelum itu kita perlu tentukan kolom apa saja yang harus ada didalamnya yaitu;

  • nama = string
  • umur = integer
  • sekolah = string

Masuk dulu kedalam database yang akan kita isi dengan tabel koleksi_users dengan mengetik perintah dibawah ini;

mysql> USE proyek_aku;
Database changed

Lalu buat lah tabelnya.

mysql> CREATE TABLE koleksi_users(
-> ID BIGINT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(64) NOT NULL,
-> age TINYINT NOT NULL,
-> sekolah VARCHAR(64) NOT NULL);
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW TABLES;
+----------------------+
| Tables_in_proyek_aku |
+----------------------+
| koleksi_users |
+----------------------+
1 row in set (0.00 sec)
mysql> DESCRIBE koleksi_users;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| age | tinyint(4) | NO | | NULL | |
| sekolah | varchar(64) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

Keterangan:

  • USE, menentukan database yang akan kita gunakan.
  • NOT NULL, aturan yang tidak memperbolehkan data dalam kolom tersebut kosong atau tidak ada isinya, ini akan kita rasakan setelah melakukan pengisian data.
  • VARCHAR(64), tipe data yang menyimpan karakter dengan maksimal hanya sampai 64 karakter.
  • AUTO_INCREMENT, secara otomatis kolom tersebut akan terisi secara otomatis dimulai dari nomor 1 sampai seterusnya.

Ada beberapa tipe data yang kita gunakan diatas yaitu BIGINT, VARCHAR dan TINYINT. Perhatikan gambar dibawah ini dan amati lalu pahami.

Gambar oleh MySQLTutorial.

Terakhir, setiap kali anda ingin membuat tabel, pastikan dalam tabel tersebut mengandung 1 kolom PRIMARY KEY, seperti yang sudah kita buat sebelumnya, terdapat kolom ID yang melakukan tugas tersebut. Kenapa harus dibuat? Kalian akan mengetahuinya setelah masuk di bagian DML.

1.2 ALTER

Arti dalam Bahasa Indonesianya adalah mengubah, eitts sebentar ada kejadian yang pas nih! Ada yang sadar ga sih? Pada bagian sebelumnya kita telah membuat database dengan nama yang salah, harusnya proyek_ku tapi malah menjadi proyek_aku.

Kalo gak sadar berarti kita sama, ini terjadi ketika saya sedang membuat database, tapi gapapa deh berguna juga ternyata 😅. Ketik perintah dibawah ini untuk mengubah namanya stepbystep;

USE proyek_aku; 
ALTER DATABASE proyek_aku SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

Hal yang perlu dilakukan pertama adalah mengubah ketentuan database proyek_aku menjadi SINGLE USER, artinya hanya current user yang memilikinya.

Kenapa perlu dilakukan hal tersebut?

Saat melakukan perubahan nama diharuskan hanya 1 user saja yang mengelolanya, sebelumnya ada beberapa user lain yang ikut serta jadi kita hanya perlu memperbarui ketentuan itu.

ALTER DATABASE proyek_aku MODIFY NAME = proyek_ku;

Setelah itu kita reset lagi ketentuan databasenya menjadi seperti semula karena tugas kita telah selesai.

ALTER DATABASE proyek_ku SET MULTI_USER;

Temukan penggunaan lainnya di artikel bawah ini.

1.3 DROP

Artinya menjatuhkan, dari situ kita sudah mengetahui kegunaannya yaitu untuk menghapus tabel atau database. Saat kalian menghapus database, itu secara langsung juga menghapus semua isi tabel didalamnya juga, mari kita coba menghapus tabel koleksi_users yang ada didalam database proyek_ku.

mysql> SHOW TABLES;
+----------------------+
| Tables_in_proyek_ku |
+----------------------+
| koleksi_users |
+----------------------+
1 row in set (0.00 sec)
mysql> DROP TABLES koleksi_users;
Query OK, 0 rows affected (0.02 sec)
mysql> SHOW TABLES;
Empty set (0.00 sec)

Selanjutnya mari kita hapus database proyek_ku, loh kenapa tadi gak langsung hapus databasenya aja biar sekalian? Namanya juga lagi belajar, klo databasenya dihapus langsung, gimana cara belajar hapus tabelnya? Hilang duluan dong 🙄. Yok lanjutin!

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| proyek_ku |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> DROP DATABASE proyek_ku;
Query OK, 0 rows affected (0.04 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

2. DML (Data Manipulation Language)

DML akan bekerja setelah DDL telah dilakukan, Query ini akan membantu kita untuk mengolah data yang ada didalam tabel. DML memiliki tugas untuk menambah, memperbarui dan menghapus data.

Pada bagian sebelumnya kalian telah menghapus database dan tabelnya, karena itu silahkan buat lagi database dan tabel yang serupa! seperti yang sudah saya jelaskan sebelumnya, DML akan bekerja ketika database dan tabel telah dibuat.

Pertama, coba kita cek sudah terdapat data apa saja didalam tabel koleksi_users;

mysql> SELECT * FROM koleksi_users;
Empty set (0.00 sec)

Keterangan:

  • SELECT, menyeleksi kolom yang akan di tampilkan.
  • (*) akan mewakili semua kolom dalam tabel tersebut.
  • FROM, bahasa Indonesiannya dari berarti untuk menentukan tabel mana yang akan di tampilkan.

Terlihat masih kosong (Empty set), tidak terdapat data apapun dalam tabel tersebut.

2.1 INSERT

Bahasa Indonesianya adalah menyisipkan, benar! Kita akan menyisipkan data ke dalam tabel yang ditentukan, syntaxnya sebagai berikut;

INSERT INTO nama_tabel(nama_kolom1, nama_kolom2, dll) VALUES (isi_kolom1, isi_kolom2, dll);

Mari kita coba ke dalam tabel koleksi_users.

mysql> INSERT INTO koleksi_users(name, age, sekolah) VALUES ("MichaelACT", 17, "SMKN 1 APA YA");
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO koleksi_users(name, age, sekolah) VALUES ("RichardGT", 20, "STT BI");
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM koleksi_users;
+----+------------+-----+---------------+
| ID | name | age | sekolah |
+----+------------+-----+---------------+
| 1 | MichaelACT | 17 | SMKN 1 APA YA |
| 2 | RichardGT | 20 | STT BI |
+----+------------+-----+---------------+
2 rows in set (0.00 sec)

Pertama kita menentukan tabel dan kolom yang akan diisi data, lalu setelah itu kita isi datanya setelah VALUES.

Apa yang terjadi bila kita melupakan salah satu values?

mysql> INSERT INTO koleksi_users(name, age, sekolah) VALUES ("RichardGT", 20);
ERROR 1136 (21S01): Column count doesn't match value count at row 1

Apa yang terjadi bila kita berlebihan meng-input datanya?

mysql> INSERT INTO koleksi_users(name, age, sekolah) VALUES ("RichardGT", 20, "STT B", "Jakarta");
ERROR 1136 (21S01): Column count doesn't match value count at row 1

Apa yang terjadi bila kita melupakan salah satu kolomnya tapi valuesnya benar?

mysql> INSERT INTO koleksi_users(name, age) VALUES ("RichardGT", 20);
ERROR 1364 (HY000): Field 'sekolah' doesn't have a default value

Mengapa tidak bisa? Bila kalian kembali pada bagian pembuatan tabel, terdapat NOT NULL dalam querynya, artinya kolom tersebut tidak memperbolehkan datanya kosong alias harus berisi.

2.2 UPDATE

Bahasa Indonesianya adalah memperbarui, tugas query ini adalah untuk memperbarui salah satu data atau banyak data, syntaxnya seperti dibawah ini;

UPDATE nama_tabel SET kolom1= isi_kolom1, kolom2 = isi_kolom2, seterusnya WHERE kondisi_sesuai;

Ayo kita coba ganti nama MichaelACT yang ada didalam tabel koleksi_users menjadi Marselino.

mysql> UPDATE koleksi_users SET name="Marselino" WHERE name="MichaelACT";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM koleksi_users;
+----+-----------+-----+---------------+
| ID | name | age | sekolah |
+----+-----------+-----+---------------+
| 1 | Marselino | 17 | SMKN 1 APA YA |
| 2 | RichardGT | 20 | STT BI |
+----+-----------+-----+---------------+
2 rows in set (0.00 sec)

Bagaimana cara untuk memperbarui data lebih dari satu kolom?

mysql> UPDATE koleksi_users SET name="RafaelA", age=18 WHERE name="Marselino";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM koleksi_users;
+----+-----------+-----+---------------+
| ID | name | age | sekolah |
+----+-----------+-----+---------------+
| 1 | RafaelA | 18 | SMKN 1 APA YA |
| 2 | RichardGT | 20 | STT BI |
+----+-----------+-----+---------------+
2 rows in set (0.00 sec)

Bagaimana cara untuk memperbarui data lebih dari satu field?

mysql> UPDATE koleksi_users SET age=18 WHERE age>16;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> SELECT * FROM koleksi_users;
+----+-----------+-----+---------------+
| ID | name | age | sekolah |
+----+-----------+-----+---------------+
| 1 | RafaelA | 18 | SMKN 1 APA YA |
| 2 | RichardGT | 18 | STT BI |
+----+-----------+-----+---------------+
2 rows in set (0.00 sec)

Keterangan:

  • Rows Matched, baris yang cocok dengan kondisi WHERE.
  • Changed, data yang telah berhasil diubah.

Kita juga bisa menggunakan operator matematika / operator logika, lebih lanjut penggunaannya simak pada artikel dibawah ini.

2.3 DELETE

Query DELETE ini berguna untuk menghapus data yang sudah ada dalam tabel, disertai WHERE untuk menghapus data dengan kondisi yang sesuai dan tidak salah sasaran.

Jika kalian lupa memberikan WHERE dalam querynya, maka itu sama saja memerintahkan untuk menghapus semua data yang ada didalamnya. Syntaxnya seperti dibawah ini;

DELETE FROM nama_tabel WHERE kondisi_sesuai

Kita coba hapus data dari tabel koleksi_users dengan kondisi kolom ID pertama yaitu 1.

mysql> DELETE FROM koleksi_users WHERE ID = 1
Query OK, 1 row affected (0.03 sec)
mysql> SELECT * FROM koleksi_users;
+----+-----------+-----+---------------+
| ID | name | age | sekolah |
+----+-----------+-----+---------------+
| 2 | RichardGT | 20 | STT BI |
+----+-----------+-----+---------------+
2 rows in set (0.00 sec)

Seperti yang saya jelaskan sebelumnya, kalian juga dapat menambahkan operasi aritmatika dan operasi logika setelah query WHERE, akan kita kupas lebih dalam pada bagian selanjutnya.

2.4. SELECT & WHERE

Kita sudah sering menggunakannya bersamaan dengan query-query lainnya, gunanya untuk menampilkan data berdasarkan kondisi yang kita butuhkan, dan juga kita tetap menggunakan tabel koleksi_users.

Sebelum itu kita memerlukan data sebanyak mungkin untuk memudahkan eksperimen dengan query ini, kalian bisa ikuti perintah dibawah ini ataupun kustomisasi dengan kemauan kalian sendiri.

INSERT INTO koleksi_users(name, age, sekolah) VALUES ("MichaelACT", 17, "SMKN 1 Tomohon");
INSERT INTO koleksi_users(name, age, sekolah) VALUES ("OkktaMR", 18, "SMAN 1 Bekasi");
INSERT INTO koleksi_users(name, age, sekolah) VALUES ("Ari", 19, "Telkom University");
INSERT INTO koleksi_users(name, age, sekolah) VALUES ("Adi", 17, "SMAN 2 Jakarta");
INSERT INTO koleksi_users(name, age, sekolah) VALUES ("Agnew", 17, "SMAN 5 Cibarusah");
INSERT INTO koleksi_users(name, age, sekolah) VALUES ("Bima", 18, "SMKN Teknologi Informatika");

Sebenarnya ini akan lebih mudah jika kita mengimpor data dari file CSV, namun akan makin panjang maka lain waktu akan saya coba buat tutorialnya. Ketik perintah dibawah ini untuk memastikan tabelnya sudah terisi.

mysql> SELECT * FROM koleksi_users;
+----+------------+-----+----------------------------+
| ID | name | age | sekolah |
+----+------------+-----+----------------------------+
| 1 | MichaelACT | 17 | SMKN 1 Tomohon |
| 2 | OkktaMR | 18 | SMAN 4 Bekasi |
| 3 | Ari | 19 | Telkom University |
| 4 | Adi | 17 | SMAN 2 Jakarta Barat |
| 5 | Agnew | 17 | SMAN 5 Cibarusah |
| 6 | Bima | 18 | SMKN Teknologi Informatika |
+----+------------+-----+----------------------------+
6 rows in set (0.00 sec)

Bagaimana bila kita hanya ingin menampikan kolom name dan age?

mysql> SELECT name, age FROM koleksi_users;
+------------+-----+
| name | age |
+------------+-----+
| MichaelACT | 17 |
| OkktaMR | 18 |
| Ari | 19 |
| Adi | 17 |
| Agnew | 17 |
| Bima | 18 |
+------------+-----+
6 rows in set (0.00 sec)

Bagaimana bila kita hanya ingin menampikan kolom name dan age yang umurnya 18?

mysql> SELECT name, age FROM koleksi_users WHERE age = 18;
+---------+-----+
| name | age |
+---------+-----+
| OkktaMR | 18 |
| Bima | 18 |
+---------+-----+
2 rows in set (0.00 sec)

Amati dan pahami operator aritmatika dibawah ini, ambil kesimpulan kenapa query diatas bisa menampilkan umur 18;

Gambar oleh educba

Bagaimana bila kita ingin menampilkan kolom name dan age yang umurnya dari 18 – 19?

mysql> SELECT name, age FROM koleksi_users WHERE age BETWEEN 18 AND 19;
+---------+-----+
| name | age |
+---------+-----+
| OkktaMR | 18 |
| Ari | 19 |
| Bima | 18 |
+---------+-----+
3 rows in set (0.00 sec)

BETWEEN akan menampilkan data FROM and TO atau dalam konteks ini yaitu dari age(umur) 18 and sampai 19.

Bagaimana bila kita ingin menampilkan semua kolom tapi maksimal hanya 3?

mysql> SELECT * FROM koleksi_users LIMIT 3;
+----+------------+-----+----------------------+
| ID | name | age | sekolah |
+----+------------+-----+----------------------+
| 1 | MichaelACT | 17 | SMKN 1 Tomohon |
| 2 | OkktaMR | 18 | SMAN 1 Bekasi |
| 3 | Ari | 19 | Telkom University |
+----+------------+-----+----------------------+
3 rows in set (0.00 sec)

LIMIT akan membatasi jumlah data yang ditampilkan, dalam konteks ini maksimal ditetapkan hanya 3.

Sedikit kisi-kisi penggunaan operator logika pada query WHERE, berikut dibawah ini syntaxnya jika kalian ingin ber-eksperimen lebih jauh.

SELECT nama_kolom1, nama_kolom2, dll | * FROM nama_tabel WHERE kondisi_1 AND | NOT | OR kondisi_2

Tentunya masih banyak yang bisa dilakukan dengan query SELECT & WHERE, silahkan lanjutkan kedalam kelas gratis berbahasa inggris dibawah ini;

Membuat proyek kecil-kecilan

Pada bagian ini kita akan membuat database yang mengandung data diri, alamat dan nomor telepon, ketiga tabel tersebut dapat saling ter-integrasi dan juga dapat memudahkan kita untuk lebih paham isi datanya. Berikut desain databasenya;

Gambar Desain oleh Lucid Chart

Keterangan:

  • One to Many, misalnya nomor telepon dalam tabel Users_Collection dapat memiliki nomor telepon lebih dari 1 yang disimpan dalam tabel Phone berdasarkan ID pada tabel Users_Collection.
  • One to One, misalnya kolom AddressID pada tabel Users_Collection dapat memiliki alamat yang disimpan dalam tabel Address.

Sebelum implementasi desain database ke dalam MySQL kita perlu mengamati mana yang harus dibuat terlebih dahulu. Karena setiap tabel memiliki kolom yang dapat terhubung dengan tabel lainnya, maka kita perlu constraints FOREIGN KEY untuk menghubungkan kolom-kolom tersebut.

Setiap kali kolom yang akan terhubung harus memiliki dasar, jika tidak ada itu akan menimbulkan error. Lalu tabel mana yang harus kita buat terlebih dahulu? Tentunya tabel Users_Collection tidak dapat dibuat apabila dasarnya tidak ada yaitu kolom ID pada tabel Address, maka yang pertama dibuat adalah tabel Address.

Membuat database Users

mysql> CREATE DATABASE users;
Query OK, 1 row affected (0.08 sec)

Membuat tabel dan kolom sesuai dengan desain skema

Kita membutuhkan constraint FOREIGN KEY untuk menghubungkan tabel sekarang ke induknya.

mysql> USE users;
Database changed
mysql> CREATE TABLE Address(
-> ID BIGINT PRIMARY KEY AUTO_INCREMENT,
-> Street VARCHAR(32),
-> Number SMALLINT,
-> City VARCHAR(32) NOT NULL,
-> Country VARCHAR(64) NOT NULL);
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE Users_Collection(
-> ID BIGINT PRIMARY KEY AUTO_INCREMENT,
-> Name VARCHAR(32) NOT NULL,
-> Age TINYINT NOT NULL,
-> AddressID BIGINT NOT NULL,
-> FOREIGN KEY (AddressID) REFERENCES Address(ID));
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE Phone(
-> ID BIGINT PRIMARY KEY AUTO_INCREMENT,
-> PhoneNumber VARCHAR(24),
-> OwnerID BIGINT NOT NULL,
-> FOREIGN KEY (OwnerID) REFERENCES Users_Collection(ID));
Query OK, 0 rows affected (0.01 sec)

Menampilkan aturan-aturan kolom yang terdapat pada setiap tabel

PRI adalah kepanjangan dari PRIMARY KEY, lalu MUL adalah MULTIPLE berarti kolom tersebut masih memiliki hubungan ke kolom dalam tabel yang lainnya.

mysql> DESCRIBE Address;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Street | varchar(32) | YES | | NULL | |
| Number | smallint(6) | YES | | NULL | |
| City | varchar(32) | NO | | NULL | |
| Country | varchar(64) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> DESCRIBE Users_Collection;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Name | varchar(32) | NO | | NULL | |
| Age | tinyint(4) | NO | | NULL | |
| AddressID | bigint(20) | NO | MUL | NULL | |
+-----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> DESCRIBE Phone;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| PhoneNumber | varchar(24) | YES | | NULL | |
| OwnerID | bigint(20) | NO | MUL | NULL | |
+-------------+-------------+------+-----+---------+----------------
3 rows in set (0.00 sec)

Menyisipkan data

mysql> INSERT INTO Address(Street, Number, City, Country) VALUES ("Surya Tirtana", 1, "Jakarta Utara", "Indonesia");
mysql> INSERT INTO Address(Street, Number, City, Country) VALUES ("Tirtana Kencana", 4, "Jakarta Selatan", "Indonesia");
mysql> INSERT INTO Address(Street, Number, City, Country) VALUES ("Jeruk Ambyar", 150, "Medan", "Indonesia");
mysql> SELECT * FROM Address;
+----+-----------------+--------+-----------------+-----------+
| ID | Street | Number | City | Country |
+----+-----------------+--------+-----------------+-----------+
| 1 | Surya Tirtana | 1 | Jakarta Utara | Indonesia |
| 2 | Tirtana Kencana | 4 | Jakarta Selatan | Indonesia |
| 3 | Jeruk Ambyar | 150 | Medan | Indonesia |
+----+-----------------+--------+-----------------+-----------+
3 rows in set (0.00 sec)

Lalu setelah itu kita sisipkan data ke dalam tabel Users_Collection, namun harus didasari oleh kolom ID dalam tabel Address agar setiap user memiliki alamat yang sesuai.

mysql> INSERT INTO Users_Collection(Name, Age, AddressID) VALUES ("MichaelACT", 18, 1);
mysql> INSERT INTO Users_Collection(Name, Age, AddressID) VALUES ("RichardGT", 20, 2);
mysql> INSERT INTO Users_Collection(Name, Age, AddressID) VALUES ("OktaaMR", 19, 3);
mysql> SELECT * FROM Users_Collection;
+----+------------+-----+-----------+
| ID | Name | Age | AddressID |
+----+------------+-----+-----------+
| 1 | MichaelACT | 18 | 1 |
| 2 | RichardGT | 20 | 2 |
| 3 | OktaaMR | 19 | 3 |
+----+------------+-----+-----------+
3 rows in set (0.00 sec)
mysql> INSERT INTO Phone(PhoneNumber, OwnerID) VALUES (08232194392, 1);
mysql> INSERT INTO Phone(PhoneNumber, OwnerID) VALUES (08232193434, 1);
mysql> INSERT INTO Phone(PhoneNumber, OwnerID) VALUES (08341349439, 2);
mysql> INSERT INTO Phone(PhoneNumber, OwnerID) VALUES (08341349434, 3);
mysql> INSERT INTO Phone(PhoneNumber, OwnerID) VALUES (08341323424, 3);
mysql> INSERT INTO Phone(PhoneNumber, OwnerID) VALUES (08341344342, 3);
mysql> SELECT ID, LPAD(PhoneNumber, 11, 0), OwnerID FROM Phone;
+----+--------------------------+---------+
| ID | LPAD(PhoneNumber, 11, 0) | OwnerID |
+----+--------------------------+---------+
| 1 | 08232194392 | 1 |
| 2 | 08232193434 | 1 |
| 3 | 08341349439 | 2 |
| 4 | 08341349434 | 3 |
| 5 | 08341323424 | 3 |
| 6 | 08341344342 | 3 |
+----+--------------------------+---------+
6 rows in set (0.00 sec)

Kolom PhoneNumber dalam tabel Phone membutuhkan perhatian khusus, bila kalian masih bingung perbedaannya silahkan bandingkan sendiri dengan query SELECT pada umumnya. Kita membutuhkan fungsi LPAD untuk manipulasi data agar nomor telepon tersebut dapat di depani atau pimpin oleh angka 0 terlebih dahulu.

Menghubungkan tabel-tabel tersebut

Akan lebih mudah dibaca jika mereka dapat dibaca secara langsung dengan hanya satu query saja, hadirnya Query JOIN untuk mengatasi hal-hal seperti ini. Ada 3 tipe Query JOIN yaitu diantaranya;

  • Inner Join 👈🏼,
  • Left Join,
  • Right Join,
  • Full Join.
mysql> SELECT Users_Collection.ID, Name, Age, City, Country FROM Users_Collection INNER JOIN Address WHERE AddressID = Address.ID;
+----+------------+-----+-----------------+-----------+
| ID | Name | Age | City | Country |
+----+------------+-----+-----------------+-----------+
| 1 | MichaelACT | 18 | Jakarta Utara | Indonesia |
| 2 | RichardGT | 20 | Jakarta Selatan | Indonesia |
| 3 | OktaaMR | 19 | Medan | Indonesia |
+----+------------+-----+-----------------+-----------+
3 rows in set (0.00 sec)
mysql> SELECT Users_Collection.ID, Name, LPAD(PhoneNumber, 11, 0) FROM Users_Collection INNER JOIN Phone WHERE OwnerID = Users_Collection.ID;
+----+------------+--------------------------+
| ID | Name | LPAD(PhoneNumber, 11, 0) |
+----+------------+--------------------------+
| 1 | MichaelACT | 08232194392 |
| 1 | MichaelACT | 08232193434 |
| 2 | RichardGT | 08341349439 |
| 3 | OktaaMR | 08341349434 |
| 3 | OktaaMR | 08341323424 |
| 3 | OktaaMR | 08341344342 |
+----+------------+--------------------------+
6 rows in set (0.00 sec)

TUGAS AKHIR

Hubungkan lah ketiga tabel tersebut secara langsung dengan 1 Query saja, lalu tampilkanlah tabel-tabel berikut ini;

  • Users_Collection.ID,
  • Users_Collection.Name,
  • Users_Collection.Age,
  • Address.Street,
  • Address.City,
  • Address.Country,
  • Phone.PhoneNumber.

Pastikan hasilnya seperti gambar dibawah.

KESIMPULAN

Pelajaran dalam bidang IT akan lebih mudah jika mempunyai rasa penasaran terhadap hal-hal yang telah kita lakukan sebelumnya maupun di artikel-artikel lainnya.

Kenapa? Pembuat konten tutorial tidak akan sanggup kalau harus menjelaskan semua hal materi secara cepat dan mudah dipahami, karena itu kita harus lebih sering ber-eksperimen ketimbang selalu mengikuti tutorial yang ada. Percayai dirimu, salah itu proses bukan kekalahan!

CATATAN PRIBADI

Sedikit catatan pribadi ketika saya sedang belajar di kelas database design eduonix. Jika kurang paham bisa direct message ke saya lewat Instagram.

  • Buat tabel menjadi lebih halus/mudah dibaca dan tidak terlihat berantakan.
  • Setiap field harus memiliki 1 ID yang unik/primary key untuk memudahkan identifikasi nanti.
  • Dalam MySQL kita menyebutnya tables, namun di MariaDB itu collections.
  • Jangan membuat multiple data dalam 1 kolom.
    Contoh: Beberapa nomor orang lain dalam 1 field.
  • Jangan mengumpulkan data yang harusnya bisa lebih spesifik.
    Contoh: Jika ingin membuat kolom alamat, maka harus dibuat beberapa kolom yang berbeda yaitu jalan, nomor, kota, negara dll.
  • Jika salah satu kolom memiliki data yang berlebih(dapat 2 ataupun lebih) maka buatlah 1 tabel lagi yang berbeda.
    Contoh: Jika salah satu data nomor memiliki field berlebih, maka harus dipisahkan dalam tabel yang berbeda sekaligus disertai ID nya agar bisa di cocokkan dengan tabel utamanya.
  • Jangan menyimpan data BLOB(images, videos, gif dan lain-lain)didalam database, lebih baik simpan lokasi filenya (“/path/to/file”).
  • Cardinality itu tentang quantitas: Berapa “values” yang kamu inginkan dalam satu kolom.
  • Dalam RDBMS, obligation diterjemahkan ke dalam bentukan “foreign key”.

Ada 2 hubungan tabel database yaitu:

  • One to Many Relationship
    1 Kolom terhubung ke beberapa kolom dan beberapa baris.
  • One to one Relationship
    1 Kolom terhubung ke beberapa kolom dan 1 baris.

--

--

Do Exploit
Do Exploit

Written by Do Exploit

I share stories about what I've learned in the past and now. Let's connect to Instagram! @do.exploit

No responses yet