Problem:
Chcesz wyświetlić dane z podanych kolumn (podobnego typu danych) z dwóch tabel w SQL.
Przykład:
W naszej bazie danych znajdują się dwie tabele:employee i customer .
employee tabela zawiera dane w następujących kolumnach:id , imię , nazwisko i wiek .
| id | imię | nazwisko | wiek |
|---|---|---|---|
| 1 | Tomek | Młynarz | 22 |
| 2 | Jan | Kowalski | 26 |
| 3 | Lisa | Williams | 30 |
| 4 | Karol | Davis | 21 |
| 5 | James | Moore | 22 |
customer tabela zawiera dane w następujących kolumnach:id , imię , nazwisko i wiek .
| id | imię | nazwisko | wiek |
|---|---|---|---|
| 1 | Mediolan | Kowalski | 45 |
| 2 | Karol | Davis | 21 |
| 3 | Zaznacz | Zwolennik | 19 |
W jednym zestawie wyników wyświetlmy imię, nazwisko i wiek wszystkich osób w bazie danych, zarówno pracowników, jak i klientów.
Rozwiązanie 1:
Użyjemy UNION ALL połączyć dane z kolumn w dwóch tabelach.
Oto zapytanie, które napiszesz:
SELECT first_name, last_name, age FROM employee UNION ALL SELECT first_name, last_name, age FROM customer;
Oto wynik:
| imię | nazwisko | wiek |
|---|---|---|
| Tomek | Młynarz | 22 |
| Jan | Kowalski | 26 |
| Liza | Williams | 30 |
| Karol | Davis | 21 |
| James | Moore | 28 |
| Mediolan | Kowalski | 45 |
| Karol | Davis | 21 |
| Zaznacz | Zwolennik | 19 |
Dyskusja:
Użyj klauzuli UNION ALL, aby połączyć dane z kolumn w co najmniej dwóch tabelach. W naszym przykładzie łączymy dane od employee i customer tabele. Po lewej stronie słowa kluczowego UNION ALL umieść pierwszą instrukcję SELECT, aby pobrać dane z pierwszej tabeli (w naszym przykładzie tabela employee ). Po prawej stronie użyj innej instrukcji SELECT, aby pobrać dane z drugiej tabeli (w naszym przykładzie customer ).
Pamiętaj, że wybrane dane w obu tabelach muszą być tego samego typu w każdej kolumnie. Na przykład, jeśli pierwsza kolumna w pierwszej kolumnie SELECT jest typem danych typu string, pierwsza kolumna drugiej kolumny SELECT również musi być typem danych typu string. Jeśli druga kolumna w pierwszej instrukcji SELECT jest liczbą całkowitą, druga kolumna w drugiej tabeli również musi być liczbą całkowitą.
W pierwszym zapytaniu wybraliśmy wiek (wiek pracownika, który jest typem danych całkowitych) dla trzeciej kolumny. Dlatego trzecia kolumna w drugiej kolumnie SELECT jest również wartością całkowitą; to wiek klienta.
Drugie kolumny w obu instrukcjach SELECT mają ten sam typ danych. Jeśli jednak wartości w obu tabelach są takie same, będą wyświetlane wielokrotnie; na przykład „Charles Davis 21” jest wyświetlany dwukrotnie w zestawie wyników.
Co zrobić, jeśli nie chcesz wielu identycznych rekordów w tabeli wyników? W takim przypadku użyj UNION . Jest podobny do UNION ALL , ale usuwa zduplikowane rekordy. Spójrz na następujący przykład.
Rozwiązanie 2:
Oto zapytanie, które pozwala uniknąć zduplikowanych rekordów:
SELECT first_name, last_name FROM employee UNION SELECT first_name, last_name FROM customer;
Oto wynik powyższego zapytania:
| imię | nazwisko |
|---|---|
| Zaznacz | Zwolennik |
| James | Moore |
| Jan | Kowalski |
| Karol | Davis |
| Mediolan | Kowalski |
| Tomek | Młynarz |
| Liza | Williams |
Uwaga:
UNION ALL jest szybszy niż UNION , ale UNION usuwa zduplikowane wiersze. Wybór zależy od potrzebnych nam danych wynikowych.