# Latihan

### Soal Cerita

Saat ini kamu sedang bekerja disebuah toko komputer yang bernama **"sehat com - toko komputer serba ada"** sebaagain seorang programmer. Kamu diminta untuk membuat sebuah penyimpnan data yang mana data ini akan disimpan didalam sebuah database. Manager kamu sudah memberikan data contoh yang akan diinput ke dalam database seperti dibawah ini:

#### Contoh Tabel Barang

| No | Nama Barang                               | Kuantitas | Harga Modal (IDR) | Harga Jual (IDR) | Tanggal    |
| -- | ----------------------------------------- | --------- | ----------------- | ---------------- | ---------- |
| 1  | Logitech MX Master 3                      | 15        | 1.000.000         | 1.299.000        | 01-08-2024 |
| 2  | Razer DeathAdder V2                       | 10        | 800.000           | 999.000          | 05-08-2024 |
| 3  | Corsair Dark Core RGB SE                  | 8         | 1.200.000         | 1.499.000        | 10-08-2024 |
| 4  | SteelSeries Rival 3                       | 12        | 700.000           | 899.000          | 12-08-2024 |
| 5  | Logitech G502 Hero                        | 14        | 1.100.000         | 1.399.000        | 03-08-2024 |
| 6  | HyperX Pulsefire FPS Pro                  | 10        | 950.000           | 1.199.000        | 07-08-2024 |
| 7  | Razer Naga X                              | 9         | 850.000           | 1.100.000        | 15-08-2024 |
| 8  | Glorious Model O                          | 11        | 1.000.000         | 1.299.000        | 09-08-2024 |
| 9  | Cooler Master MM710                       | 10        | 850.000           | 1.100.000        | 13-08-2024 |
| 10 | Logitech G Pro X Superlight               | 8         | 1.400.000         | 1.799.000        | 06-08-2024 |
| 11 | Corsair K95 RGB Platinum                  | 10        | 2.000.000         | 2.499.000        | 03-08-2024 |
| 12 | Razer BlackWidow V3                       | 12        | 1.800.000         | 2.199.000        | 09-08-2024 |
| 13 | Logitech G Pro X                          | 14        | 1.500.000         | 1.799.000        | 12-08-2024 |
| 14 | Ducky One 2 Mini                          | 8         | 1.200.000         | 1.499.000        | 10-08-2024 |
| 15 | HyperX Alloy FPS Pro                      | 11        | 1.000.000         | 1.299.000        | 07-08-2024 |
| 16 | SteelSeries Apex Pro                      | 9         | 1.800.000         | 2.199.000        | 06-08-2024 |
| 17 | Logitech G815 RGB                         | 10        | 1.600.000         | 1.999.000        | 15-08-2024 |
| 18 | Razer Huntsman Elite                      | 8         | 2.200.000         | 2.699.000        | 01-08-2024 |
| 19 | Ducky One 3 SF                            | 7         | 1.500.000         | 1.799.000        | 12-08-2024 |
| 20 | Corsair K70 RGB MK.2                      | 6         | 1.800.000         | 2.299.000        | 08-08-2024 |
| 21 | Dell UltraSharp U2720Q                    | 5         | 5.500.000         | 6.500.000        | 07-08-2024 |
| 22 | Asus ROG Swift PG259QN                    | 6         | 12.000.000        | 13.499.000       | 15-08-2024 |
| 23 | Samsung Odyssey G7                        | 7         | 7.500.000         | 8.999.000        | 03-08-2024 |
| 24 | LG UltraWide 34WK95U                      | 8         | 8.000.000         | 9.499.000        | 10-08-2024 |
| 25 | AOC CQ32G1                                | 10        | 4.000.000         | 4.999.000        | 06-08-2024 |
| 26 | MSI Optix MAG272CQR                       | 9         | 4.500.000         | 5.499.000        | 14-08-2024 |
| 27 | BenQ ZOWIE XL2546                         | 5         | 6.500.000         | 7.999.000        | 11-08-2024 |
| 28 | Acer Predator X34                         | 6         | 9.500.000         | 10.999.000       | 13-08-2024 |
| 29 | ViewSonic Elite XG270QG                   | 7         | 7.000.000         | 8.499.000        | 04-08-2024 |
| 30 | Philips 345B1C                            | 8         | 5.000.000         | 6.000.000        | 02-08-2024 |
| 31 | Lenovo LOQ Gaming i5-12450HX              | 9         | 10.500.000        | 11.999.000       | 13-08-2024 |
| 32 | LENOVO LOQ 15IRX9 i7-13650HX RTX 4060     | 10        | 18.500.000        | 19.699.000       | 10-08-2024 |
| 33 | Asus ROG Zephyrus G16 GU605MV-I946OL7G    | 10        | 39.000.000        | 39.999.000       | 01-08-2024 |
| 34 | Acer Predator Helios 300 PH315-55         | 8         | 21.500.000        | 22.999.000       | 12-08-2024 |
| 35 | MSI Katana GF66 12UE i7-12700H RTX 3050Ti | 5         | 17.000.000        | 18.499.000       | 05-08-2024 |
| 36 | Dell XPS 15 9520 i7-12700H                | 7         | 24.500.000        | 25.999.000       | 15-08-2024 |
| 37 | Gigabyte AERO 16 XE5 i9-12900H RTX 3080   | 6         | 39.500.000        | 41.999.000       | 09-08-2024 |
| 38 | Razer Blade 15 i7-12800H RTX 3070Ti       | 4         | 45.000.000        | 46.999.000       | 08-08-2024 |
| 39 | Asus TUF Gaming F15 i7-12700H RTX 3060    | 9         | 15.500.000        | 16.999.000       | 14-08-2024 |
| 40 | HP Omen 16 Ryzen 9 5900HX RTX 3070        | 5         | 29.000.000        | 30.999.000       | 07-08-2024 |
| 41 | Lenovo ThinkPad X1 Carbon Gen 9 i7-1185G7 | 8         | 28.500.000        | 30.499.000       | 01-08-2024 |
| 42 | Asus ExpertBook B9 i7-1165G7              | 5         | 26.000.000        | 27.999.000       | 15-08-2024 |
| 43 | Dell Latitude 7420 i7-1185G7              | 9         | 22.500.000        | 23.999.000       | 12-08-2024 |
| 44 | MacBook Air M1 2020                       | 6         | 18.500.000        | 19.999.000       | 03-08-2024 |
| 45 | Lenovo Yoga Slim 7i Carbon i5-1135G7      | 8         | 16.000.000        | 17.499.000       | 14-08-2024 |
| 46 | HP Spectre x360 14 i7-1165G7              | 5         | 22.000.000        | 23.499.000       | 05-08-2024 |
| 47 | Acer Spin 5 i7-1165G7                     | 7         | 18.000.000        | 19.499.000       | 09-08-2024 |
| 48 | MSI Prestige 14 Evo i7-1185G7             | 6         | 22.500.000        | 23.999.000       | 11-08-2024 |
| 49 | Asus VivoBook S14 i5-1135G7               | 9         | 12.500.000        | 13.999.000       | 02-08-2024 |
| 50 | Dell XPS 13 9310 i7-1165G7                | 4         | 25.500.000        | 27.499.000       | 07-08-2024 |
| 51 | Origin EON15-X                            | 1         | 6.000.000         | 6.500.000        | 01-07-2020 |
| 52 | MSI GT80 Titan                            | 1         | 6.300.000         | 6.800.000        | 01-07-2020 |

