Łączenie zapytań słowem kluczowym UNION/UNION ALL

Lekcja: Łączenie wyników zapytań słowami kluczowymi UNION i UNION ALL w MySQL


1. Wprowadzenie

W MySQL słowa kluczowe UNION i UNION ALL umożliwiają łączenie wyników dwóch lub więcej zapytań SQL w jeden zestaw wyników. Są one przydatne, gdy dane są przechowywane w różnych tabelach, ale chcemy połączyć je w jednym wyniku.


2. Różnica między UNION i UNION ALL

  • UNION: Łączy wyniki zapytań i automatycznie usuwa duplikaty. W wyniku otrzymamy unikalne wiersze.
  • UNION ALL: Łączy wyniki zapytań bez usuwania duplikatów. Wynik może zawierać powtarzające się wiersze.

Uwaga: W obu przypadkach liczba kolumn i ich typy muszą być zgodne w łączonych zapytaniach.


3. Składnia

-- UNION
SELECT kolumna1, kolumna2 FROM tabela1
UNION
SELECT kolumna1, kolumna2 FROM tabela2;

-- UNION ALL
SELECT kolumna1, kolumna2 FROM tabela1
UNION ALL
SELECT kolumna1, kolumna2 FROM tabela2;

4. Przykłady

Przykład 1: Łączenie danych z dwóch tabel

Mamy dwie tabele: pracownicy i kontrahenci, zawierające dane o osobach. Chcemy połączyć imiona i nazwiska wszystkich osób.

SELECT imie, nazwisko FROM pracownicy
UNION
SELECT imie, nazwisko FROM kontrahenci;
Przykład 2: Porównanie UNION i UNION ALL

Gdy dane są zduplikowane:

SELECT 'Jan' AS imie, 'Kowalski' AS nazwisko
UNION
SELECT 'Jan', 'Kowalski';

-- Wynik (UNION): Jeden wiersz

SELECT 'Jan' AS imie, 'Kowalski' AS nazwisko
UNION ALL
SELECT 'Jan', 'Kowalski';

-- Wynik (UNION ALL): Dwa wiersze
Przykład 3: Łączenie tabel z różnymi warunkami

Chcemy połączyć listę pracowników z działu IT oraz listę kontrahentów z miasta "Warszawa".

SELECT imie, nazwisko FROM pracownicy WHERE dzial = 'IT'
UNION
SELECT imie, nazwisko FROM kontrahenci WHERE miasto = 'Warszawa';

Zadania dla uczniów

1. Tabele do ćwiczeń

Tworzenie tabel i wstawianie danych:

-- Tabela: pracownicy
CREATE TABLE pracownicy (
    id INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50),
    dzial VARCHAR(50),
    pensja DECIMAL(10, 2)
);

INSERT INTO pracownicy (imie, nazwisko, dzial, pensja) VALUES
('Jan', 'Kowalski', 'IT', 6000.00),
('Anna', 'Nowak', 'Marketing', 4500.00),
('Piotr', 'Wiśniewski', 'IT', 7000.00),
('Katarzyna', 'Zielińska', 'Sprzedaż', 5000.00),
('Marek', 'Jankowski', 'HR', 4000.00);

-- Tabela: kontrahenci
CREATE TABLE kontrahenci (
    id INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50),
    miasto VARCHAR(50)
);

INSERT INTO kontrahenci (imie, nazwisko, miasto) VALUES
('Jan', 'Kowalski', 'Warszawa'),
('Anna', 'Nowak', 'Kraków'),
('Tomasz', 'Lis', 'Warszawa'),
('Piotr', 'Wiśniewski', 'Gdańsk'),
('Monika', 'Adamska', 'Poznań');

2. Zadania

Zadanie 1
Wyświetl listę unikalnych imion i nazwisk wszystkich pracowników i kontrahentów.

Zadanie 2
Wyświetl listę imion i nazwisk wszystkich pracowników i kontrahentów, uwzględniając możliwe duplikaty.

Zadanie 3
Wyświetl listę unikalnych imion i nazwisk pracowników działu IT oraz kontrahentów z miasta "Warszawa".

Zadanie 4
Stwórz zapytanie, które wyświetli imiona i nazwiska wszystkich pracowników oraz kontrahentów, których nazwiska zaczynają się na literę "W".

Zadanie 5
Wyświetl listę wszystkich imion i nazwisk, dodając etykietę kolumny "Typ" z wartością "Pracownik" lub "Kontrahent", w zależności od źródła danych.


Podsumowanie

  • UNION pozwala na usunięcie duplikatów, a UNION ALL zachowuje wszystkie wiersze.
  • Można łączyć dane z różnych tabel pod warunkiem zgodności liczby i typu kolumn.
  • Te techniki są użyteczne w sytuacjach, gdy dane muszą być agregowane z różnych źródeł.