SQL UNION versus UNION ALL: Verschillen, voorbeelden en geteste prestaties
Het verschil tussen beide is één woord, maar als je verkeerd kiest, kun je stilletjes het verkeerde totaal krijgen. Bekijk beide op echte gegevens, leer de regels die ze delen en lees wat er gebeurde toen we ze op een miljoen rijen timeden.
UNIONcombineert resultaten en verwijdert dubbele rijen.UNION ALLbehoudt elke rij.- Het ontdubbelen van kosten werkt, dus
UNION ALLis meestal sneller te berekenen. - Het gebruik van
UNIONvóór eenSUMkan stilletjes echte waarden verwijderen en het verkeerde antwoord geven. - Standaard ingesteld op
UNION ALL, tenzij u specifiek wilt dat duplicaten worden verwijderd.
Beide operators stapelen de resultaten van twee query’s op elkaar, dus SQL UNION versus UNION ALL lijkt misschien een kleine keuze. Dat is het niet. Eén extra woord verandert zowel uw resultaat als hoe hard de database moet werken.
We hebben elke query hier in SQLite 3.50 uitgevoerd, en de weergegeven resultaten en timings zijn afkomstig van die runs. Het basisgedrag is standaard-SQL voor grote databases. De timing zal echter verschillen voor uw eigen database, data en hardware, dus gebruik de onze als voorbeeld.
Het korte antwoord
UNION combineert twee resultaatsets en retourneert alleen afzonderlijke rijen. UNION ALL combineert ze en retourneert alles, inclusief duplicaten. Dat is het hele verschil, en de rest van dit artikel gaat over waarom het ertoe doet.
UNION versus UNION ALLEN naast elkaar
| Aspect | UNIE | UNIE ALLEMAAL |
|---|---|---|
| Dubbele rijen | Verwijderd | Gehouden |
| Extra werk | Moet duplicaten vinden | Geen |
| Gebruikelijke snelheid | Langzamer | Sneller |
| Rijen kwamen terug | Hetzelfde of minder | Allemaal |
| Veilig vóór SUM of COUNT? | Vaak niet | Ja |
| Beste voor | Unieke lijsten | Gegevens, logs, totalen samenvoegen |
De voorbeeldgegevens
Stel je een winkel voor die online en in-store bestellingen in aparte tabellen bijhoudt. Houd er rekening mee dat Asha twee identieke online bestellingen heeft en één identieke bestelling in de winkel.
CREATE TABLE online_orders (customer TEXT, total INT);
CREATE TABLE store_orders (customer TEXT, total INT);
INSERT INTO online_orders VALUES ('Asha',100), ('Ben',200), ('Asha',100);
INSERT INTO store_orders VALUES ('Asha',100), ('Dev',300);
Zie het verschil
SELECT customer, total FROM online_orders
UNION
SELECT customer, total FROM store_orders;
-- Asha | 100
-- Ben | 200
-- Dev | 300
SELECT customer, total FROM online_orders
UNION ALL
SELECT customer, total FROM store_orders;
-- Asha | 100
-- Ben | 200
-- Asha | 100
-- Asha | 100
-- Dev | 300
Vijf invoerrijen werden drie met UNION, en alle vijf bleven bij UNION ALL. Twee dingen om op te merken:
UNIONverwijderde duplicaten uit het hele resultaat, inclusief die in de eerste tabel. Het gaat niet alleen om het vergelijken van tabellen.- Een rij telt alleen als duplicaat als elke geselecteerde kolom overeenkomt.
Als je echt een duidelijke lijst wilt, heeft UNION precies gelijk. Dit geeft elke klant die via een van beide kanalen heeft gekocht:
SELECT customer FROM online_orders
UNION
SELECT customer FROM store_orders;
-- Asha
-- Ben
-- Dev
De fout-totaal bug
Dit is de reden waarom de keuze er echt toe doet. Stel dat u de totale omzet wilt. De bovenstaande bestellingen zijn opgeteld 800. Bekijk wat elke operator geeft:
SELECT SUM(total) FROM (
SELECT total FROM online_orders
UNION
SELECT total FROM store_orders
);
-- 600
SELECT SUM(total) FROM (
SELECT total FROM online_orders
UNION ALL
SELECT total FROM store_orders
);
-- 800
De UNION-versie klopt met 200 niet. Omdat we alleen de kolom total hebben geselecteerd, leken drie afzonderlijke bestellingen van 100 roepie op duplicaten en vielen ze samen in één. Er is geen foutmelding en 600 lijkt een volkomen geloofwaardig getal. Dit soort stille bugs kunnen maanden in een financieel rapport blijven zitten.
Tip: Twee identiek uitziende rijen kunnen twee echte gebeurtenissen zijn. Voordat u UNION gebruikt, moet u zich afvragen of identieke rijen hetzelfde feit betekenen dat tweemaal is vastgelegd, of twee verschillende feiten. Voor verkopen, betalingen en loggegevens is dit meestal de tweede.
Regels die beide moeten volgen
Beide operators hebben dezelfde vereisten:
- Elke
SELECTmoet hetzelfde aantal kolommen retourneren. - Kolommen worden gekoppeld op positie, niet op naam, dus houd ze in dezelfde volgorde.
- Gegevenstypen op elke positie moeten compatibel zijn.
- De namen van de resultaatkolommen komen uit de eerste
SELECT. ORDER BYstaat helemaal aan het einde en is van toepassing op het hele resultaat.
Het overtreden van de eerste regel levert een fout op. Hier is het bericht van SQLite:
SELECT customer, total FROM online_orders
UNION
SELECT customer FROM store_orders;
-- SELECTs to the left and right of UNION do not have
-- the same number of result columns
De tweede regel is gevaarlijker, omdat deze zonder fouten kan mislukken. Als u twee kolommen van hetzelfde type verwisselt, zoals first_name en last_name, wordt de query uitgevoerd en komen de gegevens verkeerd uit. SQLite is ook ontspannen over typen, terwijl databases zoals PostgreSQL strenger zijn en mogelijk een expliciete CAST vereisen.
Label de bron
Een heel praktische truc is om een constante kolom toe te voegen die laat zien waar elke rij vandaan komt. Omdat het label verschilt, kunnen rijen uit verschillende tabellen niet langer als duplicaten van elkaar worden behandeld.
SELECT customer, total, 'online' AS channel FROM online_orders
UNION ALL
SELECT customer, total, 'store' FROM store_orders
ORDER BY customer, channel;
-- Asha | 100 | online
-- Asha | 100 | online
-- Asha | 100 | store
-- Ben | 200 | online
-- Dev | 300 | store
Zodra uw gegevens een label hebben, kunt u deze groeperen om verkopen per kanaal te rapporteren met behulp van GROUP BY. Als je meerdere stappen moet combineren, wikkel de unie dan in een CTE om deze leesbaar te houden.
Prestaties: wat er in onze test is gebeurd
Om duplicaten te verwijderen, moet de database rijen vergelijken, meestal door ze te sorteren of te hashen. UNION ALL kan deze stap overslaan. We hebben twee tabellen gemaakt met elk 500.000 rijen, met willekeurige getallen van 0 tot 50.000, dus er waren veel duplicaten. We hebben elke zoekopdracht meerdere keren uitgevoerd en de beste tijd behouden.
Eerst telden we de resultaten, zodat de tijd die besteed werd aan het terugsturen van rijen naar ons programma geen invloed had op de vergelijking:
| Zoekopdracht, verpakt in COUNT(*) | Rijen | Beste tijd |
|---|---|---|
| UNIE | 50,001 | 261 ms |
| UNIE ALLEMAAL | 1,000,000 | Minder dan 1 ms |
Het enorme verschil komt deels doordat SQLite dat aantal kan berekenen zonder elke rij te lezen, dus lees dat alsjeblieft niet als “duizenden keren sneller”. Het laat echter wel het kernidee zien: UNION moest echt werk doen en UNION ALL niet.
Vervolgens hebben we alle rijen in Python opgehaald en het resultaat is omgedraaid:
| Query, waarbij alle rijen worden opgehaald | Rijen kwamen terug | Beste tijd |
|---|---|---|
| UNIE | 50,001 | 277 ms |
| UNIE ALLEMAAL | 1,000,000 | 392 ms |
Hier duurde UNION ALL langer omdat het twintig keer zoveel rijen opleverde. Het is niet deduplicatie die dit heeft vertraagd. Het verwerken van een miljoen rijen was dat wel. De eerlijke regel is dus dat UNION ALL goedkoper is voor de database om te berekenen, maar de grootte van het resultaat is ook van belang. Veel online grafieken reduceren dit tot “UNION ALL is altijd sneller”, en onze test laat zien waarom dit niet zo eenvoudig is.
Kies ook niet alleen op basis van snelheid. Kies eerst de operator die het juiste antwoord geeft en stem vervolgens af. Als een zoekopdracht traag is, lees dan onze handleiding over SQL-queryoptimalisatie.
Wanneer moet u ze allemaal gebruiken?
Gebruik UNION ALL wanneer:
- U voegt gegevens uit vergelijkbare tabellen samen, zoals maandpartities.
- Achteraf berekent u totalen of tellingen.
- Je weet dat de inputs elkaar niet kunnen overlappen.
- Duplicaten zijn betekenisvol, zoals in logboeken of auditrecords.
Gebruik UNION wanneer:
- U hebt een unieke lijst nodig, zoals elk e-mailadres op twee systemen.
- Overlappende bronnen bevatten meer dan eens hetzelfde feit.
Behandel UNION ALL als standaard en gebruik UNION bewust. Het toevoegen van een WHERE-clausule aan elke vertakking, om vroegtijdig te filteren, helpt beide.
SNIJDEN en BEHALVE
Twee gerelateerde set-operatoren beantwoorden verschillende vragen. Beide volgen dezelfde kolomregels:
SELECT customer FROM online_orders
INTERSECT
SELECT customer FROM store_orders;
-- Asha (bought in both channels)
SELECT customer FROM online_orders
EXCEPT
SELECT customer FROM store_orders;
-- Ben (online only)
Oracle heeft traditioneel MINUS gebruikt in plaats van EXCEPT, en de ondersteuning voor deze operators varieert enigszins per database en versie.
UNION versus JOIN
Deze zijn vaak verward, maar ze combineren gegevens in verschillende richtingen:
| Operatie | Richting | Resultaat |
|---|---|---|
| UNIE | Verticaal | Voegt meer rijen toe |
| DOE MEE | Horizontaal | Voegt meer kolommen toe |
Veel voorkomende fouten
- Uit gewoonte gebruik je UNION. Het kan je snelheid kosten of geldige rijen verwijderen.
- Als u te weinig kolommen selecteert. Als u een ID weglaat, zien afzonderlijke rijen er identiek uit.
- Niet-overeenkomende kolomvolgorde. Waarden kunnen zonder fouten in de verkeerde kolom terechtkomen.
- ORDER BY toevoegen aan elke tak. Sorteer één keer aan het einde.
- Gebruik UNION om een slechte join te herstellen. Als er duplicaten verschijnen vanwege een join, repareer dan de join.
- Uitgaande van de resultaatvolgorde. Zonder
ORDER BYkan de rijvolgorde voor geen van beide operators worden gegarandeerd.
Tot slot
Stel elke keer één vraag: zijn identieke rijen hetzelfde feit of afzonderlijke feiten? Als ze gescheiden zijn, of als overlap onmogelijk is, gebruik dan UNION ALL. Als je een unieke lijst nodig hebt, gebruik dan UNION. Om uw eigen rapporten te controleren, zoekt u in uw code naar UNION in de buurt van een SUM of COUNT en bevestigt u dat deze totalen echt kloppen.
Veelgestelde vragen
Wat is het verschil tussen UNION en UNION ALL?
UNION combineert twee resultaatsets en verwijdert dubbele rijen. UNION ALL combineert ze en bewaart elke rij, inclusief duplicaten.
Wat is sneller, UNION of UNION ALL?
UNION ALL is meestal goedkoper om te berekenen, omdat er niet op duplicaten wordt gecontroleerd. Het retourneren van een veel groter resultaat kan over het algemeen nog steeds langer duren, zoals uit onze test bleek.
Verwijdert UNION duplicaten binnen één tabel?
Ja. Het verwijdert duplicaten uit het gehele gecombineerde resultaat, inclusief identieke rijen die allemaal uit dezelfde tabel kwamen.
Moeten kolomnamen overeenkomen in een UNION?
Nee. Kolommen worden op positie gematcht en het resultaat gebruikt namen uit de eerste SELECT. Het aantal kolommen moet overeenkomen en de typen moeten compatibel zijn.
Kan ik ORDER BY gebruiken met UNION?
Ja, maar plaats een ORDER BY helemaal aan het einde van de verklaring. Het sorteert het volledige gecombineerde resultaat in plaats van een enkele vertakking.
Blijf leren
Hulp nodig met testen, WordPress of SEO?
We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen
AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…
Lees artikel →DevOpsOmgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan
Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…
Lees artikel →SoftwareontwikkelingAPI-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten
API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…
Lees artikel →TestautomatiseringSpotten in Python: unittest.mock, patch en de fouten die tests doen liegen
Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…
Lees artikel →SoftwaretestenCodedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent
Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…
Lees artikel →Databases & SQLDELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken
DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…
Lees artikel →Databases & SQLSQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden
SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…
Lees artikel →SoftwareontwikkelingTypeScript-interface versus type: echte verschillen, getest met de compiler
TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…
Lees artikel →SoftwareontwikkelingPython *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden
Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…
Lees artikel →SoftwareontwikkelingPython Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken
Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…
Lees artikel →Kunstmatige intelligentieWat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren
Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…
Lees artikel →DevOpsMonitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen
Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…
Lees artikel →DevOpsDocker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier
Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…
Lees artikel →TestautomatiseringTDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt
TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…
Lees artikel →SoftwaretestenGebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden
Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…
Lees artikel →Databases & SQLSQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen
SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…
Lees artikel →Databases & SQLSQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten
SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…
Lees artikel →SoftwareontwikkelingWat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld
Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…
Lees artikel →SoftwareontwikkelingJavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden
De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…
Lees artikel →SoftwareontwikkelingPython-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden
Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …
Lees artikel →Kunstmatige intelligentieWat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd
Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…
Lees artikel →DevOpsImplementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen
Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…
Lees artikel →TestautomatiseringSchilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen
Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…
Lees artikel →SoftwaretestenBelastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden
Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …
Lees artikel →SoftwaretestenTestcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken
Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…
Lees artikel →Databases & SQLOptimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing
Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…
Lees artikel →Databases & SQLSQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties
SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…
Lees artikel →SoftwareontwikkelingJavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs
Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…
Lees artikel →SoftwareontwikkelingPython-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden
Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…
Lees artikel →SoftwareontwikkelingPython-klassen en -objecten: OOP-zelfstudie met echte voorbeelden
Python-klassen en -objecten uitgelegd met code die we hebben uitgevoerd: __init__, methoden, klasse versus instantie-attributen, overerving, eigensc…
Lees artikel →Kunstmatige intelligentieWat is een groot taalmodel? Hoe LLM's werken, uitgelegd zonder de hype
Wat is een groot taalmodel? LLM's uitgelegd in duidelijke taal: tokens, inbedding, aandacht, training, temperatuur- en contextvensters, een kleine d…
Lees artikel →DevOpsLinux-opdrachten voor beginners: de essentiële terminalgids met voorbeelden
Linux-opdrachten voor beginners, gegroepeerd op taak: navigatie, bestanden, logboeken bekijken, grep, pipelines, machtigingen, processen en archieve…
Lees artikel →SoftwareontwikkelingGit merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt
Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.
Lees artikel →SoftwareontwikkelingPython list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt
Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.
Lees artikel →Databases & SQLSQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)
Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.
Lees artikel →