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.