Problem:
Du vill visa data från givna kolumner (av liknande datatyp) från två tabeller i SQL.
Exempel:
Det finns två tabeller i vår databas:employee
och customer
.
employee
Tabellen innehåller data i följande kolumner:id , förnamn , efternamn och ålder .
id | förnamn | efternamn | ålder |
---|---|---|---|
1 | Tom | Miller | 22 |
2 | John | Smith | 26 |
3 | Lisa | Williams | 30 |
4 | Charles | Davis | 21 |
5 | James | Moore | 22 |
customer
Tabellen innehåller data i följande kolumner:id , förnamn , efternamn och ålder .
id | förnamn | efternamn | ålder |
---|---|---|---|
1 | Milano | Smith | 45 |
2 | Charles | Davis | 21 |
3 | Markera | Backare | 19 |
Låt oss i en resultatuppsättning visa förnamn, efternamn och ålder för alla personer i databasen, både anställda och kunder.
Lösning 1:
Vi använder UNION ALL
för att sammanfoga data från kolumner i två tabeller.
Här är frågan du skulle skriva:
SELECT first_name, last_name, age FROM employee UNION ALL SELECT first_name, last_name, age FROM customer;
Här är resultatet:
förnamn | efternamn | ålder |
---|---|---|
Tom | Miller | 22 |
John | Smith | 26 |
Lisa | Williams | 30 |
Charles | Davis | 21 |
James | Moore | 28 |
Milano | Smith | 45 |
Charles | Davis | 21 |
Markera | Backare | 19 |
Diskussion:
Använd UNION ALL-satsen för att sammanfoga data från kolumner i två eller flera tabeller. I vårt exempel sammanfogar vi data från employee
och customer
tabeller. Till vänster om nyckelordet UNION ALL, sätt den första SELECT-satsen för att hämta data från den första tabellen (i vårt exempel, tabellen employee
). Till höger, använd en annan SELECT-sats för att hämta data från den andra tabellen (i vårt exempel, customer
).
Kom ihåg att vald data i båda tabellerna måste vara av samma datatyp i varje kolumn. Till exempel, om den första kolumnen i den första SELECT är en strängdatatyp, måste den första kolumnen i den andra SELECT också vara en strängdatatyp. Om den andra kolumnen i den första SELECT-satsen är ett heltal, måste den andra kolumnen i den andra tabellen också vara en heltalstyp.
I den första frågan valde vi ålder (åldern på den anställde, vilket är en heltalsdatatyp) för den tredje kolumnen. Därför är den tredje kolumnen i den andra SELECT också ett heltalsvärde; det är åldern av kunden.
De andra kolumnerna i båda SELECT-satserna är av samma datatyp. Men om värdena är desamma i båda tabellerna kommer de att visas flera gånger; till exempel visas 'Charles Davis 21' två gånger i resultatuppsättningen.
Vad händer om du inte vill ha flera identiska poster i resultattabellen? I det här fallet använder du UNION
. Det liknar UNION ALL
, men det tar bort dubbletter av poster. Titta på följande exempel.
Lösning 2:
Här är frågan som undviker dubbletter av poster:
SELECT first_name, last_name FROM employee UNION SELECT first_name, last_name FROM customer;
Här är resultatet av ovanstående fråga:
förnamn | efternamn |
---|---|
Markera | Backare |
James | Moore |
John | Smith |
Charles | Davis |
Milano | Smith |
Tom | Miller |
Lisa | Williams |
Obs!
UNION ALL
är snabbare än UNION
, men UNION
tar bort dubbletter av rader. Valet beror på vilken resultatdata vi behöver.