Probleem:
U wilt gegevens uit bepaalde kolommen (van een vergelijkbaar gegevenstype) uit twee tabellen in SQL weergeven.
Voorbeeld:
Er zijn twee tabellen in onze database:employee
en customer
.
De employee
tabel bevat gegevens in de volgende kolommen:id , voornaam , achternaam , en leeftijd .
id | voornaam | achternaam | leeftijd |
---|---|---|---|
1 | Tom | Miller | 22 |
2 | Jan | Smith | 26 |
3 | Lisa | Willems | 30 |
4 | Charles | Davis | 21 |
5 | James | Moore | 22 |
De customer
tabel bevat gegevens in de volgende kolommen:id , voornaam , achternaam , en leeftijd .
id | voornaam | achternaam | leeftijd |
---|---|---|---|
1 | Milaan | Smith | 45 |
2 | Charles | Davis | 21 |
3 | Markeren | Backer | 19 |
Laten we in één resultatenset de voornaam, achternaam en leeftijd weergeven voor alle mensen in de database, zowel werknemers als klanten.
Oplossing 1:
We gebruiken UNION ALL
om gegevens uit kolommen in twee tabellen samen te voegen.
Dit is de vraag die je zou schrijven:
SELECT first_name, last_name, age FROM employee UNION ALL SELECT first_name, last_name, age FROM customer;
Dit is het resultaat:
voornaam | achternaam | leeftijd |
---|---|---|
Tom | Miller | 22 |
Jan | Smith | 26 |
Lisa | Willems | 30 |
Charles | Davis | 21 |
James | Moore | 28 |
Milaan | Smith | 45 |
Charles | Davis | 21 |
Markeren | Backer | 19 |
Discussie:
Gebruik de clausule UNION ALL om gegevens uit kolommen in twee of meer tabellen samen te voegen. In ons voorbeeld voegen we gegevens samen van de employee
en customer
tafels. Plaats aan de linkerkant van het UNION ALL-sleutelwoord de eerste SELECT-instructie om gegevens uit de eerste tabel te halen (in ons voorbeeld de tabel employee
). Gebruik aan de rechterkant een andere SELECT-instructie om gegevens uit de tweede tabel te halen (in ons voorbeeld customer
).
Onthoud dat de geselecteerde gegevens in beide tabellen in elke kolom van hetzelfde gegevenstype moeten zijn. Als de eerste kolom in de eerste SELECT bijvoorbeeld een tekenreeksgegevenstype is, moet de eerste kolom in de tweede SELECT ook een tekenreeksgegevenstype zijn. Als de tweede kolom in de eerste SELECT-instructie een geheel getal is, moet de tweede kolom in de tweede tabel ook een geheel getal zijn.
In de eerste query selecteerden we leeftijd (de leeftijd van de werknemer, wat een geheel getal is) voor de derde kolom. Daarom is de derde kolom in de tweede SELECT ook een geheel getal; het is de leeftijd van de klant.
De tweede kolommen in beide SELECT-instructies zijn van hetzelfde gegevenstype. Als de waarden in beide tabellen echter hetzelfde zijn, worden ze meerdere keren weergegeven; 'Charles Davis 21' wordt bijvoorbeeld twee keer weergegeven in de resultatenset.
Wat als u niet meerdere identieke records in de resultatentabel wilt? Gebruik in dit geval UNION
. Het is vergelijkbaar met UNION ALL
, maar het verwijdert dubbele records. Bekijk het volgende voorbeeld.
Oplossing 2:
Dit is de zoekopdracht die dubbele records vermijdt:
SELECT first_name, last_name FROM employee UNION SELECT first_name, last_name FROM customer;
Dit is het resultaat van de bovenstaande vraag:
voornaam | achternaam |
---|---|
Mark | Backer |
James | Moore |
Jan | Smith |
Charles | Davis |
Milaan | Smith |
Tom | Miller |
Lisa | Willems |
Opmerking:
UNION ALL
is sneller dan UNION
, maar UNION
verwijdert dubbele rijen. De keuze hangt af van de resultaatgegevens die we nodig hebben.