### Latihan 1:  Membuat Database

Buatlah database dengana database:

```sql
CREATE DATABASE sehat_com_db;
USE sehat_com_db;
```

### Latihan 2: Buatlah Tabel Barang

Kemudian buatlah sebuat tabel dengan nama tbl\_barang:

```sql
CREATE TABLE tbl_barang (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nama_barang VARCHAR(255) NOT NULL,
    kuantitas INT NOT NULL,
    harga_modal DECIMAL(15,2) NOT NULL,
    harga_jual DECIMAL(15,2) NOT NULL,
    tanggal DATE NOT NULL
);

// gunakan query ini untuk melihat property di dalam tabel
DESCRIBE tbl_barang;
```

### Latihan 3: Insert Data

<pre class="language-sql"><code class="lang-sql">INSERT INTO tbl_barang (nama_barang, kuantitas, harga_modal, harga_jual, tanggal) VALUES
('Logitech MX Master 3', 15, 1000000.00, 1299000.00, '2024-08-01'),
('Razer DeathAdder V2', 10, 800000.00, 999000.00, '2024-08-05'),
('Corsair Dark Core RGB SE', 8, 1200000.00, 1499000.00, '2024-08-10'),
('SteelSeries Rival 3', 12, 700000.00, 899000.00, '2024-08-12'),
('Logitech G502 Hero', 14, 1100000.00, 1399000.00, '2024-08-03'),
('HyperX Pulsefire FPS Pro', 10, 950000.00, 1199000.00, '2024-08-07'),
('Razer Naga X', 9, 850000.00, 1100000.00, '2024-08-15'),
('Glorious Model O', 11, 1000000.00, 1299000.00, '2024-08-09'),
('Cooler Master MM710', 10, 850000.00, 1100000.00, '2024-08-13'),
('Logitech G Pro X Superlight', 8, 1400000.00, 1799000.00, '2024-08-06');

