Podzapytania to instrukcje SQL zagnieżdżone wewnątrz innych instrukcji SQL. Są one wykonywane w celu uzyskania danych, które są następnie używane przez zapytanie główne. Mogą być stosowane w klauzulach takich jak WHERE, FROM, SELECT, czy HAVING.
Główne cechy podzapytań:
- Zagnieżdżenie: Podzapytania są umieszczane w nawiasach i wykonywane jako pierwsze.
- Kontekst: Wynik podzapytania jest używany przez zapytanie nadrzędne.
- Rodzaje:
- Podzapytania skorelowane: Odwołują się do kolumn z zapytania głównego i są wykonywane wielokrotnie.
- Podzapytania nieskorelowane: Są wykonywane raz, a wynik jest używany w zapytaniu głównym.
Przykład 1: Podzapytanie w klauzuli WHERE
Chcemy znaleźć produkty, które należą do kategorii o nazwie „Elektronika”.
SELECT nazwa_produktu
FROM produkty
WHERE id_kategorii = (
SELECT id_kategorii
FROM kategorie
WHERE nazwa_kategorii = 'Elektronika'
);
Przykład 2: Podzapytanie w klauzuli FROM
Podzapytanie może być użyte jako tymczasowa tabela.
SELECT AVG(wynagrodzenie) AS srednia_pensja
FROM (
SELECT wynagrodzenie
FROM pracownicy
WHERE dzial = 'IT'
) AS tabela_tymczasowa;
Przykład 3: Podzapytanie skorelowane
Znajdź pracowników, których wynagrodzenie jest większe od średniej w ich dziale.
SELECT imie, nazwisko, wynagrodzenie
FROM pracownicy p1
WHERE wynagrodzenie > (
SELECT AVG(wynagrodzenie)
FROM pracownicy p2
WHERE p1.dzial = p2.dzial
);
Ćwiczenia dla uczniów
Ćwiczenie 1: Podzapytanie w WHERE
Znajdź nazwy produktów, których cena jest wyższa od średniej ceny w tabeli produkty.
Ćwiczenie 2: Podzapytanie w SELECT
Wyświetl listę kategorii i liczby produktów w każdej z nich, używając podzapytania w klauzuli SELECT.
Ćwiczenie 3: Podzapytanie skorelowane
Znajdź pracowników, którzy zarabiają więcej niż średnia w dziale, do którego należą.
Ćwiczenie 4: Podzapytanie w FROM
Oblicz średnie wynagrodzenie dla każdego działu, używając podzapytania w klauzuli FROM.
Kod tworzący tabele i dane
Tabela produkty
CREATE TABLE produkty (
id_produktu INT AUTO_INCREMENT PRIMARY KEY,
nazwa_produktu VARCHAR(50),
cena DECIMAL(10, 2),
id_kategorii INT
);
INSERT INTO produkty (nazwa_produktu, cena, id_kategorii) VALUES
('Laptop', 2500.00, 1),
('Smartfon', 1200.00, 1),
('Lodówka', 2000.00, 2),
('Pralka', 1500.00, 2),
('Telewizor', 3000.00, 1);
Tabela kategorie
CREATE TABLE kategorie (
id_kategorii INT AUTO_INCREMENT PRIMARY KEY,
nazwa_kategorii VARCHAR(50)
);
INSERT INTO kategorie (nazwa_kategorii) VALUES
('Elektronika'),
('AGD');
Tabela pracownicy
CREATE TABLE pracownicy (
id_pracownika INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50),
nazwisko VARCHAR(50),
wynagrodzenie DECIMAL(10, 2),
dzial VARCHAR(50)
);
INSERT INTO pracownicy (imie, nazwisko, wynagrodzenie, dzial) VALUES
('Jan', 'Kowalski', 5000, 'IT'),
('Anna', 'Nowak', 4000, 'HR'),
('Tomasz', 'Zalewski', 5500, 'IT'),
('Karolina', 'Wiśniewska', 4500, 'HR'),
('Marek', 'Jankowski', 6000, 'Sprzedaż');