1. Create Database
#Create Database
library(DBI)
## Warning: package 'DBI' was built under R version 4.5.2
library(RMySQL)
## Warning: package 'RMySQL' was built under R version 4.5.2
# Membuat koneksi ke MySQL
basis <- dbConnect(
  MySQL(),
  user = "root",       
  password = "",        
  host = "localhost"    
)
dbExecute(basis, "CREATE DATABASE IF NOT EXISTS kpopys")
## [1] 1
dbExecute(basis, "USE kpopys")
## [1] 0

Kode tersebut melakukan proses instalasi dan pemanggilan package DBI dan RMySQL untuk memungkinkan R terhubung dengan MySQL. Setelah itu, fungsi dbConnect() digunakan untuk membuat koneksi ke server MySQL menggunakan user root tanpa password di localhost. Melalui koneksi tersebut, perintah SQL CREATE DATABASE IF NOT EXISTS k_popys dijalankan untuk membuat database baru bernama k_popsys jika database tersebut belum ada, yang ditunjukkan oleh output bernilai 1 sebagai tanda perintah berhasil dieksekusi. Kemudian, perintah USE k_popys dijalankan untuk memilih database tersebut sebagai tempat operasi selanjutnya, dengan output 0 yang menandakan perintah berhasil namun tidak menghasilkan baris data karena perintah USE hanya mengubah konteks database tanpa memodifikasi tabel atau data apa pun.

  1. Create Table