INSERT INTO tbl_barang (nama_barang, kuantitas, harga_modal, harga_jual, tanggal) VALUES
('Corsair K95 RGB Platinum', 10, 2000000.00, 2499000.00, '2024-08-03'),
('Razer BlackWidow V3', 12, 1800000.00, 2199000.00, '2024-08-09'),
('Logitech G Pro X', 14, 1500000.00, 1799000.00, '2024-08-12'),
('Ducky One 2 Mini', 8, 1200000.00, 1499000.00, '2024-08-10'),
('HyperX Alloy FPS Pro', 11, 1000000.00, 1299000.00, '2024-08-07'),
('SteelSeries Apex Pro', 9, 1800000.00, 2199000.00, '2024-08-06'),
('Logitech G815 RGB', 10, 1600000.00, 1999000.00, '2024-08-15'),
('Razer Huntsman Elite', 8, 2200000.00, 2699000.00, '2024-08-01'),
('Ducky One 3 SF', 7, 1500000.00, 1799000.00, '2024-08-12'),
('Corsair K70 RGB MK.2', 6, 1800000.00, 2299000.00, '2024-08-08');

INSERT INTO tbl_barang (nama_barang, kuantitas, harga_modal, harga_jual, tanggal) VALUES
('Dell UltraSharp U2720Q', 5, 5500000.00, 6500000.00, '2024-08-07'),
('Asus ROG Swift PG259QN', 6, 12000000.00, 13499000.00, '2024-08-15'),
('Samsung Odyssey G7', 7, 7500000.00, 8999000.00, '2024-08-03'),
('LG UltraWide 34WK95U', 8, 8000000.00, 9499000.00, '2024-08-10'),
('AOC CQ32G1', 10, 4000000.00, 4999000.00, '2024-08-06'),
('MSI Optix MAG272CQR', 9, 4500000.00, 5499000.00, '2024-08-14'),
('BenQ ZOWIE XL2546', 5, 6500000.00, 7999000.00, '2024-08-11'),
('Acer Predator X34', 6, 9500000.00, 10999000.00, '2024-08-13'),
('ViewSonic Elite XG270QG', 7, 7000000.00, 8499000.00, '2024-08-04'),
('Philips 345B1C', 8, 5000000.00, 6000000.00, '2024-08-02');

INSERT INTO tbl_barang (nama_barang, kuantitas, harga_modal, harga_jual, tanggal) VALUES
('Lenovo LOQ Gaming i5-12450HX', 9, 10500000.00, 11999000.00, '2024-08-13'),
('LENOVO LOQ 15IRX9 i7-13650HX RTX 4060', 10, 18500000.00, 19699000.00, '2024-08-10'),
('Asus ROG Zephyrus G16 GU605MV-I946OL7G', 10, 39000000.00, 39999000.00, '2024-08-01'),
('Acer Predator Helios 300 PH315-55', 8, 21500000.00, 22999000.00, '2024-08-12'),
('MSI Katana GF66 12UE i7-12700H RTX 3050Ti', 5, 17000000.00, 18499000.00, '2024-08-05'),
('Dell XPS 15 9520 i7-12700H', 7, 24500000.00, 25999000.00, '2024-08-15'),
('Gigabyte AERO 16 XE5 i9-12900H RTX 3080', 6, 39500000.00, 41999000.00, '2024-08-09'),
('Razer Blade 15 i7-12800H RTX 3070Ti', 4, 45000000.00, 46999000.00, '2024-08-08'),
('Asus TUF Gaming F15 i7-12700H RTX 3060', 9, 15500000.00, 16999000.00, '2024-08-14'),
('HP Omen 16 Ryzen 9 5900HX RTX 3070', 5, 29000000.00, 30999000.00, '2024-08-07');

