Modul 7: Union, Intersection, dan Except - informatika-itts/modul-perancangan-basis-data GitHub Wiki

Setup

  • Download file berikut ini: Database Modul 7
  • Buat database modul7 dan import file yang telah didownload

1. Union

Group 4

UNION digunakan untuk menggabungkan hasil dari beberapa pernyataanselect menjadi satu set hasil tunggal. Secara default, union akan mengembalikan nilai DISTINCT, jika ingin mengembalikan nilai yang duplikat gunakan UNION ALL.

SELECT ...
[UNION [ALL | DISTINCT] 
SELECT ...
[UNION [ALL | DISTINCT] 
SELECT ...]
[ORDER BY column(s)]

Nama kolom dari pernyataan select pertama akan digunakan sebagai nama kolom yang dikembalikan nilainya.

SELECT id_pembeli AS 'Ini Tabel 1' FROM pembeli
UNION
SELECT pembeli_id AS 'Ini Tabel 2' FROM pembelian

Output:

demo1

UNION memiliki aturan yaitu jumlah kolom pada setiap pernyataan select harus sama. Berikut adalah contoh penggunaan UNION yang salah.

SELECT id_produk, judul_produk FROM produk
UNION
SELECT produk_id FROM pembelian

Contoh penggunaan UNION dengan klausa WHERE.

SELECT 'Pembeli' AS TYPE, 
CONCAT (nama_depan,' ',nama_belakang) AS 'Nama' FROM pembeli
WHERE id_pembeli BETWEEN 1 AND 5

UNION

SELECT 'Penjual' AS TYPE,
CONCAT (nama_depan,' ',nama_belakang) FROM penjual
WHERE id_penjual BETWEEN 1 AND 5

ORDER BY Nama ASC;

Output:

demo2

2. Intersection

Intersection

Berbeda dengan UNION yang menggabungkan seluruh hasil yang diperoleh dari pernyataan select. INTERSECT digunakan untuk mengembalikan semua records yang sama pada seluruh pernyataan select.

(SELECT ...
[INTERSECT [ALL | DISTINCT] 
SELECT ...
[INTERSECT [ALL | DISTINCT] 
SELECT ...])
[ORDER BY column(s)]

Nama kolom dari pernyataan select pertama akan digunakan sebagai nama kolom yang dikembalikan nilainya.

SELECT id_pembeli AS 'Ini Tabel 1' FROM pembeli
INTERSECT
SELECT pembeli_id AS 'Ini Tabel 2' FROM pembelian

Output:

demo3

Contoh penggunaan INTERSECT dengan klausa WHERE.

(SELECT tanggal_lahir FROM penjual
WHERE YEAR(tanggal_lahir) > 1980)
INTERSECT
(SELECT tanggal_lahir FROM pembeli
WHERE YEAR(tanggal_lahir) > 1980)

Output:

demo4

Meskipun menghasilkan record yang sama seperti INNER JOIN dikebanyakan kasus, INTERSECT dan INNER JOIN sangatlah berbeda, berikut adalah perbedaan INTERSECT dan INNER JOIN.

  1. Hasil yang dikembalikan.

    INTERSECT mengembalikan irisan records yang sama dari 2 atau lebih pernyataan select. INNER JOIN mengembalikan irisan records yang sama dari 2 atau lebih tabel yang digabungkan. Jadi, INTERSECT membandingkan baris-baris dari beberapa hasil select, sedangkan INNER JOIN membandingkan baris-baris dari beberapa tabel.

  2. INTERSECT melakukan perbandingan pada semua kolom, INNER JOIN melakukan perbandingan pada kolom yang ditentukan.

    INNER JOIN hanya akan membandingkan baris-baris dari kolom tanggal lahir karena pengkondisiannya hanya dilakukan untuk kolom tanggal_lahir.

SELECT pb.tanggal_lahir, pb.nama_depan 
FROM pembeli pb
INNER JOIN penjual pj
ON pb.tanggal_lahir = pj.tanggal_lahir; #kondisi

Output:

demo5

INTERSECT akan membandingkan seluruh baris-baris dari kedua pernyataan select tanpa harus menambahkan suatu pengkondisian.

(SELECT nama_depan, tanggal_lahir FROM penjual)
INTERSECT
(SELECT nama_depan, tanggal_lahir FROM pembeli)

Output:

demo6

  1. INTERSECT tidak mengembalikan nilai duplikat, sedangkan INNER JOIN mengembalikan nilai duplikat. Pada INNER JOIN untuk menghilangkan hasil yang duplikat kita dapat menggunakan DISTINCT.
  2. INTERSECT mengembalikan nilai NULL, sedangkan INNER JOIN tidak.

3. Except

EXCEPT pada MariaDB digunakan untuk mengambil records dari hasil pertama dari pernyataan SELECT, tetapi tidak termasuk records yang ada di hasil kedua dari pernyataan SELECT.

(SELECT ...
[EXCEPT [ALL | DISTINCT] 
SELECT ...
[EXCEPT [ALL | DISTINCT] 
SELECT ...])
[ORDER BY column(s)]

Contoh penggunaan EXCEPT:

SELECT id_pembeli FROM pembeli
WHERE id_pembeli <= 10
EXCEPT
SELECT id_penjual FROM penjual
WHERE id_penjual >5;

Output:

Screenshot 2023-11-13 235348

Beberapa hal penting yang perlu diperhatikan tentang EXCEPT:

  • Jumlah kolom pada kedua pernyataan SELECT harus sama.
  • Hasil EXCEPT akan menghilangkan nilai duplikat.
  • EXCEPT mengembalikan records yang ada di hasil pertama, tetapi tidak ada di hasil kedua.
  • Hasil EXCEPT tidak mengembalikan nilai NULL.

MariaDB Documentation :

Penugasan

1. Bantu elang menyempurnakan algoritmanya!

Group_3

Elang merupakan seorang AI Engineer pada suatu platform toko online. Ia ditugaskan untuk membuat suatu algoritma yang dapat meningkatkan penjualan pada toko online tersebut.

Elang berfikir untuk membuat suatu algoritma yang dapat lebih sering menampilkan barang paling sering dibeli

Jika pembeli dengan jenis kelamin laki-laki lebih suka membeli barang mouse, maka pembeli baru atau pembeli lama yang berjenis kelamin laki laki pada beranda aplikasi toko onlinenya akan ditampilkan lebih banyak produk mouse. Begitu pula dengan jenis kelamin perempuan

dan akan mengurangi untuk menampilkan barang yang paling jarang dibeli

jika jenis kelamin perempuan jarang beli topi maka diberanda pembeli yang berjenis kelamin perempuan akan menampilkan lebih sedikit produk topi. Begitu pula dengan jenis kelamin laki-laki

Untuk menyempurnakan algoritma buatannya, Elang ingin mengetahui barang apa yang paling sering dan paling jarang dibeli oleh laki-laki serta yang paling sering dan paling jarang dibeli oleh perempuan. Bantu Elang untuk menemukan apa yang ia butuhkan untuk menyempurnakan algoritmanya.

output

Screenshot_2023-11-13_191031

2. Bantu yuli agar tidak dimarahin atasannya!

Group_2_(2)

Yuli sebagai admin toko online diberi tugas oleh atasannya untuk mencari penjual yang aktif melakukan transaksi dan memiliki rating toko yang baik selama 2 bulan belakangan (Oktober dan November). Bantu Yuli untuk menemukan penjual yang setiap bulannya dapat menjual lebih dari 20 barang dan memiliki rating toko lebih dari 3.

output

Screenshot_2023-11-13_190957

3. Bantuin DonGGGGGGGG!!!

Terdapat soal seperti berikut :

Group_2

tampilkan pembeli yang tidak menilai produknya

pada soal diatas diwajibkan untuk mahasiswa menggunakan query except yang telah diajarkan pada modul. dengan hasil query sebagai berikut :

select concat(nama_depan, ' ', nama_belakang) as nama, judul_produk, jumlah_pembelian, (jumlah_pembelian * produk.harga_produk) as total_biaya_pembelian from pembeli
inner join pembelian on pembeli.id_pembeli = pembelian.pembeli_id
inner join produk on pembelian.produk_id = produk.id_produk
except
select concat(nama_depan, ' ', nama_belakang) as nama, judul_produk, jumlah_pembelian, (jumlah_pembelian * produk.harga_produk) as total_biaya_pembelian from pembeli
inner join pembelian on pembeli.id_pembeli = pembelian.pembeli_id
inner join produk on pembelian.produk_id = produk.id_produk
inner join penilaian p on pembelian.id_pembelian = p.pembelian_id
order by nama asc;

dengan hasil output sebagai berikut :

Screenshot_2023-11-13_203415

Screenshot_2023-11-13_203426

total row yang didapat adalah 197 row atau baris.

padahal jika kita lihat pada banyak row select bagian atas

select concat(nama_depan, ' ', nama_belakang) as nama, judul_produk, jumlah_pembelian, (jumlah_pembelian * produk.harga_produk) as total_biaya_pembelian from pembeli
inner join pembelian on pembeli.id_pembeli = pembelian.pembeli_id
inner join produk on pembelian.produk_id = produk.id_produk

terdapat 583 row

Screenshot_2023-11-13_203832

sedangkan select bagian bawah

select concat(nama_depan, ' ', nama_belakang) as nama, judul_produk, jumlah_pembelian, (jumlah_pembelian * produk.harga_produk) as total_biaya_pembelian from pembeli
inner join pembelian on pembeli.id_pembeli = pembelian.pembeli_id
inner join produk on pembelian.produk_id = produk.id_produk
inner join penilaian p on pembelian.id_pembelian = p.pembelian_id

terdapat 385 row

Screenshot_2023-11-13_203940

padahal konsep except adalah ( jumlah row select bagian atas ) - ( jumlah row select bagian bawah ) jadi jika menganut tersebut maka 583 - 385 = 198 row. Maka seharusnya data yang tampil pada hasil except tadi adalah 198 row, tetapi yang terjadi adalah hanya muncul sebanyak 197 row.

jika kamu menyimak dan mengerjakan modul 4 terdapat soal yang sama persis dengan jawaban sebagai berikut :

SELECT
    CONCAT(pembeli.nama_depan, ' ', pembeli.nama_belakang) AS nama,
    produk.judul_produk,
    pembelian.jumlah_pembelian,
    (pembelian.jumlah_pembelian * produk.harga_produk) AS total_biaya_pembelian
FROM
    pembeli
INNER JOIN pembelian ON pembeli.id_pembeli = pembelian.pembeli_id
INNER JOIN produk ON pembelian.produk_id = produk.id_produk
LEFT JOIN penilaian p ON pembelian.id_pembelian = p.pembelian_id
WHERE
    p.pembelian_id IS NULL
order by nama asc;

pada query diatas akan menghasilkan 198 row juga untuk barang dan orang yang pembeliannya tidak terdapat penilaiaan. namun jika query except hanya menampilkan 197 row untuk barang dan orang yang pembeliannya tidak terdapat penilaiaan.

Analisislah!

  • apa masalah dari query except atau data dari database tersebut
  • berikann bukti masalah apa yang terdapat pada query atau data tersebut
  • berikan solusi agar query except tersebut dapat menampilkan 198 row
  • berikan alasan atau bukti dari solusi yang kamu berikan (kenapa menggunakan solusi itu untuk menangani masalah itu)