#CREATE TABLE (DDL)
#Tabel agensi
dbExecute(basis,"
CREATE TABLE IF NOT EXISTS agensi (
  agensi_id INT PRIMARY KEY AUTO_INCREMENT,
  nama_agensi VARCHAR(100),
  lokasi VARCHAR(100)
);
")
## [1] 0
#Tabel idol
dbExecute(basis,"
CREATE TABLE IF NOT EXISTS idol (
  idol_id INT PRIMARY KEY AUTO_INCREMENT,
  nama_idol VARCHAR(100),
  posisi VARCHAR(50),
  agensi_id INT,
  FOREIGN KEY (agensi_id) REFERENCES agensi(agensi_id)
);
")
## [1] 0

Pada langkah ini dibuat dua tabel utama dalam database, yaitu agensi dan idol.Perintah CREATE TABLE dimana perintah pertama digunakan untuk membentuk tabel agensi yang berisi kolom agensi_id sebagai primary key dengan nilai otomatis bertambah, serta kolom nama_agensi dan lokasi. Selanjutnya, perintah kedua membuat tabel idol yang menyimpan data idol dengan idol_id sebagai primary key, disertai nama idol, posisi, dan kolom agensi_id yang berfungsi sebagai foreign key digunakan untuk menghubungkan setiap idol dengan agensinya.Dimana output berupa angka 0 menunjukkan bahwa perintah tersebut berhasil dijalankan dan tidak menghasilkan baris data, karena pembuatan tabel hanya membentuk struktur tanpa mengembalikan hasil berupa data.

  1. INSERT DATA
#INSERT DATA (DML)
#Insert ke agensi
dbExecute(basis,"
INSERT INTO agensi (nama_agensi, lokasi) VALUES
('HYBE', 'Seoul'),
('SM Entertainment', 'Seoul'),
('JYP Entertainment', 'Seoul'),
('YG Entertainment', 'Seoul');
")
## [1] 4
#Insert ke idol
dbExecute(basis,"
INSERT INTO idol (nama_idol, posisi, agensi_id) VALUES
('Taehyung', 'Vocalist', 1),
('Jungkook', 'Main Vocal', 1),
('Kai', 'Dancer', 2),
('Mark Lee', 'Rapper', 2),
('Jennie', 'Rapper', 4),
('Jisoo', 'Vocalist', 4);
")
## [1] 6

Pada tahap ini dilakukan pengisian data awal ke dalam dua tabel yang sudah dibuat. Perintah pertama memasukkan empat baris data ke tabel agensi, masing-masing berisi nama agensi besar di Korea dan lokasi mereka, sehingga output menunjukkan angka 4 karena empat data berhasil ditambahkan. Selanjutnya, perintah kedua mengisi tabel idol dengan enam idol dari berbagai agensi, lengkap dengan nama, posisi dalam grup, dan nomor agensi yang menjadi referensi melalui foreign key. Output 6 menandakan bahwa enam baris data berhasil dimasukkan ke tabel idol tanpa ada kesalahan.

  1. Menampilkan Struktur Tabel
#Menampilkan Struktur Tabel
dbGetQuery(basis, "DESCRIBE idol")
##       Field         Type Null Key Default          Extra
## 1   idol_id      int(11)   NO PRI    <NA> auto_increment
## 2 nama_idol varchar(100)  YES        <NA>               
## 3    posisi  varchar(50)  YES        <NA>               
## 4 agensi_id      int(11)  YES MUL    <NA>
dbGetQuery(basis, "DESCRIBE agensi")
##         Field         Type Null Key Default          Extra
## 1   agensi_id      int(11)   NO PRI    <NA> auto_increment
## 2 nama_agensi varchar(100)  YES        <NA>               
## 3      lokasi varchar(100)  YES        <NA>

Perintah DESCRIBE digunakan untuk menampilkan struktur tabel agar bisa melihat rincian setiap kolom, seperti nama kolom, tipe data, apakah boleh bernilai null, kunci utama atau tidak, nilai default, dan apakah kolom menggunakan auto increment.Pada output tabel idol, terlihat bahwa idol_id adalah kunci utama dengan tipe integer dan bertambah otomatis, sementara kolom lainnya berisi informasi nama idol, posisi, dan agensi_id yang berfungsi sebagai penghubung ke tabel agensi.Pada output tabel agensi, kolom agensi_id juga menjadi kunci utama dan otomatis bertambah, sedangkan nama_agensi dan lokasi berisi data teks sesuai definisi saat pembuatan tabel.

  1. Mengurutkan Data
#Mengurutkan Data (ORDER BY)
#ASC
idol_asc <- "SELECT * FROM idol ORDER BY nama_idol ASC"
print(idol_asc)
## [1] "SELECT * FROM idol ORDER BY nama_idol ASC"
agensi_asc <- "SELECT * FROM agensi ORDER BY nama_agensi ASC"
print(agensi_asc)
## [1] "SELECT * FROM agensi ORDER BY nama_agensi ASC"
#DESC
idol_desc <- "SELECT * FROM idol ORDER BY nama_idol DESC"
print(idol_desc)
## [1] "SELECT * FROM idol ORDER BY nama_idol DESC"
agensi_desc <- "SELECT * FROM agensi ORDER BY nama_agensi DESC"
print(agensi_desc)
## [1] "SELECT * FROM agensi ORDER BY nama_agensi DESC"

Pada langkah ini dibuat perintah SQL untuk mengurutkan data pada tabel idol dan agensi, baik secara ascending (ASC) maupun descending (DESC).Namun perintah tersebut tidak dijalankan ke database, melainkan hanya disimpan sebagai string dan kemudian ditampilkan menggunakan print(), sehingga output yang muncul hanyalah teks perintah SQL itu sendiri, bukan hasil urutan data dari tabel.

  1. INNER JOIN
#INNER JOIN
query_inner <- "
SELECT idol.idol_id, idol.nama_idol, idol.posisi,
       agensi.nama_agensi, agensi.lokasi
FROM idol
INNER JOIN agensi
ON idol.agensi_id = agensi.agensi_id;"
dbGetQuery(basis, query_inner)
##   idol_id nama_idol     posisi      nama_agensi lokasi
## 1       1  Taehyung   Vocalist             HYBE  Seoul
## 2       2  Jungkook Main Vocal             HYBE  Seoul
## 3       3       Kai     Dancer SM Entertainment  Seoul
## 4       4  Mark Lee     Rapper SM Entertainment  Seoul
## 5       5    Jennie     Rapper YG Entertainment  Seoul
## 6       6     Jisoo   Vocalist YG Entertainment  Seoul

Perintah INNER JOIN pada bagian ini digunakan untuk menggabungkan data dari tabel idol dan agensi berdasarkan kolom agensi_id yang menjadi penghubung di antara keduanya. Query tersebut memilih beberapa kolom penting, yaitu idol_id, nama_idol, posisi, serta nama_agensi dan lokasi dari tabel agensi. Karena menggunakan INNER JOIN, hanya data idol yang memiliki kecocokan agensi_id di tabel agensi yang akan ditampilkan. Output yang dihasilkan menunjukkan enam baris data idol lengkap dengan informasi agensi masing-masing.

  1. LEFT JOIN
#LEFT JOIN
query_left <- "
SELECT idol.idol_id, idol.nama_idol, idol.posisi,
       agensi.nama_agensi, agensi.lokasi
FROM idol
LEFT JOIN agensi
ON idol.agensi_id = agensi.agensi_id;
"
dbGetQuery(basis, query_left)
##   idol_id nama_idol     posisi      nama_agensi lokasi
## 1       1  Taehyung   Vocalist             HYBE  Seoul
## 2       2  Jungkook Main Vocal             HYBE  Seoul
## 3       3       Kai     Dancer SM Entertainment  Seoul
## 4       4  Mark Lee     Rapper SM Entertainment  Seoul
## 5       5    Jennie     Rapper YG Entertainment  Seoul
## 6       6     Jisoo   Vocalist YG Entertainment  Seoul

Pada tahap LEFT JOIN ini, perintah SQL digunakan untuk menampilkan seluruh data yang ada di tabel idol, kemudian mencocokkan setiap barisnya dengan tabel agensi berdasarkan kolom agensi_id. Karena menggunakan LEFT JOIN, semua idol akan tetap muncul meskipun ada yang tidak memiliki kecocokan di tabel agensi, hanya kolom dari tabel agensi yang akan bernilai NULL jika tidak ada pasangan. Namun pada contoh kasus ini semua idol memiliki agensi_id yang valid sehingga setiap baris berhasil mendapatkan informasi nama agensi dan lokasi. Output yang muncul sama seperti INNER JOIN karena seluruh idol memang tercatat pada salah satu agensi dan tidak ada data yang tidak cocok.

  1. RIGHT JOIN
#RIGHT JOIN
query_right <- "
SELECT idol.idol_id, idol.nama_idol, idol.posisi,
       agensi.nama_agensi, agensi.lokasi
FROM idol
RIGHT JOIN agensi
ON idol.agensi_id = agensi.agensi_id;
"
dbGetQuery(basis, query_right)
##   idol_id nama_idol     posisi       nama_agensi lokasi
## 1       1  Taehyung   Vocalist              HYBE  Seoul
## 2       2  Jungkook Main Vocal              HYBE  Seoul
## 3       3       Kai     Dancer  SM Entertainment  Seoul
## 4       4  Mark Lee     Rapper  SM Entertainment  Seoul
## 5      NA      <NA>       <NA> JYP Entertainment  Seoul
## 6       5    Jennie     Rapper  YG Entertainment  Seoul
## 7       6     Jisoo   Vocalist  YG Entertainment  Seoul

Pada bagian RIGHT JOIN ini, perintah SQL digunakan untuk menampilkan seluruh data dari tabel agensi, kemudian mencocokkannya dengan tabel idol berdasarkan agensi_id. Karena menggunakan RIGHT JOIN, semua agensi akan tetap muncul meskipun tidak memiliki idol yang terkait. Output menunjukkan bahwa agensi seperti HYBE, SM, dan YG menampilkan idol-idol yang terhubung dengannya, sedangkan JYP Entertainment muncul dengan nilai NA pada kolom idol karena belum ada idol yang tercatat di agensi tersebut.Dengan demikian, RIGHT JOIN memastikan seluruh agensi tetap tampil meskipun tidak memiliki pasangan di tabel idol.

  1. FULL OUTER JOIN
#FULL OUTER JOIN
#pakai UNION
query_full <- "
SELECT idol.idol_id, idol.nama_idol, idol.posisi,
       agensi.nama_agensi, agensi.lokasi
FROM idol
LEFT JOIN agensi
ON idol.agensi_id = agensi.agensi_id
UNION
SELECT idol.idol_id, idol.nama_idol, idol.posisi,
       agensi.nama_agensi, agensi.lokasi
FROM idol
RIGHT JOIN agensi
ON idol.agensi_id = agensi.agensi_id;
"
dbGetQuery(basis, query_full)
##   idol_id nama_idol     posisi       nama_agensi lokasi
## 1       1  Taehyung   Vocalist              HYBE  Seoul
## 2       2  Jungkook Main Vocal              HYBE  Seoul
## 3       3       Kai     Dancer  SM Entertainment  Seoul
## 4       4  Mark Lee     Rapper  SM Entertainment  Seoul
## 5       5    Jennie     Rapper  YG Entertainment  Seoul
## 6       6     Jisoo   Vocalist  YG Entertainment  Seoul
## 7      NA      <NA>       <NA> JYP Entertainment  Seoul

Pada tahap FULL OUTER JOIN, MySQL tidak menyediakan perintah langsung, sehingga digunakan kombinasi LEFT JOIN dan RIGHT JOIN yang digabungkan dengan UNION untuk menampilkan seluruh data dari kedua tabel, baik yang memiliki pasangan maupun tidak. Bagian pertama query mengambil semua idol beserta agensinya melalui LEFT JOIN, sedangkan bagian kedua memastikan semua agensi tetap muncul melalui RIGHT JOIN, termasuk agensi yang belum memiliki idol. Hasil akhirnya menghasilkan gabungan lengkap, di mana seluruh idol dan seluruh agensi tampil tanpa ada data yang hilang. Output menunjukkan enam idol dengan agensinya masing-masing dan satu baris tambahan yang menampilkan JYP Entertainment tanpa idol, ditandai dengan nilai NA pada kolom idol.

  1. UPDATE
#UPADE
# Menambahkan idol baru
dbExecute(basis,"
INSERT INTO idol (nama_idol, posisi, agensi_id) VALUES
('Jaemin', 'Vocalist', 2),
('Jeno', 'Dancer', 2);
")
## [1] 2
# Update posisi Jaemin
dbExecute(basis,"
UPDATE idol
SET posisi = 'Lead Vocalist'
WHERE nama_idol = 'Jaemin';
")
## [1] 1
# Update posisi Jeno
dbExecute(basis,"
UPDATE idol
SET posisi = 'Lead Dancer'
WHERE nama_idol = 'Jeno';
")
## [1] 1

Pada langkah ini dilakukan proses penambahan dan pembaruan data pada tabel idol. Pertama, dua idol baru yaitu Jaemin dan Jeno dimasukkan ke dalam tabel dengan posisi awal Vocalist dan Dancer, sehingga output menunjukkan angka 2 karena dua baris berhasil ditambahkan. Setelah itu, posisi masing-masing idol diperbarui menggunakan perintah UPDATE, di mana Jaemin diubah menjadi Lead Vocalist dan Jeno menjadi Lead Dancer. Setiap perintah update menghasilkan output 1, menandakan bahwa satu baris data berhasil diperbarui sesuai kondisi yang diberikan.

  1. SELECT
#Cek data setelah UPDATE
dbGetQuery(basis, "SELECT * FROM idol")
##   idol_id nama_idol        posisi agensi_id
## 1       1  Taehyung      Vocalist         1
## 2       2  Jungkook    Main Vocal         1
## 3       3       Kai        Dancer         2
## 4       4  Mark Lee        Rapper         2
## 5       5    Jennie        Rapper         4
## 6       6     Jisoo      Vocalist         4
## 7       7    Jaemin Lead Vocalist         2
## 8       8      Jeno   Lead Dancer         2

Perintah SELECT * FROM idol digunakan untuk mengecek seluruh isi tabel idol setelah dilakukan proses UPDATE atau penambahan data baru. Output yang muncul menunjukkan bahwa data idol lama masih lengkap dan dua idol baru, yaitu Jaemin dan Jeno, telah berhasil masuk ke tabel dengan idol_id 7 dan 8. Keduanya memiliki posisi masing-masing sebagai Lead Vocalist dan Lead Dancer, serta sama-sama terdaftar pada agensi dengan ID 2.