Podzapytania w MySQL

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ń:

  1. Zagnieżdżenie: Podzapytania są umieszczane w nawiasach i wykonywane jako pierwsze.
  2. Kontekst: Wynik podzapytania jest używany przez zapytanie nadrzędne.
  3. 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ż');