<strong>INSERT INTO tbl_barang (nama_barang, kuantitas, harga_modal, harga_jual, tanggal) VALUES
</strong>('Lenovo ThinkPad X1 Carbon Gen 9 i7-1185G7', 8, 28500000.00, 30499000.00, '2024-08-01'),
('Asus ExpertBook B9 i7-1165G7', 5, 26000000.00, 27999000.00, '2024-08-15'),
('Dell Latitude 7420 i7-1185G7', 9, 22500000.00, 23999000.00, '2024-08-12'),
('MacBook Air M1 2020', 6, 18500000.00, 19999000.00, '2024-08-03'),
('Lenovo Yoga Slim 7i Carbon i5-1135G7', 8, 16000000.00, 17499000.00, '2024-08-14'),
('HP Spectre x360 14 i7-1165G7', 5, 22000000.00, 23499000.00, '2024-08-05'),
('Acer Spin 5 i7-1165G7', 7, 18000000.00, 19499000.00, '2024-08-09'),
('MSI Prestige 14 Evo i7-1185G7', 6, 22500000.00, 23999000.00, '2024-08-11'),
('Asus VivoBook S14 i5-1135G7', 9, 12500000.00, 13999000.00, '2024-08-02'),
('Dell XPS 13 9310 i7-1165G7', 4, 25500000.00, 27499000.00, '2024-08-07'),
('Origin EON15-X', 1, 6000000.00, 6500000.00, '2020-07-01'),
('MSI GT80 Titan', 1, 6300000.00, 6800000.00, '2020-07-01');
</code></pre>

Untuk menampilkan data yang sudah di insert bisa menggunakan query berikut ini:

```sql
SELECT * FROM tbl_barang;
```

Maka akan menampilkan data seperti dibawah ini:

<figure><img src="https://content.gitbook.com/content/5AcUmP9Yd1zMjJs3LncX/blobs/7usBTAjbFAEfsJLktG4v/Screenshot%202024-08-28%20at%2006.59.11.png" alt=""><figcaption></figcaption></figure>

### Latihan 4: Update Data

Selanjutnya ubahlah data seperti contoh dibawah ini:

* Corsair K95 RGB Platinum ubah kuantitinya menjadi 20&#x20;
* Dell UltraSharp U2720Q ubah harga jual nya menjadi 7.000.000&#x20;
* BenQ ZOWIE XL2546 ubah tanggal input menjadi 2024 - 07 - 30&#x20;

<pre class="language-sql"><code class="lang-sql">-- Update kuantitas untuk 'Corsair K95 RGB Platinum'
UPDATE tbl_barang
SET kuantitas = 20
WHERE nama_barang = 'Corsair K95 RGB Platinum';

-- Update harga jual untuk 'Dell UltraSharp U2720Q'
UPDATE tbl_barang
SET harga_jual = 7000000.00
WHERE nama_barang = 'Dell UltraSharp U2720Q';

-- Update tanggal untuk 'BenQ ZOWIE XL2546'
UPDATE tbl_barang
SET tanggal = '2024-07-30'
<strong>WHERE nama_barang = 'BenQ ZOWIE XL2546';
</strong></code></pre>

### Latihan 5: Menampilkan Data  Setelah di Update

Sekarang coba tampilkan data yang sudah di update dengan menggunakan query dibawah ini:

{% code overflow="wrap" %}

```sql
select * from tbl_barang WHERE nama_barang = 'Corsair K95 RGB Platinum'or nama_barang = 'Dell UltraSharp U2720Q' or nama_barang = 'BenQ ZOWIE XL2546';
```

