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
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:
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:
2. 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:
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:
Meskipun menghasilkan record yang sama seperti INNER JOIN
dikebanyakan kasus, INTERSECT
dan INNER JOIN
sangatlah berbeda, berikut adalah perbedaan INTERSECT
dan INNER JOIN
.
-
Hasil yang dikembalikan.
INTERSECT
mengembalikan irisan records yang sama dari 2 atau lebih pernyataanselect
.INNER JOIN
mengembalikan irisan records yang sama dari 2 atau lebih tabel yang digabungkan. Jadi,INTERSECT
membandingkan baris-baris dari beberapa hasilselect
, sedangkanINNER JOIN
membandingkan baris-baris dari beberapa tabel. -
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:
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:
INTERSECT
tidak mengembalikan nilai duplikat, sedangkanINNER JOIN
mengembalikan nilai duplikat. PadaINNER JOIN
untuk menghilangkan hasil yang duplikat kita dapat menggunakanDISTINCT
.INTERSECT
mengembalikan nilai NULL, sedangkanINNER 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:
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 :
- https://mariadb.com/kb/en/union/
- https://mariadb.com/kb/en/intersect/
- https://mariadb.com/kb/en/except/
Penugasan
1. Bantu elang menyempurnakan algoritmanya!
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
2. Bantu yuli agar tidak dimarahin atasannya!
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
3. Bantuin DonGGGGGGGG!!!
Terdapat soal seperti berikut :
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 :
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
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
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)