TL;DR
UNION dan UNION ALL sama-sama nggabungin hasil dua query jadi satu. Bedanya: UNION buang baris kembar (duplikat), UNION ALL biarin semua baris. Karena harus ngecek duplikat dulu, UNION lebih lambat dari UNION ALL. Buat gabungin data penjualan lalu dihitung totalnya, pakai UNION ALL biar nggak ada baris asli yang kehapus.
UNION dan UNION ALL beda cuma satu kata. Tapi kata itu bisa bikin angka revenue kamu berubah tanpa kamu sadar.
Dua-duanya dipakai buat nggabungin hasil dari dua query jadi satu tabel. Bedanya di satu hal: UNION buang baris yang kembar, UNION ALL biarin semua baris apa adanya.
Kedengeran sepele, kan? Tapi pas kamu gabungin data penjualan online sama offline terus dijumlahin, salah pilih di sini bisa bikin total penjualan kamu ilang jutaan atau malah dobel.
Apa bedanya UNION dan UNION ALL di SQL?
UNION dan UNION ALL sama-sama numpuk hasil dua query jadi satu ke bawah. Bedanya satu: UNION buang baris yang kembar (duplikat), UNION ALL nampilin semua baris tanpa pilih-pilih. Gara-gara harus ngecek dan nyortir duplikat dulu, UNION jadi lebih lambat. UNION ALL langsung tempel, jadi lebih cepat.
Biar kebayang, ini dua tabel penjualan dari Keripik Juara, UMKM keripik di Bandung. Satu tabel isinya penjualan dari marketplace, satu lagi dari toko fisik.
-- penjualan lewat marketplace
CREATE TABLE penjualan_online (
tanggal TEXT,
produk TEXT,
qty INTEGER,
revenue INTEGER
);
-- penjualan di toko fisik
CREATE TABLE penjualan_offline (
tanggal TEXT,
produk TEXT,
qty INTEGER,
revenue INTEGER
);
INSERT INTO penjualan_online VALUES
('2026-06-01','Keripik Singkong Balado', 10, 250000),
('2026-06-01','Keripik Pisang Coklat', 5, 125000),
('2026-06-02','Keripik Singkong Balado', 8, 200000);
INSERT INTO penjualan_offline VALUES
('2026-06-01','Keripik Singkong Balado', 10, 250000),
('2026-06-01','Keripik Tempe Original', 12, 180000),
('2026-06-02','Keripik Pisang Coklat', 6, 150000);
Perhatiin baris pertama di kedua tabel. Kebetulan sama persis: tanggal 1 Juni, Singkong Balado, 10 pcs, Rp250.000. Tapi ini dua penjualan beneran yang beda, satu di marketplace, satu di toko. Baris kembar inilah yang nanti bikin masalah.
UNION: baris kembar dibuang
Coba gabungin nama produk sama revenue-nya pakai UNION.
SELECT produk, revenue FROM penjualan_online
UNION
SELECT produk, revenue FROM penjualan_offline
ORDER BY produk;
Hasilnya 5 baris. Kombinasi Singkong Balado + 250000 muncul di online dan offline, tapi UNION cuma nyimpen satu. Sisanya dianggap duplikat, langsung dibuang.
UNION ALL: semua baris dipertahanin
SELECT produk, revenue FROM penjualan_online
UNION ALL
SELECT produk, revenue FROM penjualan_offline
ORDER BY produk;
Sekarang hasilnya 6 baris. Kombinasi Singkong Balado Rp250.000 muncul dua kali, sesuai kenyataan di dua tabel tadi. UNION ALL nggak ngapa-ngapain ke datamu, dia cuma numpuk.
| UNION | UNION ALL | |
|---|---|---|
| Baris kembar | Dibuang | Disimpen semua |
| Jumlah baris hasil (contoh) | 5 | 6 |
| Kecepatan | Lebih lambat | Lebih cepat |
| Ngubah datamu? | Iya (bisa ngurangin baris) | Nggak |
Kenapa UNION bisa bikin angka revenue kamu salah?
Karena UNION diam-diam ngehapus baris yang dia kira duplikat, padahal itu penjualan asli. Pas hasil gabungannya kamu jumlahin, revenue dari baris yang kehapus ikut ilang. Total penjualan jadi lebih kecil dari aslinya, dan kamu nggak ada peringatan apa-apa soal ini.
Ini kejadiannya. Owner Keripik Juara mau tau total revenue bulan Juni dari dua channel. Dia gabungin dua tabel pakai UNION terus dijumlahin.
-- SALAH: baris kembar kehapus
SELECT SUM(revenue) AS total FROM (
SELECT tanggal, produk, qty, revenue FROM penjualan_online
UNION
SELECT tanggal, produk, qty, revenue FROM penjualan_offline
);
Hasilnya Rp905.000. Kelihatan wajar, jadi dia percaya aja. Padahal ada satu penjualan offline senilai Rp250.000 yang kehapus, gara-gara datanya kebetulan sama persis sama penjualan online di hari yang sama.
Sekarang versi yang bener, pakai UNION ALL.
-- BENAR: semua penjualan kehitung
SELECT SUM(revenue) AS total FROM (
SELECT tanggal, produk, qty, revenue FROM penjualan_online
UNION ALL
SELECT tanggal, produk, qty, revenue FROM penjualan_offline
);
Hasilnya Rp1.155.000. Selisih Rp250.000 dari versi UNION tadi. Buat toko kecil, salah lapor seperempat juta dalam sebulan itu udah lumayan bikin pusing pas rekonsiliasi.
Yang bikin jebakan ini bahaya: nggak ada error, nggak ada warning. Querynya jalan mulus, angkanya keluar, kelihatan masuk akal. Kamu baru sadar pas nyocokin sama catatan manual dan angkanya beda. Ini salah satu kesalahan umum SQL pemula yang paling susah dikejar, soalnya hasilnya nggak pernah kelihatan salah dari luar.
Kapan pakai UNION dan kapan pakai UNION ALL?
Default-nya pakai UNION ALL. Dia lebih cepat dan nggak diam-diam ngubah datamu. Apalagi kalau kamu lagi ngitung total atau rata-rata, tiap baris harus utuh biar hasilnya bener. Baru pilih UNION kalau kamu emang sengaja mau ilangin baris yang identik, dan yakin duplikat itu bukan data asli yang penting.
Ini panduan cepetnya.
Pakai UNION ALL kalau:
- Kamu mau ngitung total, rata-rata, atau count dari gabungan data. Setiap baris harus utuh biar hitungannya bener.
- Kamu gabungin data yang secara logika pasti beda, misal transaksi dari cabang yang beda-beda.
- Kamu peduli sama performa, apalagi kalau datanya jutaan baris.
Pakai UNION kalau:
- Kamu mau daftar nilai unik, misal daftar nama produk yang pernah kejual di online atau offline, tanpa nama yang dobel.
- Kamu tau ada duplikat beneran dari data yang kepencet dua kali, dan emang mau dibersihin.
Kalau tujuanmu bikin daftar unik, sebenernya SELECT DISTINCT atau GROUP BY sering lebih jelas maksudnya. Buat pola gabung lalu dihitung kayak di atas, kamu bisa lihat contoh lain di artikel subquery SQL yang bahas nyusun query bertingkat.
Kenapa UNION ALL lebih cepat dari UNION?
Karena UNION harus kerja ekstra. Buat ngebuang duplikat, dia mesti nyortir atau nge-hash semua baris dulu, terus banding-bandingin mana yang kembar. UNION ALL ngeloncatin langkah itu sepenuhnya, jadi langsung tempel hasil kedua query tanpa mikir.
Aku tes sendiri di laptop pakai dua tabel masing-masing 300 ribu baris. Pas hasil gabungannya kira-kira sama banyak, UNION jalan sekitar 1,4x lebih lambat dari UNION ALL. Angka pastinya beda-beda tergantung engine, ukuran data, sama ada index apa nggak. Tapi arahnya konsisten: dedup itu ada ongkosnya.
Makin gede datamu, makin kerasa selisihnya. Kalau kamu emang butuh baris unik ya nggak apa-apa bayar ongkos itu. Tapi kalau kamu pakai UNION cuma karena "kebiasaan" padahal nggak butuh dedup, kamu bikin query lambat tanpa alasan.
Aturan main sebelum UNION jalan
Baik UNION maupun UNION ALL punya syarat yang sama, dan kalau nggak dipenuhi querynya bakal error.
Pertama, jumlah kolom di kedua query harus sama. Kalau atas SELECT 2 kolom, bawah juga harus 2 kolom. Nggak boleh timpang.
Kedua, tipe datanya harus nyambung urut kolom. Kolom pertama atas ketemu kolom pertama bawah, dan seterusnya. Jangan sampai kolom angka ketemu kolom tanggal.
Ketiga, nama kolom hasil diambil dari query yang pertama. Jadi kalau mau kasih label kayak sumber, tulis di SELECT paling atas.
SELECT 'online' AS sumber, produk, revenue FROM penjualan_online
UNION ALL
SELECT 'offline' AS sumber, produk, revenue FROM penjualan_offline
ORDER BY produk;
Nambahin kolom sumber kayak gini kebiasaan bagus. Kamu jadi tau tiap baris asalnya dari channel mana, dan kalau ada dua baris identik dari channel beda, keduanya kelihatan jelas, bukan malah kesamar jadi duplikat.
Terakhir, ORDER BY cuma boleh ditaruh sekali di paling bawah, buat ngurutin hasil akhir gabungan. Bukan di tiap query.
Satu catatan dialek: contoh di sini aku tes pakai SQLite, tapi sintaksnya sama persis di PostgreSQL maupun MySQL. UNION dan UNION ALL termasuk SQL standar, jadi jarang beda antar-engine.
UNION bukan JOIN, ya
Ini yang sering ketuker pas awal belajar. UNION numpuk baris ke bawah, JOIN nyambungin kolom ke samping. Beda arah, beda tujuan.
UNION dipakai kalau dua tabelmu punya bentuk kolom yang sama dan kamu mau gabung datanya jadi satu daftar panjang. Contohnya penjualan online sama offline tadi, kolomnya sama, tinggal ditumpuk.
JOIN dipakai kalau kamu mau nyambungin dua tabel yang beda isinya lewat kolom penghubung, misal tabel pesanan disambung ke tabel pelanggan lewat id_pelanggan. Kalau kamu masih bingung soal yang ini, aku udah bahas tuntas di artikel perbedaan JOIN di SQL.
FAQ
UNION vs UNION ALL, mana yang lebih cepat?
UNION ALL lebih cepat. UNION harus nyortir dan ngebuang baris duplikat dulu sebelum ngasih hasil, dan langkah itu makan waktu. UNION ALL ngeloncatin proses dedup, jadi langsung numpuk hasil kedua query. Di tes kecilku dengan 600 ribu baris, UNION sekitar 1,4x lebih lambat. Makin besar data, makin kerasa selisihnya.
Kapan harus pakai UNION ALL, bukan UNION?
Pakai UNION ALL kalau kamu butuh semua baris utuh, terutama pas mau ngitung total, rata-rata, atau count dari data gabungan. Juga pas kamu gabungin data yang secara logika pasti beda, kayak transaksi dari cabang yang berbeda. Intinya kalau kamu nggak sengaja mau ngebuang duplikat, UNION ALL pilihan yang lebih aman dan cepat.
Apakah UNION otomatis ngurutin hasilnya?
Nggak dijamin. Proses ngebuang duplikat kadang bikin urutan baris berubah, tapi itu efek samping, bukan janji. Jangan pernah ngandelin UNION buat ngurutin data. Kalau kamu butuh urutan tertentu, tulis ORDER BY sendiri di baris paling bawah query.
Kenapa query UNION-ku error soal jumlah kolom?
Karena jumlah kolom di query atas dan bawah beda. UNION dan UNION ALL wajib punya jumlah kolom yang sama persis di kedua sisi. Cek lagi SELECT-mu, pastiin dua-duanya narik jumlah kolom yang sama, dengan tipe data yang nyambung urut posisi kolomnya.
Apa bedanya UNION sama JOIN?
UNION numpuk baris dua query jadi satu daftar ke bawah, dan butuh jumlah kolom yang sama. JOIN nyambungin kolom dari dua tabel ke samping lewat kolom penghubung, kayak id_pelanggan. Singkatnya UNION nambah baris, JOIN nambah kolom. Detailnya ada di artikel perbedaan JOIN di SQL.
Tinggal dipraktekin
Intinya cuma tiga. UNION buang duplikat, UNION ALL simpen semua. Buat gabung data lalu dihitung totalnya, pilih UNION ALL biar nggak ada penjualan yang diam-diam kehapus. Dan UNION ALL emang lebih cepat karena ngeloncatin proses dedup.
Bedanya cuma kelihatan pas kamu ngetik querynya sendiri sama data beneran. Coba langsung di NgulikSQL, latihan query gratis tanpa install apa-apa, biar kamu ngerasain sendiri kapan UNION dan UNION ALL kasih hasil yang beda.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel Terkait
SELF JOIN di SQL: Cara Kerja + 5 Contoh Praktis
Self join itu nggabungin satu tabel ke dirinya sendiri. Ini cara kerjanya plus 5 contoh yang udah dites: atasan-bawahan, omzet antar bulan, sampai transaksi duplikat.
SQL untuk Data Analysis: 8 Skill Wajib Sebelum Apply Kerja
Checklist 8 skill SQL yang beneran dipake data analyst tiap hari, lengkap query contoh dan self-test bisa atau nggak. Fokus yang penting dulu, sisanya bisa nyusul.
Sintaks SQL Dasar: Struktur Query yang Wajib Dipahami
Urutan nulis query SQL beda sama urutan database ngejalaninnya. Paham selisih ini bikin error sintaks pemula tiba-tiba masuk akal.