TUGAS 3 MANAJEMEN BASIS DATA
Georgy Banny Rizky Wasiat 24060121140103
Kelas MBD [D]
Database yang digunakan adalah database pemain_bola yang didalamnya ada tabel players, pemain, dan tabel teams
A. Tabel Players
B. Tabel Negara
C. Tabel Teams
1. Query pertama yaitu menggabungkan tiga dari tabel players, teams, dan negara yang memiliki goals diatas 10 menggunakan left join
Query sebelum optimasi:
SELECT * FROM players JOIN negara
ON players.country_id = negara.id LEFT JOIN teams
ON players.previous_team_id = teams.id WHERE goals > 10
Aljabar Relasionalnya:
π * (σ (goals > 10) (players ⨝ country) ⨝ teams) Hasil:
Query tersebut pemrosesan lama karena memerlukan waktu 0.07 detik. Query dapat dioptimalkan dengan hanya mengambil kolom-kolom yang diperlukan daripada mengambil seluruh kolom dengan menggunakan * dan menggunakan indeks yang sesuai. Berikut adalah query yang dioptimalkan dengan hasil 0.00 detik :
SELECT players.nama, players.goals, negara.nama_negara, teams.nama_team FROM players
JOIN negara
ON players.country_id = negara.id LEFT JOIN teams
ON players.previous_team_id = teams.id WHERE players.goals > 10
Aljabar Relasionalnya:
π nama, goals, nama_negara, nama_team (σ (goals > 10) (players ⨝ country) ⨝ teams)
Hasil setelah query dioptimasi:
Selain itu, dapat pula membuat indeks pada kolom goals, country_id, dan previous_team_id agar pemrosesan query lebih cepat dengan perintah:
CREATE INDEX idx_goals ON players (goals);
CREATE INDEX idx_country_id ON players (country_id);
CREATE INDEX idx_previous_team_id ON players (previous_team_id);
2. Query kedua yaitu menampilkan nama pemain dan negara asalnya, yang goal-nya terbanyak di antara pemain dengan tinggi yang sama:
Query sebelum optimasi:
SELECT p.nama, n.nama_negara, p.goals FROM players p
JOIN negara n
ON p.country_id = n.id WHERE p.goals = ( SELECT MAX(goals) FROM players
WHERE height = p.height )
ORDER BY p.height ASC;
Aljabar Relasional:
σ p.goals = max_goals (ρ p (players) ⨝ n) WHERE max_goals = (π max(goals) (σ height = p1.height (ρ p1 (players)))) ⨝ n) ORDER BY p.height ASC;
Hasil di MySQL:
Salah satu cara untuk mengoptimalkan query tersebut adalah dengan menggunakan subquery dalam bentuk join daripada menggunakan subquery dalam WHERE clause untuk menghindari pemrosesan data yang lama jika datanya dalam skala besar. Berikut adalah contoh query yang lebih optimal:
SELECT p.nama, n.nama_negara, p.goals FROM players p
JOIN negara n ON p.country_id = n.id JOIN (
SELECT height, MAX(goals) AS max_goals FROM players
GROUP BY height
) pg ON p.height = pg.height AND p.goals = pg.max_goals ORDER BY p.height ASC;
Dalam query ini, subquery digunakan untuk mencari nilai maksimum dari goals untuk setiap tinggi. Subquery ini digabungkan dengan tabel players menggunakan join pada tinggi dan nilai maksimum goals. Ini menghindari penggunaan subquery dalam WHERE clause dan juga menghindari pengulangan pemrosesan subquery untuk setiap baris dalam tabel players.
Aljabar Relasional:
π p.nama, n.nama_negara, p.goals (ρ p (players) ⨝ n ⨝ (σ max_goals = p.goals (ρ pg (π height, MAX(goals) AS max_goals (players) ⨝ ρ p1 (players) ⨝
(height=p1.height)))) ⨝ (p.height=pg.height)) ORDER BY p.height ASC;
3. Menampilkan nama pemain, jumlah gol, dan rata-rata tinggi pemain dari setiap negara yang memiliki pemain lebih dari satu, diurutkan berdasarkan rata-rata tinggi pemain secara menurun dengan query sebagai berikut:
SELECT p.nama, p.goals, AVG(p.height) AS rata_tinggi, n.nama_negara FROM players p
JOIN negara n ON p.country_id = n.id WHERE n.id IN (
SELECT country_id FROM players GROUP BY country_id HAVING COUNT(*) > 1 )
GROUP BY n.nama_negara, p.nama, p.goals ORDER BY rata_tinggi DESC;
Aljabar Relasionalnya:
π p.nama, p.goals, AVG(p.height) AS rata_tinggi, n.nama_negara ( σ n.id IN (π country_id (γ COUNT(*)>1 (players))) (players p ⋈ n.id = p.country_id negara n
)) GROUP BY n.nama_negara, p.nama, p.goals ORDER BY rata_tinggi DESC;
Query tersebut belum optimal karena memerlukan waktu pemrosesan 0.07 detik. Query tersebut bisa dioptimalkan dengan menggunakan subquery atau join daripada menggunakan subquery dalam kondisi WHERE. Berikut adalah contoh query yang dioptimalkan:
SELECT p.nama, p.goals, AVG(p.height) AS rata_tinggi, n.nama_negara FROM players p
JOIN negara n ON p.country_id = n.id JOIN (
SELECT country_id FROM players GROUP BY country_id HAVING COUNT(*) > 1 ) c ON n.id = c.country_id
GROUP BY n.nama_negara, p.nama, p.goals ORDER BY rata_tinggi DESC;
Aljabar Relasionalnya:
π p.nama, p.goals, AVG(p.height) AS rata_tinggi, n.nama_negara (players p ⋈ n.id = p.country_id negara n ⋈ (π country_id (γ COUNT(*)>1 (players))) ON n.id = country_id) GROUP BY n.nama_negara, p.nama, p.goals ORDER BY rata_tinggi DESC;
Dan berikut adalah hasil yang ditampilkan dengan waktu pemrosesan 0.00 detik
Dalam query ini, subquery diganti dengan join ke tabel players yang sudah di-group berdasarkan country_id. Dengan menggunakan join, kita mengurangi jumlah perulangan data dalam query dan meningkatkan efisiensi kueri. Dan hasil yang ditampilakan dalam pemrosesan query tersebut memerlukan waktu 0.00 second