{% endcode %}

Maka akan menampilkan data seperti ini:<br>

<figure><img src="https://content.gitbook.com/content/5AcUmP9Yd1zMjJs3LncX/blobs/sqwYe9CYrzLwe2dsyenS/Screenshot%202024-08-28%20at%2006.40.27.png" alt=""><figcaption></figcaption></figure>

### Latihan 6: Menampilkan Total Kuantitas Semua Barang

Setelah kita sudah berhasil melakukan update terhadap tabel `tbl_barang` selanjutnya kita di minta untuk menampilkan total dari kuantitas. Untuk menampilkan total dari kuantitas dari semua barang bisa menggunakan query berikut ini:

```sql
SELECT SUM(kuantitas) AS total_kuantitas FROM tbl_barang;
```

Maka akan menghasilkan tampilan seperti berikut ini:

<figure><img src="https://content.gitbook.com/content/5AcUmP9Yd1zMjJs3LncX/blobs/ofSVLXZ9eOJha7rYPzpg/Screenshot%202024-08-28%20at%2006.54.57.png" alt=""><figcaption></figcaption></figure>

**Penjelasan:**

1. **`SELECT`**:
   * Bagian ini digunakan untuk memilih data dari tabel dalam database. Kata kunci `SELECT` menunjukkan bahwa kita akan mengambil data dari tabel `tbl_barang`.
2. **`SUM(kuantitas)`**:
   * Fungsi `SUM()` digunakan untuk menjumlahkan semua nilai di kolom `kuantitas`. Dalam konteks ini, `SUM(kuantitas)` akan menghitung total keseluruhan dari semua nilai `kuantitas` di dalam tabel `tbl_barang`.
3. **`AS total_kuantitas`**:
   * Kata kunci `AS` digunakan untuk memberi nama alias pada hasil dari fungsi `SUM(kuantitas)`. Dalam hal ini, hasil penjumlahan semua nilai `kuantitas` akan diberi nama alias `total_kuantitas`. Nama alias ini digunakan untuk memudahkan identifikasi kolom hasil ketika output ditampilkan.
4. **`FROM tbl_barang`**:
   * Bagian ini menunjukkan dari mana data tersebut diambil. `tbl_barang` adalah nama tabel dari mana data akan dipilih.

### Latihan 7: Manampilkan Barang dengan Kuantitas Tertinggi

Sekarang kita diminta untuk nampilkan 5 data kuantitas barang yang paling banyak. Untuk menampilkan 5 barang dengan kuntitas terbanyak kita bisa menggunakan query berikut ini:

```sql
SELECT nama_barang, kuantitas FROM tbl_barang ORDER BY kuantitas DESC LIMIT 5;
```

Maka akan menghasil tampilan seperti ini:

<figure><img src="https://content.gitbook.com/content/5AcUmP9Yd1zMjJs3LncX/blobs/3zvPOWlE9oGcUxY5JfYi/Screenshot%202024-08-28%20at%2006.52.47.png" alt=""><figcaption></figcaption></figure>

**Penjelasan:**

1. **`SELECT nama_barang, kuantitas`**:
   * Bagian ini digunakan untuk memilih kolom `nama_barang` dan `kuantitas` dari tabel `tbl_barang`. Query ini akan mengembalikan nilai-nilai dari kolom `nama_barang` (nama barang) dan `kuantitas` (jumlah barang).
2. **`FROM tbl_barang`**:
   * Menunjukkan tabel `tbl_barang` sebagai sumber data. Semua data yang dipilih berasal dari tabel ini.
3. **`ORDER BY kuantitas DESC`**:
   * Mengurutkan hasil berdasarkan kolom `kuantitas` dalam urutan menurun (descending). Ini berarti bahwa barang dengan kuantitas terbesar akan muncul terlebih dahulu dalam hasil. Kata kunci `DESC` singkatan dari "descending" atau menurun.
4. **`LIMIT 5`**:
   * Membatasi hasil query hanya pada 5 baris pertama. Jadi, hanya 5 barang dengan kuantitas terbesar yang akan ditampilkan.

