Penerapan SQL Database dan Rstudio untuk Pengelolaan Data Studio Seni (Lukisan, Workshop, Pameran)

PROGRAM

Import Library

Menginport library yang dibutuhkan paling awal agar dapat membaca package yang digunakan

library(RMySQL)
## Warning: package 'RMySQL' was built under R version 4.5.2
## Loading required package: DBI
## Warning: package 'DBI' was built under R version 4.5.2
library(DBI)

Menghubungkan Server Database ke RStudio

server <- dbConnect(
  RMySQL::MySQL(),
  host = "localhost",
  user = "root",
  password = "")

Membuat dan Mengakses Database Baru

Sebelum membuat tabel diperlukan membuat database pada server yang telah dimasukkan, di mana pada program ini servernya bernama “server”

dbExecute(server, "CREATE DATABASE IF NOT EXISTS `StudioSeni`")
## [1] 1
dbExecute(server, "USE `StudioSeni`")
## [1] 0

Membuat Tabel Data Baru dalam Sebuah Database

Menggunakan database yang telah dibuat sebelumnya, dibuatkan tabel didalam database tersebut

1. Tabel Studio

dbExecute(server, "
CREATE TABLE Studio (
    ID_Studio VARCHAR(10) PRIMARY KEY,
    Nama_Studio VARCHAR(100) NOT NULL,
    Lokasi VARCHAR(150),
    Pemilik VARCHAR(100) NOT NULL,
    Tahun_Berdiri INT
    );
")
## [1] 0

2. Tabel Karya (Lukisan)

dbExecute(server, "
          CREATE TABLE Karya (
    ID_Karya VARCHAR(10) PRIMARY KEY,
    ID_Studio VARCHAR(10),
    Judul VARCHAR(120),
    Kategori VARCHAR(50),
    Tahun_Pembuatan INT,
    Harga DECIMAL(15,2),
    FOREIGN KEY (ID_Studio) REFERENCES Studio(ID_Studio)
    );
")
## [1] 0

3. Tabel Workshop

dbExecute(server, "
CREATE TABLE Workshop (
    ID_Workshop VARCHAR(10) PRIMARY KEY,
    ID_Studio VARCHAR(10),
    Nama_Workshop VARCHAR(120),
    Tanggal DATE,
    Harga DECIMAL(15,2),
    Kapasitas INT,
    FOREIGN KEY (ID_Studio) REFERENCES Studio(ID_Studio)
    );
")
## [1] 0

4. Tabel Pameran

dbExecute(server, "
CREATE TABLE Pameran (
     ID_Pameran VARCHAR(10) PRIMARY KEY,
    ID_Studio VARCHAR(10),
    Tema VARCHAR(120),
    Lokasi VARCHAR(120),
    Tanggal DATE,
    Pengunjung INT,
    FOREIGN KEY (ID_Studio) REFERENCES Studio(ID_Studio)
    );
")
## [1] 0

5. Tabel Transaksi

dbExecute(server, "
CREATE TABLE IF NOT EXISTS Transaksi (
    ID_Transaksi VARCHAR(10) PRIMARY KEY,
    Jenis ENUM('Lukisan','Workshop','Pameran'),
    ID_Item VARCHAR(10),
    Tanggal DATE,
    Jumlah INT,
    Total DECIMAL(15,2)
);
")
## [1] 0

Memasukkan Data ke dalam Tabel

1. Mengisi Data ke dalam Tabel Studio

dbSendQuery(server, "
INSERT INTO Studio (ID_Studio, Nama_Studio, Lokasi, Pemilik, Tahun_Berdiri) VALUES
('S001','Studio Warna Kita','Bandung','Rina Aulia',2015),
('S002','Galeri ArtNusa','Jakarta','Samuel Hartono',2018),
('S003','Rumah Seni Pelangi','Yogyakarta','Dian Lestari',2012);
")
## <MySQLResult:1656445856,0,7>

2. Mengisi Data ke dalam Tabel Karya(Lukisan)

dbSendQuery(server, "
INSERT INTO Karya (ID_Karya, ID_Studio, Judul, Kategori, Tahun_Pembuatan, Harga) VALUES
('L001','S001','Senandung Senja','Abstrak',2020,2500000),
('L002','S002','Harmoni Laut','Realism',2019,3500000),
('L003','S003','Bunga Kehidupan','Floral',2021,1800000);
")
## <MySQLResult:1656445856,0,8>

3. Mengisi Data ke dalam Tabel Workshop

dbSendQuery(server, "INSERT INTO Workshop (ID_Workshop, ID_Studio, Nama_Workshop, Tanggal, Harga, Kapasitas) VALUES
('W001','S001','Basic Acrylic Painting','2025-02-10',250000,20),
('W002','S002','Watercolor Technique','2025-03-01',300000,25),
('W003','S003','Sketching Fundamentals','2025-01-15',200000,30);
")
## <MySQLResult:12,0,9>

4. Mengisi Data ke dalam Tabel Pameran

dbSendQuery(server, "INSERT INTO Pameran (ID_Pameran, ID_Studio, Tema, Lokasi, Tanggal, Pengunjung) VALUES
('P001','S001','Ekspresi Alam','Bandung','2025-01-25',180),
('P002','S002','Warna Nusantara','Jakarta','2025-02-14',220),
('P003','S003','Seni Masa Kini','Yogyakarta','2025-03-02',150);
")
## <MySQLResult:1770484784,0,10>

5. Mengisi Data ke dalam Tabel Transaksi

dbSendQuery(server, "
INSERT INTO Transaksi 
(ID_Transaksi, Jenis, ID_Item, Tanggal, Jumlah, Total) VALUES
('T001','Lukisan','L003','2025-01-15',1,3500000),
('T002','Workshop','W002','2025-02-10',3,750000),
('T003','Pameran','P001','2025-01-25',180,0),
('T004','Lukisan','L003','2025-02-20',1,2500000),
('T005','Workshop','W002','2025-03-01',10,3000000);
")
## <MySQLResult:12,0,11>

Menampilkan Nilai Tabel Data pada Database

tampilkan.studio <- dbGetQuery(server, "
                        SELECT * FROM Studio;
                        ")
print(tampilkan.studio)
##   ID_Studio        Nama_Studio     Lokasi        Pemilik Tahun_Berdiri
## 1      S001  Studio Warna Kita    Bandung     Rina Aulia          2015
## 2      S002     Galeri ArtNusa    Jakarta Samuel Hartono          2018
## 3      S003 Rumah Seni Pelangi Yogyakarta   Dian Lestari          2012
tampilkan.karya <- dbGetQuery(server, "
                        SELECT * FROM Karya;
                        ")
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 5 imported
## as numeric
print(tampilkan.karya)
##   ID_Karya ID_Studio           Judul Kategori Tahun_Pembuatan   Harga
## 1     L001      S001 Senandung Senja  Abstrak            2020 2500000
## 2     L002      S002    Harmoni Laut  Realism            2019 3500000
## 3     L003      S003 Bunga Kehidupan   Floral            2021 1800000
tampilkan.workshop <- dbGetQuery(server, "
                        SELECT * FROM Workshop;
                        ")
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 4 imported
## as numeric
print(tampilkan.workshop)
##   ID_Workshop ID_Studio          Nama_Workshop    Tanggal  Harga Kapasitas
## 1        W001      S001 Basic Acrylic Painting 2025-02-10 250000        20
## 2        W002      S002   Watercolor Technique 2025-03-01 300000        25
## 3        W003      S003 Sketching Fundamentals 2025-01-15 200000        30
tampilkan.pameran <- dbGetQuery(server, "
                        SELECT * FROM Pameran;
                        ")
print(tampilkan.pameran)
##   ID_Pameran ID_Studio            Tema     Lokasi    Tanggal Pengunjung
## 1       P001      S001   Ekspresi Alam    Bandung 2025-01-25        180
## 2       P002      S002 Warna Nusantara    Jakarta 2025-02-14        220
## 3       P003      S003  Seni Masa Kini Yogyakarta 2025-03-02        150
tampilkan.transaksi <- dbGetQuery(server, "
                        SELECT * FROM Transaksi;
                        ")
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 5 imported
## as numeric
print(tampilkan.transaksi)
##   ID_Transaksi    Jenis ID_Item    Tanggal Jumlah   Total
## 1         T001  Lukisan    L003 2025-01-15      1 3500000
## 2         T002 Workshop    W002 2025-02-10      3  750000
## 3         T003  Pameran    P001 2025-01-25    180       0
## 4         T004  Lukisan    L003 2025-02-20      1 2500000
## 5         T005 Workshop    W002 2025-03-01     10 3000000

Jumlah Karya, Workshop, dan Pameran per Studio

##   ID_Studio        Nama_Studio Jumlah_Karya Jumlah_Workshop Jumlah_Pameran
## 1      S001  Studio Warna Kita            1               1              1
## 2      S002     Galeri ArtNusa            1               1              1
## 3      S003 Rumah Seni Pelangi            1               1              1

Total Pendapatan Studio (Lukisan + Workshop)

pendapatan.studio <- dbGetQuery(server, "
SELECT 
    s.ID_Studio,
    s.Nama_Studio,
    COALESCE(SUM(t.Total), 0) AS Total_Pendapatan
FROM Studio s
LEFT JOIN Transaksi t 
    ON (
        (t.Jenis = 'Lukisan' AND t.ID_Item IN (SELECT ID_Karya FROM Karya WHERE Karya.ID_Studio = s.ID_Studio))
        OR
        (t.Jenis = 'Workshop' AND t.ID_Item IN (SELECT ID_Workshop FROM Workshop WHERE Workshop.ID_Studio = s.ID_Studio))
    )
GROUP BY s.ID_Studio, s.Nama_Studio;
")
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 2 imported
## as numeric
pendapatan.studio
##   ID_Studio        Nama_Studio Total_Pendapatan
## 1      S001  Studio Warna Kita                0
## 2      S002     Galeri ArtNusa          3750000
## 3      S003 Rumah Seni Pelangi          6000000

Jumlah Pengunjung Pameran per Studio

pengunjung.studio <- dbGetQuery(server, "
    SELECT 
        s.ID_Studio,
        s.Nama_Studio,
        COALESCE(SUM(p.Pengunjung),0) AS Total_Pengunjung
    FROM Studio s
    LEFT JOIN Pameran p ON s.ID_Studio = p.ID_Studio
    GROUP BY s.ID_Studio, s.Nama_Studio;
")
## Warning in dbSendQuery(conn, statement, ...): Decimal MySQL column 2 imported
## as numeric
pengunjung.studio
##   ID_Studio        Nama_Studio Total_Pengunjung
## 1      S001  Studio Warna Kita              180
## 2      S002     Galeri ArtNusa              220
## 3      S003 Rumah Seni Pelangi              150