Wybieranie części ze zbioru zapytań słowem kluczowym EXCEPT

Lekcja: Łączenie wyników zapytań za pomocą EXCEPT w MySQL


1. Wprowadzenie

Słowo kluczowe EXCEPT w SQL umożliwia uzyskanie różnicy między wynikami dwóch zapytań. Oznacza to, że zwraca te wiersze z pierwszego zapytania, które nie występują w wynikach drugiego zapytania. Jest to analogiczne do operacji różnicy zbiorów w matematyce.


2. Kluczowe cechy EXCEPT

  • Usuwa duplikaty: Domyślnie zwraca tylko unikalne wiersze obecne w pierwszym zapytaniu, ale nie w drugim.
  • Zasady zgodności:
    • Oba zapytania muszą zwracać tę samą liczbę kolumn.
    • Typy danych w odpowiadających sobie kolumnach muszą być kompatybilne.

3. Składnia

SELECT kolumna1, kolumna2 FROM tabela1
EXCEPT
SELECT kolumna1, kolumna2 FROM tabela2;

4. Przykłady

Przykład 1: Pracownicy niebędący kontrahentami

Chcemy znaleźć osoby, które są pracownikami, ale nie są kontrahentami.

SELECT imie, nazwisko FROM pracownicy
EXCEPT
SELECT imie, nazwisko FROM kontrahenci;
Przykład 2: Miasta pracowników, które nie pokrywają się z miastami kontrahentów

Znajdź miasta, w których są pracownicy, ale nie ma w nich kontrahentów.

SELECT miasto FROM pracownicy
EXCEPT
SELECT miasto FROM kontrahenci;
Przykład 3: Pracownicy spoza działu IT

Znajdź wszystkich pracowników, którzy nie pracują w dziale IT.

SELECT imie, nazwisko FROM pracownicy
EXCEPT
SELECT imie, nazwisko FROM pracownicy WHERE dzial = 'IT';

Ćwiczenia 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),
    miasto VARCHAR(50)
);

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

-- 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', 'Białystok'),
('Piotr', 'Wiśniewski', 'Gdańsk'),
('Monika', 'Adamska', 'Poznań');

2. Zadania

Zadanie 1
Znajdź osoby, które są pracownikami, ale nie są kontrahentami (imiona i nazwiska).


Zadanie 2
Znajdź miasta, w których są pracownicy, ale nie ma w nich kontrahentów.


Zadanie 3
Znajdź pracowników, którzy pracują w działach innych niż HR i IT.


Zadanie 4
Znajdź pracowników, którzy zarabiają mniej niż 5000 zł, ale jednocześnie nie należą do działu Marketing.


Zadanie 5
Znajdź kontrahentów, którzy nie mieszkają w mieście, w którym znajduje się siedziba żadnego z pracowników.


Podsumowanie

  • EXCEPT zwraca wiersze obecne w wyniku pierwszego zapytania, które nie występują w wyniku drugiego zapytania.
  • Jest przydatne, gdy potrzebujemy zidentyfikować różnice między zbiorami danych.
  • Wymaga zgodności liczby i typów kolumn w obu zapytaniach.