### Latihan 8: Delete Data

Selanjutnya kita mendapatkan kabar bahwa ada 2 barang yang sudah tidak ada didalam gudang, barang tersebut adalah **Origin EON15-X** dan **MSI GT80 Titan** yang sudah laku terjual. Jadi kita diminta untuk menghapus 2 barang tersebut dari database. Untuk menghapus data tersebut manager meminta kita menghapusnya berdasarkan ID dengan ketentuan seperti dibawah ini:

* Hapus barang dengan nomor ID 51 dan 52 karena barang tersebut sudah laku terjual

Untuk menghapus data berdasarkan ID kita bisa menggunakan query berikut ini:

```sql
DELETE FROM tbl_barang where id = 51;

DELETE FROM tbl_barang where id = 52;
```

Untuk memastikan apakah data tersebut sudah terhapus kita bisa menggunakan query berikut ini:

```sql
SELECT * FROM tbl_barang WHERE id = 51 or id = 52;
```

Jika tidak menampilkan data apapun maka data sudah berhasil dihapus.

### Latihan 9: Menampilkan Total Kuantitas Barang  Berdasarkan Bulan

Selanjut manager kita meminta kita untuk menampilkan total kuantitas barang berdasarkan bulan. Untuk manampilkan total kuantitas barang berdasarkan bulan bisa menggunakan query berikut ini:

```sql
SELECT 
    DATE_FORMAT(tanggal, '%Y-%m') AS bulan,
    SUM(kuantitas) AS total_kuantitas 
FROM 
    tbl_barang 
GROUP BY 
    DATE_FORMAT(tanggal, '%Y-%m')
ORDER BY 
    bulan;
```

Maka akan menampilkan data seperti berikut ini:

<figure><img src="https://content.gitbook.com/content/5AcUmP9Yd1zMjJs3LncX/blobs/JkiZCGlld3kWk6mT8mzg/Screenshot%202024-08-28%20at%2007.33.24.png" alt=""><figcaption></figcaption></figure>

**Penjelasan:**

1. **`SELECT`**:
   * Bagian ini digunakan untuk memilih kolom yang ingin ditampilkan dari tabel `tbl_barang`.
2. **`DATE_FORMAT(tanggal, '%Y-%m') AS bulan`**:
   * Fungsi `DATE_FORMAT` digunakan untuk memformat kolom `tanggal` agar hanya menampilkan tahun (`%Y`) dan bulan (`%m`). Contohnya, jika `tanggal` adalah `2024-08-28`, fungsi ini akan mengubahnya menjadi `2024-08`.
   * Hasil dari fungsi ini diberi alias `bulan`, sehingga dalam hasil query, kolom yang menunjukkan bulan akan diberi nama `bulan`.
3. **`SUM(kuantitas) AS total_kuantitas`**:
   * Fungsi `SUM()` digunakan untuk menjumlahkan semua nilai dalam kolom `kuantitas` untuk setiap kelompok data. Dalam hal ini, penjumlahan dilakukan untuk setiap bulan.
   * Hasil penjumlahan ini diberi alias `total_kuantitas`, sehingga dalam hasil query, kolom yang menunjukkan total kuantitas akan diberi nama `total_kuantitas`.
4. **`FROM tbl_barang`**:
   * Bagian ini menunjukkan bahwa data yang diambil berasal dari tabel `tbl_barang`.
5. **`GROUP BY DATE_FORMAT(tanggal, '%Y-%m')`**:
   * `GROUP BY` digunakan untuk mengelompokkan data berdasarkan nilai yang dihasilkan oleh fungsi `DATE_FORMAT`. Artinya, data akan dikelompokkan berdasarkan bulan. Setiap grup akan berisi semua baris data yang jatuh pada bulan yang sama.
   * Penjumlahan `SUM(kuantitas)` akan dilakukan untuk setiap grup (yaitu, untuk setiap bulan).
6. **`ORDER BY bulan`**:
   * Bagian ini mengatur hasil query berdasarkan kolom `bulan`, dari bulan yang paling awal hingga yang paling akhir. Dengan kata lain, hasil akan diurutkan dalam urutan kronologis.

### Latihan 10: Menambah Kolom Baru
