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.